0


c#联合Halcon进行几何定位

主要就是c#联合Halcon进行几何定位(也可以叫做模型匹配),本程序主要是基于单模板,进行单个模板的匹配以及循环遍历模板的匹配,如果您觉得文章不错,麻烦您关注博主,如有不对的地方,还希望大家提出来,我们共同进步。

一: 程序配置

1: 首先配置在winfom引用程序中引用两个halcon应用程序的库:分别是halcon.dll和halcondotnet.dll,而后把这两个库放在你的应用程序输出路径下面,然后在下边的图片中取消首选32位的勾选。

2:右键点击工具箱,单击选择项,然后点击浏览按钮,引用halcondotnet.dll控件,点击确定就可以显示HWindowControl控件了

二: 程序界面:

用到的控件分别为:

1个图形窗口HWindowControl,2个ListBox控件,5个button控件

程序界面

三:运行效果展示

1:点击读取图片选择一个图片并画ROI区域,在下边可以看到读取图像成功,并且获得模板的基准。

2:点击图片列表载入可以选择多幅图片并且在右上角的listbox控件中显示多幅图片的路径。

3:选中右上角listbox控件的一个项然后单击单步模型匹配会根据不同方向,位置同一个图像进行几何定位

4:点击遍历查找模型可以快速地对右上角listbox控件中的所有图片进行快熟匹配

四:程序代码

读取模型图片按钮代码:

  1. private void button读取图片_Click(object sender, EventArgs e)
  2. {
  3. HTuple width, height;
  4. OpenFileDialog openFile = new OpenFileDialog();
  5. openFile.Filter = "jpg文件(*.jpg)|*.jpg|png文件(*.png)|*.png|bmp文件(*.bmp文件)|*.bmp";
  6. if (openFile.ShowDialog()==DialogResult.OK)
  7. {
  8. hImage.ReadImage(openFile.FileName);
  9. //设置读取的图片的大小,并且刚好设置在窗口中
  10. HOperatorSet.GetImageSize(hImage, out width, out height);
  11. HOperatorSet.SetPart(hw1.HalconWindow, 0, 0, height, width);
  12. //图像显示
  13. hImage.DispObj(hw1.HalconWindow);
  14. listBox信息.Items.Add("读取单个图像成功");
  15. }
  16. }

画ROI按钮:

  1. private void buttonROI_Click(object sender, EventArgs e)
  2. {
  3. try
  4. {
  5. //取消焦点
  6. hw1.Focus();
  7. HOperatorSet.SetColor(hw1.HalconWindow, "red");
  8. HOperatorSet.DrawRectangle2(hw1.HalconID, out row, out column, out phi, out length1, out length);
  9. HOperatorSet.GenRectangle2(out rectangle2, row, column, phi, length1, length);
  10. HOperatorSet.DispObj(rectangle2, hw1.HalconID);
  11. HOperatorSet.ReduceDomain(hImage, rectangle2, out ho_ImageReduced);
  12. HOperatorSet.CreateShapeModel(ho_ImageReduced, "auto", (new HTuple(-180)).TupleRad()
  13. , (new HTuple(360)).TupleRad(), "auto", "auto", "use_polarity", "auto", "auto",
  14. out modelId);
  15. HOperatorSet.FindShapeModel(hImage, modelId, (new HTuple(-180)).TupleRad()
  16. , (new HTuple(360)).TupleRad(), 0.5, 1, 0.5, "least_squares", 0, 0.9, out hv_Row1,
  17. out hv_Column1, out hv_Angle, out hv_Score);
  18. //显示匹配结果
  19. dev_display_shape_matching_results(modelId, "red", hv_Row1, hv_Column1, hv_Angle,
  20. 1, 1, 0);
  21. //产生十字交叉点
  22. HOperatorSet.GenCrossContourXld(out ho_Cross, hv_Row1, hv_Column1, 15, (new HTuple(-45)).TupleRad());
  23. HOperatorSet.DispObj(ho_Cross, hw1.HalconWindow);
  24. listBox信息.Items.Add("画模板ROI区域成功");
  25. listBox信息.Items.Add("获得基准模板成功");
  26. }
  27. catch (System.Exception ex)
  28. {
  29. MessageBox.Show(ex.Message);
  30. }
  31. }

图片列表载入按钮:

  1. private void button图片载入_Click(object sender, EventArgs e)
  2. {
  3. //多个图片的载入
  4. OpenFileDialog openFile = new OpenFileDialog();
  5. //设置打开属性Multiselect为true表示允许选中多个图片文件
  6. openFile.Multiselect = true;
  7. openFile.Filter = "JPG文件|*.jpg|PNG文件|*.png|BMP文件|*.bmp";
  8. if (openFile.ShowDialog()==DialogResult.OK)
  9. {
  10. foreach (var item in openFile.FileNames)
  11. {
  12. listBox文件.Items.Add(item);
  13. }
  14. }
  15. }

单步查找模型按钮:

  1. private void button单模型查找_Click(object sender, EventArgs e)
  2. {
  3. HImage hImagetwo = new HImage();
  4. string a = Convert.ToString(listBox文件.SelectedItem);
  5. hImagetwo.ReadImage(a);
  6. HTuple Width, Height;
  7. //设置图片以合适的方式显示在图片控件上面
  8. HOperatorSet.GetImageSize(hImagetwo, out Width, out Height);
  9. HOperatorSet.SetPart(hw1.HalconWindow, 0, 0, Height, Width);
  10. HOperatorSet.DispObj(hImagetwo, hw1.HalconWindow);
  11. HOperatorSet.FindShapeModel(hImagetwo, modelId, (new HTuple(-180)).TupleRad()
  12. , (new HTuple(360)).TupleRad(), 0.3, 1, 0.5, "least_squares", 0, 0.7, out hv_Row1,
  13. out hv_Column1, out hv_Angle, out hv_Score);
  14. //显示匹配结果
  15. dev_display_shape_matching_results(modelId, "red", hv_Row1, hv_Column1, hv_Angle,
  16. 1, 1, 0);
  17. //产生十字交叉点
  18. HOperatorSet.GenCrossContourXld(out ho_Cross, hv_Row1, hv_Column1, 15, (new HTuple(-45)).TupleRad());
  19. HOperatorSet.DispObj(ho_Cross, hw1.HalconWindow);
  20. listBox信息.Items.Add("单个匹配图像成功");
  21. }

遍历查找模型按钮:

  1. private void button循环遍历查找_Click(object sender, EventArgs e)
  2. {
  3. HImage hImagethree = new HImage();
  4. for (int i = 0; i < listBox文件.Items.Count; i++)
  5. {
  6. int index = listBox文件.FindString(Convert.ToString(listBox文件.Items[i]));
  7. if (index != ListBox.NoMatches)
  8. {
  9. listBox文件.SetSelected(index, true); //表示在listbox文件框中当前循环遍历的是哪一个
  10. string filename = Convert.ToString(listBox文件.SelectedItem);
  11. hImagethree.ReadImage(filename);
  12. HTuple Width, Height;
  13. //设置图片以合适的方式显示在图片控件上面
  14. HOperatorSet.GetImageSize(hImagethree, out Width, out Height);
  15. HOperatorSet.SetPart(hw1.HalconWindow, 0, 0, Height, Width);
  16. HOperatorSet.DispObj(hImagethree, hw1.HalconWindow);
  17. HOperatorSet.FindShapeModel(hImagethree, modelId, (new HTuple(-180)).TupleRad()
  18. , (new HTuple(360)).TupleRad(), 0.3, 1, 0.5, "least_squares", 0, 0.7, out hv_Row1,
  19. out hv_Column1, out hv_Angle, out hv_Score);
  20. //显示匹配结果
  21. if (hv_Row1>0&&hv_Column1>0)
  22. {
  23. //显示匹配结果
  24. dev_display_shape_matching_results(modelId, "red", hv_Row1, hv_Column1, hv_Angle,
  25. 1, 1, 0);
  26. //产生十字交叉点
  27. HOperatorSet.GenCrossContourXld(out ho_Cross, hv_Row1, hv_Column1, 15, (new HTuple(-45)).TupleRad());
  28. HOperatorSet.DispObj(ho_Cross, hw1.HalconWindow);
  29. listBox信息.Items.Add("循环遍历中匹配单个图像成功");
  30. }
  31. }
  32. }
  33. }

完整程序代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using HalconDotNet;
  11. namespace 多模板匹配
  12. {
  13. public partial class Form1 : Form
  14. {
  15. public Form1()
  16. {
  17. InitializeComponent();
  18. //设置画的模式
  19. HOperatorSet.SetDraw(hw1.HalconWindow, "margin");
  20. }
  21. HImage hImage = new HImage();
  22. private void button读取图片_Click(object sender, EventArgs e)
  23. {
  24. HTuple width, height;
  25. OpenFileDialog openFile = new OpenFileDialog();
  26. openFile.Filter = "jpg文件(*.jpg)|*.jpg|png文件(*.png)|*.png|bmp文件(*.bmp文件)|*.bmp";
  27. if (openFile.ShowDialog()==DialogResult.OK)
  28. {
  29. hImage.ReadImage(openFile.FileName);
  30. //设置读取的图片的大小,并且刚好设置在窗口中
  31. HOperatorSet.GetImageSize(hImage, out width, out height);
  32. HOperatorSet.SetPart(hw1.HalconWindow, 0, 0, height, width);
  33. //图像显示
  34. hImage.DispObj(hw1.HalconWindow);
  35. listBox信息.Items.Add("读取单个图像成功");
  36. }
  37. }
  38. HTuple color;
  39. #region 画ROI区域产生的变量
  40. //创建模板的编号
  41. HTuple modelId;
  42. //查询模板的中间坐标,角度,还有模型实例的分数
  43. HTuple hv_Row1 = null, hv_Column1 = null, hv_Angle = null, hv_Score;
  44. //十字坐标
  45. HObject ho_Cross;
  46. //矩形2
  47. HTuple row, column, phi, length1, length;
  48. HObject rectangle2, ho_ImageReduced;
  49. public void dev_display_shape_matching_results(HTuple hv_ModelID, HTuple hv_Color,
  50. HTuple hv_Row, HTuple hv_Column, HTuple hv_Angle, HTuple hv_ScaleR, HTuple hv_ScaleC,
  51. HTuple hv_Model)
  52. {
  53. // Local iconic variables
  54. HObject ho_ModelContours = null, ho_ContoursAffinTrans = null;
  55. // Local control variables
  56. HTuple hv_NumMatches = null, hv_Index = new HTuple();
  57. HTuple hv_Match = new HTuple(), hv_HomMat2DIdentity = new HTuple();
  58. HTuple hv_HomMat2DScale = new HTuple(), hv_HomMat2DRotate = new HTuple();
  59. HTuple hv_HomMat2DTranslate = new HTuple();
  60. HTuple hv_Model_COPY_INP_TMP = hv_Model.Clone();
  61. HTuple hv_ScaleC_COPY_INP_TMP = hv_ScaleC.Clone();
  62. HTuple hv_ScaleR_COPY_INP_TMP = hv_ScaleR.Clone();
  63. // Initialize local and output iconic variables
  64. HOperatorSet.GenEmptyObj(out ho_ModelContours);
  65. HOperatorSet.GenEmptyObj(out ho_ContoursAffinTrans);
  66. //This procedure displays the results of Shape-Based Matching.
  67. //
  68. hv_NumMatches = new HTuple(hv_Row.TupleLength());
  69. if ((int)(new HTuple(hv_NumMatches.TupleGreater(0))) != 0)
  70. {
  71. if ((int)(new HTuple((new HTuple(hv_ScaleR_COPY_INP_TMP.TupleLength())).TupleEqual(
  72. 1))) != 0)
  73. {
  74. HOperatorSet.TupleGenConst(hv_NumMatches, hv_ScaleR_COPY_INP_TMP, out hv_ScaleR_COPY_INP_TMP);
  75. }
  76. if ((int)(new HTuple((new HTuple(hv_ScaleC_COPY_INP_TMP.TupleLength())).TupleEqual(
  77. 1))) != 0)
  78. {
  79. HOperatorSet.TupleGenConst(hv_NumMatches, hv_ScaleC_COPY_INP_TMP, out hv_ScaleC_COPY_INP_TMP);
  80. }
  81. if ((int)(new HTuple((new HTuple(hv_Model_COPY_INP_TMP.TupleLength())).TupleEqual(
  82. 0))) != 0)
  83. {
  84. HOperatorSet.TupleGenConst(hv_NumMatches, 0, out hv_Model_COPY_INP_TMP);
  85. }
  86. else if ((int)(new HTuple((new HTuple(hv_Model_COPY_INP_TMP.TupleLength()
  87. )).TupleEqual(1))) != 0)
  88. {
  89. HOperatorSet.TupleGenConst(hv_NumMatches, hv_Model_COPY_INP_TMP, out hv_Model_COPY_INP_TMP);
  90. }
  91. for (hv_Index = 0; (int)hv_Index <= (int)((new HTuple(hv_ModelID.TupleLength())) - 1); hv_Index = (int)hv_Index + 1)
  92. {
  93. ho_ModelContours.Dispose();
  94. HOperatorSet.GetShapeModelContours(out ho_ModelContours, hv_ModelID.TupleSelect(
  95. hv_Index), 1);
  96. if (HDevWindowStack.IsOpen())
  97. {
  98. HOperatorSet.SetColor(HDevWindowStack.GetActive(), hv_Color.TupleSelect(
  99. hv_Index % (new HTuple(hv_Color.TupleLength()))));
  100. }
  101. HTuple end_val18 = hv_NumMatches - 1;
  102. HTuple step_val18 = 1;
  103. for (hv_Match = 0; hv_Match.Continue(end_val18, step_val18); hv_Match = hv_Match.TupleAdd(step_val18))
  104. {
  105. if ((int)(new HTuple(hv_Index.TupleEqual(hv_Model_COPY_INP_TMP.TupleSelect(
  106. hv_Match)))) != 0)
  107. {
  108. HOperatorSet.HomMat2dIdentity(out hv_HomMat2DIdentity);
  109. HOperatorSet.HomMat2dScale(hv_HomMat2DIdentity, hv_ScaleR_COPY_INP_TMP.TupleSelect(
  110. hv_Match), hv_ScaleC_COPY_INP_TMP.TupleSelect(hv_Match), 0, 0, out hv_HomMat2DScale);
  111. HOperatorSet.HomMat2dRotate(hv_HomMat2DScale, hv_Angle.TupleSelect(hv_Match),
  112. 0, 0, out hv_HomMat2DRotate);
  113. HOperatorSet.HomMat2dTranslate(hv_HomMat2DRotate, hv_Row.TupleSelect(
  114. hv_Match), hv_Column.TupleSelect(hv_Match), out hv_HomMat2DTranslate);
  115. ho_ContoursAffinTrans.Dispose();
  116. HOperatorSet.AffineTransContourXld(ho_ModelContours, out ho_ContoursAffinTrans,
  117. hv_HomMat2DTranslate);
  118. //显示
  119. hw1.HalconWindow.DispObj(ho_ContoursAffinTrans);
  120. //
  121. if (HDevWindowStack.IsOpen())
  122. {
  123. HOperatorSet.DispObj(ho_ContoursAffinTrans, HDevWindowStack.GetActive()
  124. );
  125. }
  126. }
  127. }
  128. }
  129. }
  130. ho_ModelContours.Dispose();
  131. ho_ContoursAffinTrans.Dispose();
  132. return;
  133. }
  134. #endregion
  135. private void buttonROI_Click(object sender, EventArgs e)
  136. {
  137. try
  138. {
  139. //取消焦点
  140. hw1.Focus();
  141. HOperatorSet.SetColor(hw1.HalconWindow, "red");
  142. HOperatorSet.DrawRectangle2(hw1.HalconID, out row, out column, out phi, out length1, out length);
  143. HOperatorSet.GenRectangle2(out rectangle2, row, column, phi, length1, length);
  144. HOperatorSet.DispObj(rectangle2, hw1.HalconID);
  145. HOperatorSet.ReduceDomain(hImage, rectangle2, out ho_ImageReduced);
  146. HOperatorSet.CreateShapeModel(ho_ImageReduced, "auto", (new HTuple(-180)).TupleRad()
  147. , (new HTuple(360)).TupleRad(), "auto", "auto", "use_polarity", "auto", "auto",
  148. out modelId);
  149. HOperatorSet.FindShapeModel(hImage, modelId, (new HTuple(-180)).TupleRad()
  150. , (new HTuple(360)).TupleRad(), 0.5, 1, 0.5, "least_squares", 0, 0.9, out hv_Row1,
  151. out hv_Column1, out hv_Angle, out hv_Score);
  152. //显示匹配结果
  153. dev_display_shape_matching_results(modelId, "red", hv_Row1, hv_Column1, hv_Angle,
  154. 1, 1, 0);
  155. //产生十字交叉点
  156. HOperatorSet.GenCrossContourXld(out ho_Cross, hv_Row1, hv_Column1, 15, (new HTuple(-45)).TupleRad());
  157. HOperatorSet.DispObj(ho_Cross, hw1.HalconWindow);
  158. listBox信息.Items.Add("画模板ROI区域成功");
  159. listBox信息.Items.Add("获得基准模板成功");
  160. }
  161. catch (System.Exception ex)
  162. {
  163. MessageBox.Show(ex.Message);
  164. }
  165. }
  166. private void button图片载入_Click(object sender, EventArgs e)
  167. {
  168. //多个图片的载入
  169. OpenFileDialog openFile = new OpenFileDialog();
  170. //设置打开属性Multiselect为true表示允许选中多个图片文件
  171. openFile.Multiselect = true;
  172. openFile.Filter = "JPG文件|*.jpg|PNG文件|*.png|BMP文件|*.bmp";
  173. if (openFile.ShowDialog()==DialogResult.OK)
  174. {
  175. foreach (var item in openFile.FileNames)
  176. {
  177. listBox文件.Items.Add(item);
  178. }
  179. }
  180. }
  181. private void button单模型查找_Click(object sender, EventArgs e)
  182. {
  183. HImage hImagetwo = new HImage();
  184. string a = Convert.ToString(listBox文件.SelectedItem);
  185. hImagetwo.ReadImage(a);
  186. HTuple Width, Height;
  187. //设置图片以合适的方式显示在图片控件上面
  188. HOperatorSet.GetImageSize(hImagetwo, out Width, out Height);
  189. HOperatorSet.SetPart(hw1.HalconWindow, 0, 0, Height, Width);
  190. HOperatorSet.DispObj(hImagetwo, hw1.HalconWindow);
  191. HOperatorSet.FindShapeModel(hImagetwo, modelId, (new HTuple(-180)).TupleRad()
  192. , (new HTuple(360)).TupleRad(), 0.3, 1, 0.5, "least_squares", 0, 0.7, out hv_Row1,
  193. out hv_Column1, out hv_Angle, out hv_Score);
  194. //显示匹配结果
  195. dev_display_shape_matching_results(modelId, "red", hv_Row1, hv_Column1, hv_Angle,
  196. 1, 1, 0);
  197. //产生十字交叉点
  198. HOperatorSet.GenCrossContourXld(out ho_Cross, hv_Row1, hv_Column1, 15, (new HTuple(-45)).TupleRad());
  199. HOperatorSet.DispObj(ho_Cross, hw1.HalconWindow);
  200. listBox信息.Items.Add("单个匹配图像成功");
  201. }
  202. private void button循环遍历查找_Click(object sender, EventArgs e)
  203. {
  204. HImage hImagethree = new HImage();
  205. for (int i = 0; i < listBox文件.Items.Count; i++)
  206. {
  207. int index = listBox文件.FindString(Convert.ToString(listBox文件.Items[i]));
  208. if (index != ListBox.NoMatches)
  209. {
  210. listBox文件.SetSelected(index, true); //表示在listbox文件框中当前循环遍历的是哪一个
  211. string filename = Convert.ToString(listBox文件.SelectedItem);
  212. hImagethree.ReadImage(filename);
  213. HTuple Width, Height;
  214. //设置图片以合适的方式显示在图片控件上面
  215. HOperatorSet.GetImageSize(hImagethree, out Width, out Height);
  216. HOperatorSet.SetPart(hw1.HalconWindow, 0, 0, Height, Width);
  217. HOperatorSet.DispObj(hImagethree, hw1.HalconWindow);
  218. HOperatorSet.FindShapeModel(hImagethree, modelId, (new HTuple(-180)).TupleRad()
  219. , (new HTuple(360)).TupleRad(), 0.3, 1, 0.5, "least_squares", 0, 0.7, out hv_Row1,
  220. out hv_Column1, out hv_Angle, out hv_Score);
  221. //显示匹配结果
  222. if (hv_Row1>0&&hv_Column1>0)
  223. {
  224. //显示匹配结果
  225. dev_display_shape_matching_results(modelId, "red", hv_Row1, hv_Column1, hv_Angle,
  226. 1, 1, 0);
  227. //产生十字交叉点
  228. HOperatorSet.GenCrossContourXld(out ho_Cross, hv_Row1, hv_Column1, 15, (new HTuple(-45)).TupleRad());
  229. HOperatorSet.DispObj(ho_Cross, hw1.HalconWindow);
  230. listBox信息.Items.Add("循环遍历中匹配单个图像成功");
  231. }
  232. }
  233. }
  234. }
  235. }
  236. }

如果你觉得文章不错,希望给作者点一个大大的关注,我在这里感谢大家


本文转载自: https://blog.csdn.net/weixin_64740767/article/details/129506788
版权归原作者 SmallTown2 所有, 如有侵权,请联系我们删除。

“c#联合Halcon进行几何定位”的评论:

还没有评论