⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bsview.cpp

📁 本文介绍了数字图像处理与模式识别在交通的应用领域及其重要意义
💻 CPP
字号:
// bsView.cpp : implementation of the CBsView class
//

#include "stdafx.h"
#include "bs.h"

#include "bsDoc.h"
#include "bsView.h"
#include "Dib.h"
#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CBsView

IMPLEMENT_DYNCREATE(CBsView, CView)

BEGIN_MESSAGE_MAP(CBsView, CView)
	//{{AFX_MSG_MAP(CBsView)
	
	ON_COMMAND(ID_OPERATE, OnOperate)
	ON_COMMAND(ID_FILE_OPENB, OnFileOpenb)
	ON_COMMAND(ID_FILE_OPENO, OnFileOpeno)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBsView construction/destruction
#define WIDTH(bytes)		(((bytes*8+31)/32)*4)
#define WIDETHBYTES(i)   ((i+31)/32*4)


CBsView::CBsView()
{
	// TODO: add construction code here
	valid=false;
}

CBsView::~CBsView()
{
}

BOOL CBsView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CBsView drawing

void CBsView::OnDraw(CDC* pDC)
{
	CBsDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	if(valid)
	{
	int m_scale=1;//控制缩放比例 
	BYTE *pBmpData=dib->GetData();
    LPBITMAPINFO pBmpInfo=dib->GetInfo();
	int bmpHeight=dib->GetHeight();
    int bmpWidth=dib->GetWidth();
	int scaleHeight=(int)(m_scale*bmpHeight);
	int scaleWidth=(int)(m_scale*bmpWidth);
	if(dib->GetRGB())
	{
		CPalette *hPalette=dib->CreateBmpPalette();
		CPalette *hOldPalette=pDC->SelectPalette(hPalette,true);
		pDC->RealizePalette();
		::StretchDIBits(pDC->GetSafeHdc(),0,0,scaleWidth,scaleHeight,0,0,bmpWidth,bmpHeight,
			pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);
		pDC->SelectPalette(hOldPalette,true);
		::DeleteObject(hPalette);
	}
	::StretchDIBits(pDC->GetSafeHdc(),0,0,scaleWidth,scaleHeight,0,0,bmpWidth,bmpHeight,
			pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);
	}
}
/////////////////////////////////////////////////////////////////////////////
// CBsView printing

BOOL CBsView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CBsView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CBsView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CBsView diagnostics

#ifdef _DEBUG
void CBsView::AssertValid() const
{
	CView::AssertValid();
}

void CBsView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CBsDoc* CBsView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBsDoc)));
	return (CBsDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CBsView message handlers


/*void CBsView::Sub(LPBYTE p_data,  LPBYTE p_dataBK,int wide,int height,int bitcount)
{
	int i,j,k,wh;
	LPBYTE lpSrc[3];//原图像像素指针
	LPBYTE lpDst[3];//目标像素指针
	LPBYTE lpSrcBK[3];//背景像素指针
	wh=WIDETHBYTES(wide*bitcount);
	LPBYTE temp=new BYTE[height*wh];//新图像缓冲区
	memset(temp,255,height*wh);//初始化新分配的内存为255

	
	for(j=0;j<height;j++)//进行每个像素的减运算
	{
		for(i=0;i<wh/3;i++)
		  //获得原像素指针
		{
			for(k=0;k<3;k++)
			{
			lpSrc[k]=p_data+(wh*j+i*3+k);
			//获得目标像素指针
			lpDst[k]=temp+(wh*j+i*3+k);
			//获得背景像素指针
			lpSrcBK[k]=p_dataBK+(wh*j+i*3+k);
			
			}
		//进行减运算

			if(fabs(*lpSrc[0]-*lpSrcBK[0])<25&&fabs(*lpSrc[1]-*lpSrcBK[1])<25&&fabs(*lpSrc[2]-*lpSrcBK[2])<25)
			{	*lpDst[0]=0;
				*lpDst[1]=0;
				*lpDst[2]=0;
			}
			else
			{   *lpDst[0]=255;
			    *lpDst[1]=255;
				*lpDst[2]=255;
			}

			}
		}
	
	memcpy(p_data,temp,height*wh);//复制处理后的图像
	delete temp;
}*/
void CBsView::Sub(BYTE *p_data,  BYTE *p_dataBK,int wide,int height,DWORD size)
{
	int i,j,r;
	LPBYTE lpSrc;//原图像像素指针
	LPBYTE lpDst=new BYTE[size];//目标像素指针
	LPBYTE lpSrcBK;//背景像素指针
	LPBYTE temp=new BYTE[3];//新图像缓冲区
	memset(lpDst,255,size);//初始化新分配的内存为255
	memset(temp,255,3);
	for(j=0;j<height;j++)//进行每个像素的减运算
	{
		r=0;//用于判断是否是象素的起始字节
		for(i=0;i<WIDTH(3*wide);i++)
		{  
			r++;
			//获得原像素指针
			lpSrc=p_data+WIDTH(3*wide)*j+i;
			//获得目标像素指针
//			lpDst=temp+wide*j+i;
			//获得背景像素指针
			lpSrcBK=p_dataBK+WIDTH(3*wide)*j+i;
			temp[r%3]=*lpSrc-*lpSrcBK;
		//进行减运算
		if(r%3==0)
		{
		//	if(temp[0]==0||temp[1]==0||temp[2]==0)
			if(fabs(temp[0])<25||fabs(temp[1])<25||fabs(temp[2])<25)
			{
				lpDst[WIDTH(3*wide)*j+i]=0;
				lpDst[WIDTH(3*wide)*j+i-1]=0;
				lpDst[WIDTH(3*wide)*j+i-2]=0;
			}
			else
			{
				lpDst[WIDTH(3*wide)*j+i]=255;
				lpDst[WIDTH(3*wide)*j+i-1]=255;
				lpDst[WIDTH(3*wide)*j+i-2]=255;
			}
		}
		}
	}
	memcpy(p_data,lpDst,size);//复制处理后的图像
	delete temp,lpDst;
}


void CBsView::OnOperate() 
{
//	Sub(dib1.m_pData,dib2.m_pData,dib2.GetWidth(),dib2.GetHeight(),(dib2.m_pBitmapInfoHeader)->biBitCount); 
	Sub(dib1.m_pData,dib2.m_pData,dib2.GetWidth(),dib2.GetHeight(),dib2.GetSize());
	dib=&dib1;
	mid(dib,3);
	valid=true;
	Invalidate(); //更新 OnDraw()函数 
}

void CBsView::OnFileOpenb() 
{
	CFileDialog dlg2(TRUE,".bmp|*.*",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"位图文件(*.bmp)|*.bmp|All Files (*.*)|*.*||",NULL);   //设置打开文件为“ .TXT”
//	CFileDialog dlg2(  TRUE,_T("TXT"),_T("*.TXT"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T(" 文本文件  (*.TXT)|*.TXT|")); 
	if(IDOK==dlg2.DoModal()) 
	{
	 dib2.LoadFile(dlg2.GetPathName());

	 dib=&dib2; 
	 valid=true;
	 Invalidate(); }//更新 OnDraw()函数 	
	
}

void CBsView::OnFileOpeno() 
{
	CFileDialog dlg1(TRUE,".bmp|*.*",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"位图文件(*.bmp)|*.bmp|All Files (*.*)|*.*||",NULL);   //设置打开文件为“ .TXT”

	if(IDOK==dlg1.DoModal()) 
	{
	   dib1.LoadFile(dlg1.GetPathName());
		 dib=&dib1;
		 valid=true;
		 Invalidate();} //更新 OnDraw()函数 
	
}


void CBsView::mid(CDib *dib0,int n)
{//n为窗口的边长
	DWORD size;
	size=dib0->GetSize();//得到图像的大小,以字节为单位

	int ywindow,xwindow,nhalf,nn,m,k,chg,winm,mid0,win[1000];
	BYTE *p_data;//原图像象素指针

	int wide,height;
	BYTE *p_temp=new BYTE[size];//
	nhalf=(n-1)/2;//求出窗口一半的长度
	nn=n*n;//窗口大小
	mid0=(nn-1)/2;//用于存放求出的中值
	p_data=dib0->GetData();//取得原图的数据区指针
	memset(p_temp,255,size);	
	wide=dib0->GetWidth();//取得原图的数据区宽
	height=dib0->GetHeight();

	for(int j=nhalf;j<height-nhalf;j++)//窗口中心象素的起始位置
	for(int i=nhalf;i<wide-nhalf;i++) 
	{
		//把N*N屏蔽窗口部分复制到mode[m]
		m=0;
		for(ywindow=j-nhalf;ywindow<=j+nhalf;ywindow++)//窗口内的象素
        for(xwindow=i-nhalf;xwindow<=i+nhalf;xwindow++)
		{
			for(k=0;k<3;k++)
			{
			win[3*m+k]=p_data[(ywindow*WIDTH(3*wide)+3*xwindow)+k];
				}
			m++;
		}
		do{
			chg=0;
			for(m=0;m<nn-1;m++)
			{
				if(win[3*m]>win[3*(m+1)]||win[3*m+1]>win[3*(m+1)+1]||win[3*m+2]>win[3*(m+1)+2])
				{
				for(k=0;k<3;k++)
				{
					winm=win[3*m+k];
					win[3*m+k]=win[3*(m+1)+k];
					win[3*(m+1)+k]=winm;
					
				}
				chg=1;
				}

			}
		}while(chg==1);
		for(k=0;k<3;k++)
		{
			p_temp[j*WIDTH(3*wide)+3*i+k]=win[3*mid0+k];
		}

	}
	memcpy(p_data,p_temp,size);
	delete p_temp;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -