一. Halcon读取并训练图片
本博客要识别如下的图片,该图片是数字5,读取图片,二值处理,再经过SVM分类训练,得出数字结果。关于SVM的文章,可以【点击此处学习SVM】。
首先我们在halcon里完成识别过程,源码如下
read_image(Image, 'D:/num/1.jpg')
* 图像处理
decompose3(Image, ImageR, ImageG, ImageB)
threshold(ImageG, Regions, 0, 183)
connection(Regions, Connection)
select_shape (Connection, SelectedRegions, 'area', 'and', 1987.72, 7500)
read_ocr_class_mlp('Document_0-9_NoRej.omc',OCRHandle)
*训练器训练的结果
do_ocr_multi_class_mlp(SelectedRegions,ImageG,OCRHandle, Class, Confidence)
代码解释:
Document_0-9_NoRej.omc 是Halcon做好的分类器文件,可以进行数字,字母等的识别,目录在Halcon的安装目录,路
径是C:\Program Files\MVTec\HALCON-12.0\ocr,例如如下文件:
这些做好后导出C++代码。
二. 建立MFC工程
2.1 创建MFC对话框程序,
用VS各个版本都行,我用的是VS2015,另外Halcon分32和64位,我是32,64位的自行脑补,关于VS的环境配置不多扯了,下面开始配置Halcon。
(1) Halcon的头文件:我的Halcon12装在C盘,路径是
C:\Program Files\MVTec\HALCON-12.0\include
C:\Program Files\MVTec\HALCON-12.0\include\halconcpp
(2) 静态库lib:路径是
C:\Program Files\MVTec\HALCON-12.0\lib\x86sse2-win32
C++开发时需要的lib库的名字:halconcpp.lib
(3) 运行时把C:\ProgramFiles\MVTec\HALCON-12.0\bin\x86sse2-win32的dll全部拷到exe所在的目录,或者程序当前目录。
2.2 画界面,如下
复制导出的C++代码void action(),例如该程序是,打开图片后显示到编辑框。源码如下:
void CHalconNumberRecoDlg::OnBnClickedOpen()
{
// TODO: 在此添加控件通知处理程序代码
TCHAR szFilter[] = _T("JPG文件(*.jpg)|*.jpg|所有文件(*.*)|*.*||");
CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this);
CString strFilePath;
// 显示打开文件对话框
if (IDOK == fileDlg.DoModal())
{
strFilePath = fileDlg.GetPathName();
}
HTuple HWindowID;
CRect Rect;
HTuple m_HWindowID;
HTuple m_ImageWidth, m_ImageHeight;
CWnd * pWnd = GetDlgItem(IDC_ShowImage);
HWindowID = (Hlong)pWnd->m_hWnd; //获取父窗口句柄
pWnd->GetWindowRect(&Rect);
OpenWindow(0, 0, Rect.Width(), Rect.Height(), HWindowID, "visible", "", &m_HWindowID);
//以下是Halcon导出的源码 action()
HObject ho_Image, ho_ImageR, ho_ImageG, ho_ImageB;
HObject ho_Regions, ho_Connection, ho_SelectedRegions;
// Local control variables
HTuple hv_OCRHandle, hv_Class, hv_Confidence;
//ReadImage(&ho_Image, "D:/num/1.jpg");
HTuple ht;
ht[0] = strFilePath.GetBuffer(); //HTuple转CString
ReadImage(&ho_Image, ht.S()); //注意这里的传值
//显示图片
GetImagePointer1(ho_Image, NULL, NULL, &m_ImageWidth, &m_ImageHeight);
SetPart(m_HWindowID, 0, 0, m_ImageHeight - 1, m_ImageWidth - 1);
DispObj(ho_Image, m_HWindowID);
//图像处理
Decompose3(ho_Image, &ho_ImageR, &ho_ImageG, &ho_ImageB);
Threshold(ho_ImageG, &ho_Regions, 0, 183);
Connection(ho_Regions, &ho_Connection);
SelectShape(ho_Connection, &ho_SelectedRegions, "area", "and", 1987.72, 7500);
ReadOcrClassMlp("Document_0-9_NoRej.omc", &hv_OCRHandle);
DoOcrMultiClassMlp(ho_SelectedRegions, ho_ImageG, hv_OCRHandle, &hv_Class, &hv_Confidence);
CString strRet = (CString)(hv_Class.ToString()); //HString转CString
SetDlgItemText(IDC_EDIT1, strRet);
}
代码难点:
1. 如何用picture显示halcon读取的照片?
2. Halcon与VS的数据转换
3. 识别的结果如何得到
都在代码里,自己摸索,下次再进行讲解识别多个数字和字母汉字等。
本篇项目的源码链接:【点击下载源码】