车牌定位的完整源代码 bp.h
void CTypeRecView::OnTest145()
{
CTypeRecDoc* pDoc=GetDocument(); //获得文档
LPSTR lpDIB; //指向DIB的指针
long lWidth; //图像宽度和高度
long lHeight;
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
lWidth = ::DIBWidth(lpDIB); //DIB 宽度
lHeight = ::DIBHeight(lpDIB); //DIB 高度
//水平投影,求取车牌子图像的上下边缘位置
//
myHprojectDIB(lpDIB, lWidth, lHeight,&m_ipzTop, &m_ipzBottom) ;
1
西南科技大学本科生毕业论文
m_ipzLeft=0;
m_ipzRight=lWidth;
//对含车牌图像进行剪裁,得到车牌高度,原图像宽度的图像
// OnTempSubrect();
HDIB hDIB;
HDIB hNewDIB;
hDIB=pDoc->GetHDIB();
//假定的剪裁区域(车牌附近)
//
CRect rect(m_ipzLeft,m_ipzTop,m_ipzRight,m_ipzBottom);
hNewDIB= myCropDIB(hDIB,rect);
// 判断是否剪裁成功
if (hNewDIB != NULL)
2
西南科技大学本科生毕业论文
{
// 获取文档
CTypeRecDoc* pDoc = GetDocument();
// 替换DIB,同时释放旧DIB对象
pDoc->ReplaceHDIB(hNewDIB);
// 更新DIB大小和调色板
pDoc->InitDIBData();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 实现新的调色板
OnDoRealize((WPARAM)m_hWnd,0);
}
//5
3
西南科技大学本科生毕业论文
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
lWidth = ::DIBWidth(lpDIB); //DIB 宽度
lHeight =::DIBHeight(lpDIB); //DIB 高度
myVprojectDIB(lpDIB, lWidth, lHeight,&m_ipzLeft, &m_ipzRight) ;
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
}
/*************************************************************************
*
* 函数名称:
* myHprojectDIB()
*
* 参数:
4
西南科技大学本科生毕业论文
* LPSTR lpDIBBits - 指向源DIB图像指针
* LONG lWidth - 源图像宽度(象素数)
* LONG lHeight - 源图像高度(象素数)
* INT* iTop - 车牌上边缘
* INT* iBottom - 车牌下边缘
* 返回值:
* BOOL - 成功返回TRUE,否则返回FALSE。
*
* 说明:
* 该函数用于对含车牌图像进行水平投影运算,求取车牌子图像的上下边缘位置
*
************************************************************************/
BOOL WINAPI myHprojectDIB(LPSTR lpDIB, LONG lWidth, LONG lHeight,
5
西南科技大学本科生毕业论文
int* iTop, int* iBottom)
{
LPSTR lpDIBBits; //指向DIB的象素的指针
LONG lLineBytes; // 图像每行的字节数
unsigned char * lpSrc; //指向原图像象素点的指针
unsigned char pixel; //像素值
int i,j;
// 计算结果
INT* iResult;
INT pzBottom,pzTop;
bool findPZ=false;
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
6
西南科技大学本科生毕业论文
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
iResult=new INT[lHeight];
for(i=0;i for(j=lHeight/5;j iResult[j]=0; for(i=0;i lpSrc=(unsigned char*)lpDIBBits+lLineBytes*j+i; pixel=(unsigned char)(*lpSrc); if(pixel==255) 7 西南科技大学本科生毕业论文 { iResult[j]++; } } if((!findPZ)&&iResult[j]>12) { pzBottom=j; findPZ=true; } if(findPZ&&iResult[j]<12) { pzTop=j; break; 8 西南科技大学本科生毕业论文 } } pzTop=pzBottom+55; pzBottom=pzBottom-20; //微量调整 *iBottom=lHeight-pzBottom; *iTop=lHeight-pzTop; return true; } /************************************************************************* * * 函数名称: * myVprojectDIB() * 9 西南科技大学本科生毕业论文 * 参数: * LPSTR lpDIBBits - 指向源DIB图像指针 * LONG lWidth - 源图像宽度(象素数) * LONG lHeight - 源图像高度(象素数) * INT* iLeft - 车牌左边缘 * INT* iRight - 车牌右边缘 * 返回值: * BOOL - 成功返回TRUE,否则返回FALSE。 * * 说明: * 该函数用于对含车牌图像进行垂直投影运算,求取车牌子图像的左右边缘位置 * ************************************************************************/ 10 西南科技大学本科生毕业论文 BOOL WINAPI myVprojectDIB(LPSTR lpDIB, LONG lWidth, LONG lHeight, int* iLeft, int* iRight) { LPSTR lpDIBBits; LONG lLineBytes; unsigned char * lpSrc; unsigned char pixel; int i,j; // 计算结果 INT* iResult; INT pzLeft,pzRight; bool findPZ=false; // 找到DIB图像象素起始位置 //指向DIB的象素的指针 // 图像每行的字节数 //指向原图像象素点的指针 //像素值 11 西南科技大学本科生毕业论文 lpDIBBits = ::FindDIBBits(lpDIB); // 计算图像每行的字节数 lLineBytes = WIDTHBYTES(lWidth * 8); iResult=new INT[lWidth]; for(i=0;i for(i=lWidth/5;i iResult[i]=0; for(j=0;j lpSrc=(unsigned char*)lpDIBBits+lLineBytes*j+i; pixel=(unsigned char)(*lpSrc); 12 西南科技大学本科生毕业论文 if(pixel==255) { iResult[i]++; } } if((!findPZ)&&iResult[i]>10) { pzLeft=i; findPZ=true; } pzRight=pzLeft+150; } *iLeft=pzLeft-10; 13 西南科技大学本科生毕业论文 *iRight=pzRight+10; return true; } 14 因篇幅问题不能全部显示,请点此查看更多更全内容