MFC与Halcon混合编程--基于相关性的模板匹配
文章目錄
- 前言
- 一、基于相關性的模板匹配
- 二、基于相關性的模板匹配的代碼實現
- 1.Halcon中完成基于相關性的模板匹配
- 2.MFC實現與Halcon混合編程
- 3.實現效果
前言
正在學習Halcon的例程的基于相關性的模板匹配。花了點時間做了一個簡單的demo。
首先簡單記錄一下什么是基于相關性的模板匹配:
一、基于相關性的模板匹配
歸一化相關性.NCC,(normalization cross-correlation),顧名思義,就是用于歸一化待匹配目標之間的相關程度,注意這里比較的是原始像素。通過在待匹配像素位置p(px,py)構建3*3鄰域匹配窗口,與目標像素位置p’(px+d,py)同樣構建鄰域匹配窗口的方式建立目標函數來對匹配窗口進行度量相關性。它是基于圖像灰度信息的匹配方法。
NCC的定義
在[-1,1]絕對尺度范圍之間衡量兩者的相似性。相關系數刻畫了兩者之間的近似程度的線性描述。一般說來,越接近于1,兩者越近似的有線性關系。
二、基于相關性的模板匹配的代碼實現
1.Halcon中完成基于相關性的模板匹配
在Halcon軟件中,按住Ctrl+E的快捷鍵,打開Halcon中關于模板匹配的例程,如下圖所示:
利用USB攝像頭,任意選取一物體作為我的模板,參考Halcon例程實現代碼如下:
將以上Halcon代碼導出為C++文件,部分代碼如下:
using namespace HalconCpp;// Procedure declarations // Chapter: Matching / Correlation-Based // Short Description: Display the results of Correlation-Based Matching. void dev_display_ncc_matching_results (HTuple hv_ModelID, HTuple hv_Color, HTuple hv_Row, HTuple hv_Column, HTuple hv_Angle, HTuple hv_Model);//函數聲明// Procedures // Chapter: Matching / Correlation-Based // Short Description: Display the results of Correlation-Based Matching. void dev_display_ncc_matching_results (HTuple hv_ModelID, HTuple hv_Color, HTuple hv_Row, HTuple hv_Column, HTuple hv_Angle, HTuple hv_Model)//函數定義 {// Local iconic variablesHObject ho_ModelRegion, ho_ModelContours, ho_ContoursAffinTrans;HObject ho_Cross;// Local control variablesHTuple hv_NumMatches, hv_Index, hv_Match, hv_HomMat2DIdentity;HTuple hv_HomMat2DRotate, hv_HomMat2DTranslate, hv_RowTrans;HTuple hv_ColTrans;//This procedure displays the results of Correlation-Based Matching.//hv_NumMatches = hv_Row.TupleLength();if (0 != (hv_NumMatches>0)){if (0 != ((hv_Model.TupleLength())==0)){TupleGenConst(hv_NumMatches, 0, &hv_Model);}else if (0 != ((hv_Model.TupleLength())==1)){TupleGenConst(hv_NumMatches, hv_Model, &hv_Model);}{HTuple end_val9 = (hv_ModelID.TupleLength())-1;HTuple step_val9 = 1;for (hv_Index=0; hv_Index.Continue(end_val9, step_val9); hv_Index += step_val9){GetNccModelRegion(&ho_ModelRegion, HTuple(hv_ModelID[hv_Index]));GenContourRegionXld(ho_ModelRegion, &ho_ModelContours, "border_holes");if (HDevWindowStack::IsOpen())SetColor(HDevWindowStack::GetActive(),HTuple(hv_Color[hv_Index%(hv_Color.TupleLength())]));{HTuple end_val13 = hv_NumMatches-1;HTuple step_val13 = 1;for (hv_Match=0; hv_Match.Continue(end_val13, step_val13); hv_Match += step_val13){if (0 != (hv_Index==HTuple(hv_Model[hv_Match]))){HomMat2dIdentity(&hv_HomMat2DIdentity);HomMat2dRotate(hv_HomMat2DIdentity, HTuple(hv_Angle[hv_Match]), 0, 0, &hv_HomMat2DRotate);HomMat2dTranslate(hv_HomMat2DRotate, HTuple(hv_Row[hv_Match]), HTuple(hv_Column[hv_Match]), &hv_HomMat2DTranslate);AffineTransContourXld(ho_ModelContours, &ho_ContoursAffinTrans, hv_HomMat2DTranslate);if (HDevWindowStack::IsOpen())DispObj(ho_ContoursAffinTrans, HDevWindowStack::GetActive());AffineTransPixel(hv_HomMat2DTranslate, 0, 0, &hv_RowTrans, &hv_ColTrans);GenCrossContourXld(&ho_Cross, hv_RowTrans, hv_ColTrans, 6, HTuple(hv_Angle[hv_Match]));if (HDevWindowStack::IsOpen())DispObj(ho_Cross, HDevWindowStack::GetActive());}}}}}}return; }void action() {// Local iconic variablesHObject ho_Image, ho_ROI_0, ho_ImageReduced;// Local control variablesHTuple hv_AcqHandle, hv_Area, hv_RowRef, hv_ColumnRef;HTuple hv_Rows, hv_Cols, hv_ModelID, hv_Row, hv_Column;HTuple hv_Angle, hv_Score;//Image Acquisition 01: Code generated by Image Acquisition 01OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "gray", -1, "false", "default", "[0] ", 0, -1, &hv_AcqHandle);GrabImageStart(hv_AcqHandle, -1);GrabImageAsync(&ho_Image, hv_AcqHandle, -1);GenRectangle2(&ho_ROI_0, 378.959, 523.422, HTuple(86.7433).TupleRad(), 147.265, 69.2766);//此處對應的選取即為Halcon中選取的模板AreaCenter(ho_ROI_0, &hv_Area, &hv_RowRef, &hv_ColumnRef);ReduceDomain(ho_Image, ho_ROI_0, &ho_ImageReduced);if (HDevWindowStack::IsOpen())SetDraw(HDevWindowStack::GetActive(),"margin");if (HDevWindowStack::IsOpen())DispObj(ho_Image, HDevWindowStack::GetActive());hv_Rows = HTuple();hv_Cols = HTuple();CreateNccModel(ho_ImageReduced, "auto", -0.39, 0.79, "auto", "use_polarity", &hv_ModelID);while (0 != 1){GrabImageAsync(&ho_Image, hv_AcqHandle, -1);//Image Acquisition 01: Do somethingFindNccModel(ho_Image, hv_ModelID, 0, 360, 0.5, 1, 0.5, "true", 0, &hv_Row, &hv_Column, &hv_Angle, &hv_Score);if (0 != ((hv_Score.TupleLength())>0)){hv_Rows = hv_Rows.TupleConcat(hv_Row);hv_Cols = hv_Cols.TupleConcat(hv_Column);if (HDevWindowStack::IsOpen())DispObj(ho_Image, HDevWindowStack::GetActive());dev_display_ncc_matching_results(hv_ModelID, "green", hv_Row, hv_Column, hv_Angle, 0);if (HDevWindowStack::IsOpen())DispObj(ho_Image, HDevWindowStack::GetActive());//dev_display (RegionAffineTrans)}}CloseFramegrabber(hv_AcqHandle);}2.MFC實現與Halcon混合編程
在Visual Studio 2015中運用C++運用HAlcon需要配置Halcon環(huán)境,如何配置環(huán)境可參考:
Halcon與MFC的混合編程–VC++環(huán)境配置
“https://blog.csdn.net/qq_40896597/article/details/109703054?spm=1001.2014.3001.5502”
配置好環(huán)境之后,新建MFC項目,界面編輯如下:
“采集并建立模板” 的事件和運行 “模板匹配” 的部分代碼如下:
部分識別模板的代碼如下:
//識別模板 if (pDlg->ModelMatch){FindNccModel(pDlg->ho_Image, pDlg->hv_ModelID, 0, 360, 0.5, 1, 0.5, "true", 0, &pDlg->hv_Row, &pDlg->hv_Column,&pDlg->hv_Angle, &pDlg->hv_Score);if (0 != ((pDlg->hv_Score.TupleLength())>0)){pDlg->hv_Rows = pDlg->hv_Rows.TupleConcat(pDlg->hv_Row);pDlg->hv_Cols = pDlg->hv_Cols.TupleConcat(pDlg->hv_Column);if (HDevWindowStack::IsOpen())DispObj(pDlg->ho_Image, HDevWindowStack::GetActive());pDlg->dev_display_ncc_matching_results(pDlg->hv_ModelID, "green", pDlg->hv_Row, pDlg->hv_Column, pDlg->hv_Angle,0);if (HDevWindowStack::IsOpen())DispObj(pDlg->ho_Image, HDevWindowStack::GetActive()); }}3.實現效果
MFC與Halcon的混合編程之基于相關性的模板匹配
具體效果視頻請見:https://www.bilibili.com/video/BV1Di4y1N7RD/
源代碼傳送地址:https://download.csdn.net/download/qq_40896597/15728138
總結
以上是生活随笔為你收集整理的MFC与Halcon混合编程--基于相关性的模板匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使用Erdas进行监督分类
- 下一篇: 网络请求分析实战篇(01)—— 爬取am