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,另外Halcon分32和64位,我是32,64位的自行腦補,關於VS的
環境配置不多扯了,下面開始配置Halcon。
(1) Halcon的標頭檔案:我的
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
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. 識別的結果如何得到
都在程式碼裡,自己摸索,下次再進行講解識別多個數字和字母漢字等。
本篇專案的原始碼連結:【點選下載原始碼】