【halcon用C#编程时常见问题】

halcon用C#编程时常见问题
软件环境
halcon17+VS2017
一.配置或引用问题
如果不清楚如何从halcon代码转为C#工程时可以先参考halcon与C#混合编程
1、切记halcon代码转为C#时要选择使用导出模板,这样在引用到C#工程时会少很多问题。
在这里插入图片描述
2、C#工程配置时“目标框架”改为".NET Framework 4",设置为更高版本时初次编译或运行时容易报错,但是编译成功后再改回更高版本时错误将不再出现,具体原因暂时不清楚。

二.交互问题
1、Halcon图形元素的显示
hWindowControl1.HalconWindow.DispObj(image);//显示图像、Region、

XldhWindowControl1.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位的)的方法见文章末尾:

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 : )
————————————————
转载自「Expect for future」的原创文章
原文链接:https://blog.csdn.net/the_future_way/article/details/108521374

Bitmap转Himage(24位)的方法

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;
}

Bitmap转Himage(8位)的方法

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;
}

猜你喜欢

转载自blog.csdn.net/wr9zgo48/article/details/123821008