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

📄 bmptestview.cpp

📁 车牌识别及定位
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// BmpTestView.cpp : implementation of the CBmpTestView class
//
#include "stdafx.h"
#include "BmpTest.h"
#include "stack.h"
#include "BmpTestDoc.h"
#include "BmpTestView.h"
#include <math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define MIN(a,b) (a<b? a:b)
#define MAX(a,b) (a>b? a:b)
#define NO_HUE -1;
int m_Grade[256],m_Gradmax=0,m_Grade_Blue[256],m_Grade_Green[256],m_Grade_Red[256],b[1024][1024];
extern void str(int quotient,char addr[15]);
extern BOOL  Contour(CBmpTestDoc* pDoc,double *pAnew_mon,BOOL bmoment,double n,double *protate);
extern BOOL  GCC(CBmpTestDoc* pDoc,double *n,POINT *gcc);
extern void Sh_Rotate(CBmpTestDoc* pDoc,double ro_angle,double size,POINT *pav_cent);
DISTANCE distbmp[50];

/////////////////////////////////////////////////////////////////////////////
// CBmpTestView

IMPLEMENT_DYNCREATE(CBmpTestView, CScrollView)

BEGIN_MESSAGE_MAP(CBmpTestView, CScrollView)
	//{{AFX_MSG_MAP(CBmpTestView)
	ON_COMMAND(ID_BT_BLACKNESS, OnBtBlackness)
	ON_COMMAND(ID_BT_DSTINVERT, OnBtDstinvert)
	ON_COMMAND(ID_BT_MERGECOPY, OnBtMergecopy)
	ON_COMMAND(ID_BT_MERGEPAINT, OnBtMergepaint)
	ON_COMMAND(ID_BT_NOTSRCCOPY, OnBtNotsrccopy)
	ON_COMMAND(ID_BT_NOTSRCERASE, OnBtNotsrcerase)
	ON_COMMAND(ID_BT_PATCOPY, OnBtPatcopy)
	ON_COMMAND(ID_BT_PATINVERT, OnBtPatinvert)
	ON_COMMAND(ID_BT_PATPAINT, OnBtPatpaint)
	ON_COMMAND(ID_BT_SRCAND, OnBtSrcand)
	ON_COMMAND(ID_BT_SRCCOPY, OnBtSrccopy)
	ON_COMMAND(ID_BT_SRCERASE, OnBtSrcerase)
	ON_COMMAND(ID_BT_SRCINVERT, OnBtSrcinvert)
	ON_COMMAND(ID_BT_SRCPAINT, OnBtSrcpaint)
	ON_COMMAND(ID_BT_WHITENESS, OnBtWhiteness)
	ON_COMMAND(ID_ZFT_SHOW, OnZftShow)
	ON_COMMAND(ID_ZFT_BALANCE, OnZftBalance)
	ON_COMMAND(ID_IMAGE_SHOW, OnImageShow)
	ON_COMMAND(ID_DTSM_IN, OnDtsmIn)
	ON_COMMAND(ID_DTSM_SHOW, OnDtsmShow)
	ON_COMMAND(ID_DTSM_OUT, OnDtsmOut)
	ON_COMMAND(ID_REC_FILT, OnRecFilt)
	ON_COMMAND(ID_MID_FILT, OnMidFilt)
	ON_COMMAND(ID_EDGE_ROBERT, OnEdgeRobert)
	ON_COMMAND(ID_EDGE_LAPLACE, OnEdgeLaplace)
	ON_COMMAND(ID_GAUSE_FILT, OnGauseFilt)
	ON_COMMAND(ID_EDGE_MARR, OnEdgeMarr)
	ON_COMMAND(ID_STRU_ADD, OnStruAdd)
	ON_COMMAND(ID_STRU_SUB, OnStruSub)
	ON_COMMAND(ID_STRU_OPEN, OnStruOpen)
	ON_COMMAND(ID_STRU_CLOSE, OnStruClose)
	ON_COMMAND(ID_EDIT_BACKUP, OnEditBackup)
	ON_COMMAND(ID_EDIT_BLUE, OnEditBlue)
	ON_COMMAND(ID_EDIT_GREEN, OnEditGreen)
	ON_COMMAND(ID_EDIT_RED, OnEditRed)
	ON_COMMAND(ID_EDGE_COLORPREWITT, OnEdgeColorprewitt)
	ON_COMMAND(ID_EDGE_COLORROBERT, OnEdgeColorrobert)
	ON_COMMAND(ID_MID_FILT_LINE, OnMidFiltLine)
	ON_COMMAND(ID_DENSITY_SCAN, OnDensityScan)
	ON_COMMAND(ID_ROW_DILATION, OnRowDilation)
	ON_COMMAND(ID_EDGE_COLORPREWITT1, OnEdgeColorprewitt1)
	ON_COMMAND(ID_EDGE_COLORROBERT1, OnEdgeColorrobert1)
	ON_COMMAND(ID_ROW_EROSION, OnRowErosion)
	ON_COMMAND(ID_CLOSE, OnClose)
	ON_COMMAND(ID_GET, OnGet)
	ON_COMMAND(ID_RELA_SCAN, OnRelaScan)
	ON_COMMAND(ID_DENSITY_SCAN_MID, OnDensityScanMid)
	ON_COMMAND(ID_AREA_MARK, OnAreaMark)
	ON_COMMAND(ID_LOCATING, OnLocating)
	ON_COMMAND(ID_VEHICLE_BITMAP, OnVehicleBitmap)
	ON_COMMAND(ID_BLUE_CUT, OnBlueCut)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBmpTestView construction/destruction

CBmpTestView::CBmpTestView()
{
	// TODO: add construction code here
	m_Rop=SRCCOPY;
}

CBmpTestView::~CBmpTestView()
{
}

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

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CBmpTestView drawing

void CBmpTestView::OnDraw(CDC* pDC)
{
	CPen pen,*open;
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
//设置滚动视图大小,使之与Dib大小一致:
	CSize sizeTotal;
	sizeTotal.cx = pDoc->m_Dib.Width;
	sizeTotal.cy = pDoc->m_Dib.Height+100;
	SetScrollSizes(MM_TEXT, sizeTotal);
//绘制Dib:
	if (pDoc->m_BM)
	{
//在滚动视图中绘制背景:
    	CBitmap pat;
	    CBrush br,* obr;
		CRect rc;
		rc.top=0;
		rc.left=0;
		rc.right=sizeTotal.cx;
		rc.bottom=sizeTotal.cy;
		GetClientRect(&rc);  //获得矩形区域大小
		pat.LoadBitmap(IDB_BITMAP2); //IDB_BITMAP2->pat
		br.CreatePatternBrush(&pat); //创建模式刷, pat->br
		obr=pDC->SelectObject(&br);
		pDC->FillRect(&rc,&br); //用画刷填充整个矩形区域
		pDC->SelectObject(obr);
		br.DeleteObject(); 
		CRect dibrect;
		dibrect.top=0;
		dibrect.left=0;
		dibrect.right=sizeTotal.cx;
		dibrect.bottom=sizeTotal.cy;
		pDoc->m_Dib.Draw(pDC->GetSafeHdc(),dibrect,dibrect);
    }
/*绘制DDB:
	CBitmap ddb;
	ddb.LoadBitmap( IDB_BITMAP1 );
    // Calculate bitmap size using a BITMAP structure.
    BITMAP bm;
    ddb.GetObject( sizeof(BITMAP), &bm );
    // Create a memory DC, select the bitmap into the
    // memory DC, and BitBlt it into the view.
    CDC dcMem;
    dcMem.CreateCompatibleDC( pDC );
    CBitmap* pbmpOld = dcMem.SelectObject( &ddb );
    pDC->BitBlt( dibrect.Width()/2,dibrect.Height()/2,
				 dibrect.Width()/2+bm.bmWidth,dibrect.Height()/2+bm.bmHeight,
                 &dcMem,
				 0,0,
				 m_Rop 
				 ); 
    // Reselect the original bitmap into the memory DC.
    dcMem.SelectObject( pbmpOld ); */
	else
	{
    	CBrush br,* obr;
	    CRect rc;
		CString s;
		rc.top=0;
		rc.left=0;
		rc.right=sizeTotal.cx;
		rc.bottom=sizeTotal.cy;
    	GetClientRect(&rc);
	    br.CreateSolidBrush(RGB(255,255,255));
	    obr=pDC->SelectObject(&br);
    	pDC->FillRect(&rc,&br);
	    pDC->SelectObject(obr);
	    br.DeleteObject(); 
		if(pDoc->m_Dib.BPP>=16)
		{
			pen.CreatePen(0,2,RGB(0,0,255));
    		open=pDC->SelectObject(&pen);
			pDC->MoveTo(10,150);
			pDC->LineTo(520,150);
    		int i,j=10,k=0;
			for ( i=0;i<256;i=i+20)
			{	
				s.Format("%d",i);
               pDC->TextOut(10+i*2, 150,  s);
			}
			for ( i=0;i<256;i++)
			{	
    			pDC->MoveTo(j,150);
			    if (m_Gradmax!=0) k=150-(int)m_Grade_Blue[i]*150/m_Gradmax;
	        	pDC->LineTo(j,k);
        		j=j+2;
			}
			pen.DeleteObject();
			pen.CreatePen(0,2,RGB(0,255,0));
    		open=pDC->SelectObject(&pen);
			pDC->MoveTo(10,310);
			pDC->LineTo(520,310);
			j=10;
			for ( i=0;i<256;i=i+20)
			{					
				s.Format("%d",i);
               pDC->TextOut(10+i*2, 310, s);
			}
			for ( i=0;i<256;i++)
			{	
    			pDC->MoveTo(j,310);
			    if (m_Gradmax!=0) k=310-(int)m_Grade_Green[i]*150/m_Gradmax;
	        	pDC->LineTo(j,k);
        		j=j+2;
			}
			pen.DeleteObject();
			pen.CreatePen(0,2,RGB(255,0,0));
    		open=pDC->SelectObject(&pen);
			pDC->MoveTo(10,470);
			pDC->LineTo(520,470);
			for ( i=0;i<256;i=i+20)
			{	
				s.Format("%d",i);
               pDC->TextOut(10+i*2, 470, s);
			}
			j=10;
			for ( i=0;i<256;i++)
			{	
    			pDC->MoveTo(j,470);
			    if (m_Gradmax!=0) k=470-(int)m_Grade_Red[i]*150/m_Gradmax;
	        	pDC->LineTo(j,k);
        		j=j+2;
			}
			j=10;
			pDC->SelectObject(open);
			pen.DeleteObject();
			pDC->MoveTo(j,10);
		}
		else 
		{
    		pen.CreatePen(0,2,RGB(0,0,0));
    		open=pDC->SelectObject(&pen);
			pDC->MoveTo(10,260);
			pDC->LineTo(520,260);
			pDC->TextOut(200, 300, " 的直方图");
    		int i,j=10,k=0;
			for ( i=0;i<256;i=i+20)
			{	
				s.Format("%d",i);
				pDC->TextOut(10+i*2, 260, s);
			}
			for ( i=0;i<256;i++)
			{	
    			pDC->MoveTo(j,260);
			    if (m_Gradmax!=0) k=260-(int)m_Grade[i]*250/m_Gradmax;
	        	pDC->LineTo(j,k);
        		j=j+2;
			}
			pDC->SelectObject(open);
			pen.DeleteObject();
			pDC->MoveTo(j,10);
		}
	}
}

void CBmpTestView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();

	CSize sizeTotal;
	// TODO: calculate the total size of this view
	sizeTotal.cx = sizeTotal.cy = 100;
	SetScrollSizes(MM_TEXT, sizeTotal);
}

/////////////////////////////////////////////////////////////////////////////
// CBmpTestView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CBmpTestView diagnostics

#ifdef _DEBUG
void CBmpTestView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CBmpTestView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

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

/////////////////////////////////////////////////////////////////////////////
// CBmpTestView message handlers

void CBmpTestView::OnBtBlackness() 
{
	// TODO: Add your command handler code here
	m_Rop=BLACKNESS;
	Invalidate();
}

void CBmpTestView::OnBtDstinvert() 
{
	// TODO: Add your command handler code here
	m_Rop=DSTINVERT;
	Invalidate();
}

void CBmpTestView::OnBtMergecopy() 
{
	// TODO: Add your command handler code here
	m_Rop=MERGECOPY;
	Invalidate();
}

void CBmpTestView::OnBtMergepaint() 
{
	// TODO: Add your command handler code here
	m_Rop=MERGEPAINT;
	Invalidate();
}

void CBmpTestView::OnBtNotsrccopy() 
{
	// TODO: Add your command handler code here
	m_Rop=NOTSRCCOPY;
	Invalidate();
}

void CBmpTestView::OnBtNotsrcerase() 
{
	// TODO: Add your command handler code here
	m_Rop=NOTSRCERASE;
	Invalidate();
}

void CBmpTestView::OnBtPatcopy() 
{
	// TODO: Add your command handler code here
	m_Rop=PATCOPY;
	Invalidate();
}

void CBmpTestView::OnBtPatinvert() 
{
	// TODO: Add your command handler code here
	m_Rop=PATINVERT;
	Invalidate();
}

void CBmpTestView::OnBtPatpaint() 
{
	// TODO: Add your command handler code here
	m_Rop=PATPAINT;
	Invalidate();
}

void CBmpTestView::OnBtSrcand() 
{
	// TODO: Add your command handler code here
	m_Rop=SRCAND;
	Invalidate();
}

void CBmpTestView::OnBtSrccopy() 
{
	// TODO: Add your command handler code here
	m_Rop=SRCCOPY;
	Invalidate();
}

void CBmpTestView::OnBtSrcerase() 
{
	// TODO: Add your command handler code here
	m_Rop=SRCERASE;
	Invalidate();
}

void CBmpTestView::OnBtSrcinvert() 
{
	// TODO: Add your command handler code here
	m_Rop=SRCINVERT;
	Invalidate();
}

void CBmpTestView::OnBtSrcpaint() 
{
	// TODO: Add your command handler code here
	m_Rop=SRCPAINT;
	Invalidate();
}

void CBmpTestView::OnBtWhiteness() 
{
	// TODO: Add your command handler code here
	m_Rop=WHITENESS;
	Invalidate();
}

void CBmpTestView::OnZftShow(CDC *pDC) 
{
	// TODO: Add your command handler code here
/*	CRect rc;
	GetClientRect(&rc); */
	CBmpTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);  
	if(!pDoc->m_Dib.m_BmpLoaded)
	{
		AfxMessageBox("还没有打开图像文件");
		return;
	}
    int i;
    long j;
	if (pDoc->m_Dib.BPP>=16)
    {   
	   m_Gradmax=0;
	   for ( i=0;i<256;i++)
	   {
	      m_Grade_Blue[i]=0;
		  m_Grade_Green[i]=0;
		  m_Grade_Red[i]=0;
	   }
       for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j=j+3)
	   {
	      m_Grade_Blue[int(*(pDoc->m_Dib.m_Buffer+j))]++;
		  m_Grade_Green[int(*(pDoc->m_Dib.m_Buffer+j+1))]++;
		  m_Grade_Red[int(*(pDoc->m_Dib.m_Buffer+j+2))]++;
	   }
       for ( i=0;i<256;i++)
	   {
	     if (m_Grade_Blue[i]>m_Gradmax)
			m_Gradmax=m_Grade_Blue[i];
		 if (m_Grade_Green[i]>m_Gradmax)
			m_Gradmax=m_Grade_Green[i];
		 if (m_Grade_Red[i]>m_Gradmax)
			m_Gradmax=m_Grade_Red[i];
	   }
	}	
    else if (pDoc->m_Dib.BPP==8)
	{
	   m_Gradmax=0;
       for ( i=0;i<256;i++)
	   {
	      m_Grade[i]=0;
	   }
       for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
	   {
	      m_Grade[int(*(pDoc->m_Dib.m_Buffer+j))]++;
	   }
	   m_Gradmax=0;
       for ( i=0;i<256;i++)
	   {
	     if (m_Grade[i]>m_Gradmax)
			m_Gradmax=m_Grade[i];
	   }
	}
	else
	{
	   long int black=0, white=0;
	   int a;
	   for ( i=0;i<256;i++)
	   {
	      m_Grade[i]=0;
	   }
       for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
	   {
		   a=128;
	       for ( i=0;i<8;i++)
		   {
			    if( ((int)*(pDoc->m_Dib.m_Buffer+j) & a)==0)
					black++;
			    else
					white++;
			    a=a>>1;
		   }

⌨️ 快捷键说明

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