1、Halcon图形元素的显示
hWindowControl1.HalconWindow.DispObj(image);//显示图像、Region、Xld
hWindowControl1.HalconWindow.SetDraw(“margin”);//设置填充的模式
hWindowControl1.HalconWindow.SetColor(“green”);//设置显示颜色
2、系统全局参数设置(非必要,但建议设置)
HOperatorSet.SetSystem(“do_low_error”, “false”);//少报错
HOperatorSet.SetSystem(“clip_region”, “false”);//region在图像外不切掉
HOperatorSet.SetSystem(“border_shape_models”, “true”);//依然匹配边缘的图形
3、调试
C#中Halcon部分代码的调试不太方便,但也不是毫无办法。
① 调试时HTuple类型的变量可以直接查看值。
② Image、Region、Xld的变量一般只能通过“保存文件到本地”来查看变量情况。
HOperatorSet.WriteImage(image, “jpg”, 0x000000, “1.jpg”);//彩色图像
HOperatorSet.WriteImage(image, “jpg”, 0, “1.jpg”);//灰度图像
HOperatorSet.WriteRegion(ho_RegionUnion, “1.hobj”);//后缀用.reg也行
HOperatorSet.WriteContourXldDxf(contours,“1.dxf”);
③ 安装Halcon的变量检查插件到Visual Studio。该安装文件所在的默认路径为:
C:\Program Files\MVTec\HALCON-12.0\misc\HALCON_Variable_Inspect.vsix
4、在hWindowControl控件中显示文字
以下两个函数的内容由Halcon中的set_display_font和disp_message算子导出,可完成控件中的文字显示。
set_display_font(windowHandle, hv_TextSize, “mono”, “true”, “false”);
disp_message(windowHandle, hv_Text, “window”, row, col, hv_Color,“true”);
5、格式转换
① HTuple兼容int、double等数据类型
② HObject类型的图像兼容HImage类型的图像
③ Bitmap转Himage(24位或8位的)的方法如下:
public static HImage Bitmap2HImage_24(Bitmap bImage)
{
Bitmap bImage24;
BitmapData bmData = null;
Rectangle rect;
IntPtr pBitmap;
IntPtr pPixels;
HImage hImage = new HImage();
rect = new Rectangle(0, 0, bImage.Width, bImage.Height);
bImage24 = new Bitmap(bImage.Width, bImage.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bImage24);
g.DrawImage(bImage, rect);
g.Dispose();
bmData = bImage24.LockBits(rect, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
pBitmap = bmData.Scan0;
pPixels = pBitmap;
hImage.GenImageInterleaved(pPixels, "bgr", bImage.Width, bImage.Height, -1, "byte", 0, 0, 0, 0, -1, 0);
bImage24.UnlockBits(bmData);
return hImage;
}
public static HImage Bitmap2HImage_8(Bitmap bImage)
{
Bitmap bImage8;
BitmapData bmData = null;
Rectangle rect;
IntPtr pBitmap;
IntPtr pPixels;
var hImage = new HImage();
rect = new Rectangle(0, 0, bImage.Width, bImage.Height);
bmData = bImage.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
pBitmap = bmData.Scan0;
pPixels = pBitmap;
hImage.GenImage1("byte", bImage.Width, bImage.Height, pPixels);
bImage.UnlockBits(bmData);
//formathimage = hImage;
return hImage;
}
6、在hWindowControl控件中缩放图像
在hWindowControl中鼠标位置可用GetMposition获得,SetPart可改变窗口中显示的图像部分。
HOperatorSet.GetMposition(hWHandle, out mouseY, out mouseX, out mbutton);
HOperatorSet.SetPart(hWHandle, mRow1, mCol1, mRow2, mCol2);
set_part:用于修改窗口中显示的图像部分。(Row1,Column1) 表示要显示的图像部分的左上角, (Row2,Column2)表示要显示的图像部分的右下角。(详见dev_set_part和set_part的帮助文档)
9、Halcon图形元素与其他图像算法库数据的交互
Halcon的Region、Xld是自己的特有格式,它们与外界是不通用的。目前我研究出来的主要是通过将坐标点作为桥梁来与外界进行数据交互。
Region转化为坐标点:get_region_polygon(Region : : Tolerance : Rows, Columns)
坐标点转化为Region:gen_region_polygon_filled( : Region : Rows, Columns : )
Xld转化为坐标点 :get_contour_xld(Contour : : : Row, Col)
坐标点转化为Xld :gen_contour_polygon_xld( : Contour : Row, Col : )