1. 程式人生 > >Halcon與MFC數字識別詳細教程

Halcon與MFC數字識別詳細教程

一. 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,另外Halcon3264位,我是3264位的自行腦補,關於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-win32dll

全部拷到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.      HalconVS的資料轉換

3.      識別的結果如何得到

 都在程式碼裡,自己摸索,下次再進行講解識別多個數字和字母漢字等。

本篇專案的原始碼連結:【點選下載原始碼