Halcon与MFC数字识别详细教程

一. Halcon读取并训练图片         

       本博客要识别如下的图片,该图片是数字5,读取图片,二值处理,再经过SVM分类训练,得出数字结果。关于SVM的文章,可以【点击此处学习SVM】。

        

Halcon与MFC数字识别详细教程

         

        首先我们在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,例如如下文件:

Halcon与MFC数字识别详细教程

这些做好后导出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 画界面,如下

Halcon与MFC数字识别详细教程

复制导出的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.      识别的结果如何得到

 都在代码里,自己摸索,下次再进行讲解识别多个数字和字母汉字等。

本篇项目的源码链接:【点击下载源码

 

 

 

 

 

 

上一篇:HO引擎近况20210912


下一篇:UML-如何进行对象设计?