📄 typerecview.cpp
字号:
ReleaseDC(pDC);
}
//灰度转换测试
//
void CTypeRecView::OnTempGray()
{
CTypeRecDoc* pDoc = GetDocument();
HDIB hDIB=pDoc->GetHDIB();
long lWidth; //图像宽度和高度
long lHeight;
LONG lLineBytes;
// 指向DIB的指针
LPSTR lpDIB;
unsigned char * lpSrc; //指向原图像象素点的指针
// 指向DIB象素指针
LPSTR lpDIBBits;
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
// 更改光标形状
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 找到DIB图像象素起始位置
lWidth = ::DIBWidth(lpDIB); //DIB 宽度
lHeight = ::DIBHeight(lpDIB); //DIB 高度
lLineBytes=WIDTHBYTES(lWidth*8);
int i,j;
for(i=0;i<lHeight;i++)
for(j=0;j<lWidth;j++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
//if((*lpSrc)<255&&(*lpSrc)>190)
if((*lpSrc)<155&&(*lpSrc)>100)
*lpSrc=255;
else
if((*lpSrc)<255&&(*lpSrc)>190)
*lpSrc=0;
}
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
/*
// 获取文档
CTypeRecDoc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
unsigned char * lpSrc; //指向原图像象素点的指针
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 更改光标形状
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
long lWidth; //图像宽度和高度
long lHeight;
LONG lLineBytes;
long i,j; //循环变量
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
// 找到DIB图像象素起始位置
lWidth = ::DIBWidth(lpDIB); //DIB 宽度
lHeight = ::DIBHeight(lpDIB); //DIB 高度
lLineBytes=WIDTHBYTES(lWidth*8);
for(i = 0; i < lHeight; i++)
{
// 每列
for(j = 0; j < lWidth; j++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
*lpSrc=0;
}
}
// 更改光标形状
EndWaitCursor();
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
*/
}
void CTypeRecView::OnTempError()
{
CTypeRecDoc* pDoc = GetDocument();
HDIB hDIB=pDoc->GetHDIB();
long lWidth; //图像宽度和高度
long lHeight;
LONG lLineBytes;
// 指向DIB的指针
LPSTR lpDIB;
unsigned char * lpSrc; //指向原图像象素点的指针
// 指向DIB象素指针
LPSTR lpDIBBits;
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
// 更改光标形状
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 找到DIB图像象素起始位置
lWidth = ::DIBWidth(lpDIB); //DIB 宽度
lHeight = ::DIBHeight(lpDIB); //DIB 高度
lLineBytes=WIDTHBYTES(lWidth*8);
int i,j,pixel;
long lHistogram[256];
for(i=0;i<256;i++)
lHistogram[i]=0;
//获得直方图
int iMax1GrayValue=0;
int iMax2GrayValue=0;
for(i=0;i<lHeight;i++)
{
for(j=0;j<lWidth;j++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
pixel=(unsigned char)(*lpSrc);
lHistogram[pixel]++;
}
}
for(i=0;i<256;i++)
{
//找最大灰度值点为背景灰度值
if(iMax1GrayValue<lHistogram[i])
{
iMax1GrayValue=i;
}
else if(iMax2GrayValue<iMax1GrayValue&&iMax2GrayValue-1<iMax2GrayValue&&iMax2GrayValue+1<iMax2GrayValue)
{
iMax2GrayValue=i;
}
}
}
//用一初始阈值T对图像A进行二值化得到二值化图像B,初始阈值T的确定方法是:选择阈值
//T=Gmax-(Gmax-Gmin)/3,Gmax和Gmin分别是最高、最低灰度值。
//该阈值对不同牌照有一定的适应性,能够保证背景基本被置为0,以突出牌照区域
//
void CTypeRecView::OnTest11()
{
CTypeRecDoc* pDoc=GetDocument(); //获得文档
LPSTR lpDIB; //指向DIB的指针
LPSTR lpDIBBits; //指向DIB的象素的指针
LONG lLineBytes;
unsigned char * lpSrc; //指向原图像象素点的指针
long lWidth; //图像宽度和高度
long lHeight;
long i,j; //循环变量
OnEditCopy();
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
lWidth = ::DIBWidth(lpDIB); //DIB 宽度
lHeight = ::DIBHeight(lpDIB); //DIB 高度
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
long lCount[256];
for(i=0;i<256;i++)
{
lCount[i]=0; //清零
}
if(::DIBNumColors(lpDIB) != 256) //256色位图不作任何处理
{
return;
}
for(i=0;i<lHeight;i++)
{
for(j=0;j<lWidth;j++)
{
lpSrc=(unsigned char *)lpDIB+lLineBytes*i+j;
lCount[*(lpSrc)]++;
}
}
//求窗口变换的上限和下限
//
long temp[16];
int k=0;
for(k=0;k<16;k++)
{
temp[k]=0;
for(i=k*16;i<(k+1)*16;i++)
temp[k]+=lCount[i];
}
long max=0;
int t=0;
for(k=15;k>=0;k--)
{
if(temp[k]>max)
{
max=temp[k];
t=k;
}
}
int bLow=0,bUp=0;
bLow=(t-1)*16;
// bUp=(t+5)*16;
// bLow=100;
bUp=255;
// 阈值
INT bThre;
bThre=(INT)((2*bUp+bLow)/3);
// 更改光标形状
BeginWaitCursor();
// 调用ThresholdTrans()函数进行阈值变换
ThresholdTrans(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), bThre);
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
//(2)削弱背景干扰。对图像B作简单的相邻像素灰度值相减,得到新的图像G,
//即Gi,j=|Pi,j-Pi,j-1|i=0,1,…,439;j=0,1,…,639Gi,0=Pi,0,左边缘直接赋值,
//不会影响整体效果。
//
void CTypeRecView::OnTest12()
{
CTypeRecDoc* pDoc=GetDocument(); //获得文档
LPSTR lpDIB; //指向DIB的指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());//获得当前位图
//用自定义的模板消弱背景干扰
myTemplate(lpDIB);
pDoc->SetModifiedFlag(TRUE);
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
}
//区域灰度基本被赋值为0(图2(f))。考虑到文字是由许多短竖线组成,
//而背景噪声有一大部分是孤立噪声,用模板(1,1,1,1,1)T对G进行中值滤波,
//得到除掉了大部分干扰的图像C。
//
void CTypeRecView::OnTest13()
{
// 中值滤波
// 获取文档
CTypeRecDoc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 滤波器的高度
int iFilterH;
// 滤波器的宽度
int iFilterW;
// 中心元素的X坐标
int iFilterMX;
// 中心元素的Y坐标
int iFilterMY;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的中值滤波,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的中值滤波!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 创建对话框
// 初始化变量值
iFilterH = 5;
iFilterW = 1;
iFilterMX = 0;
iFilterMY = 2;
// 更改光标形状
BeginWaitCursor();
// 调用MedianFilter()函数中值滤波
if (myMedianFilter(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB),
iFilterH, iFilterW, iFilterMX, iFilterMY))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
//利用水平投影法检测车牌水平位置
//
void CTypeRecView::OnTest14()
{
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) ;
m_ipzLeft=0;
m_ipzRight=lWidth;
pDoc->UpdateAllViews(NULL);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
//对含车牌图像进行剪裁,得到车牌高度,原图像宽度的图像
OnTempSubrect();
}
//利用垂直投影法检测车牌垂直位置
//
void CTypeRecView::OnTest15()
{
CTypeRecDoc* pDoc=GetDocument(); //获得文档
LPSTR lpDIB; //指向DIB的指针
long lWidth; //图像宽度和高度
long lHeight;
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());
OnTempSubrect();
}
void CTypeRecView::OnEditPaste()
{
// 粘贴图像
// 创建新DIB
HDIB hNewDIB = NULL;
// 打开剪贴板
if (OpenClipboard())
{
// 更改光标形状
BeginWaitCursor();
// 读取剪贴板中的图像
hNewDIB = (HDIB) CopyHandle(::GetClipboardData(CF_DIB));
// 关闭剪贴板
CloseClipboard();
// 判断是否读取成功
if (hNewDIB != NULL)
{
// 获取文档
CTypeRecDoc* pDoc = GetDocument();
// 替换DIB,同时释放旧DIB对象
pDoc->ReplaceHDIB(hNewDIB);
// 更新DIB大小和调色板
pDoc->InitDIBData();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 重新设置滚动视图大小
// SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 实现新的调色板
OnDoRealize((WPARAM)m_hWnd,0);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
// 恢复光标
EndWaitCursor();
}
}
//综合第4,5步骤
//
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) ;
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)
{
// 获取文档
CTypeRecDoc* pDoc = GetDocument();
// 替换DIB,同时释放旧DIB对象
pDoc->ReplaceHDIB(hNewDIB);
// 更新DIB大小和调色板
pDoc->InitDIBData();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 实现新的调色板
OnDoRealize((WPARAM)m_hWnd,0);
}
//5
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());
}
//截取车牌子图像
//
void CTypeRecView::OnTest16()
{
OnEditPaste();
OnTempSubrect();
OnEditPaste();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -