【问题标题】:Generate HALCON region from contour从轮廓生成 HALCON 区域
【发布时间】:2020-03-30 08:50:24
【问题描述】:

我在内部数据结构中有一个多边形,由表示像素坐标的 2D 点组成。我需要这个多边形作为 HALCON 区域 (HRegion)。转换应该是这样发生的:

HTuple hCols, hRows;
for (auto n = 0; n < nNodes; ++n)
{
    auto v2dNode = GetNode(n);
    hCols.Append(v2dNode.GetX());
    hRows.Append(v2dNode.GetY());
}

HalconCpp::HObject hContour;
HalconCpp::GenContourPolygonXld(&hContour, hRows, hCols);

HalconCpp::HObject hRegion;
HalconCpp::GenRegionContourXld(hContour, &hRegion, "filled");

虽然轮廓 (HContour) 是有效的,但根据 Halcon 变量检查,创建的区域 (hRegion) 似乎是空的。 HRegion::IsInitialized 返回 true,但 HRegion::AreaCenter 会在面积和位置上都返回零,这显然是错误的。

这些函数调用的构造函数版本(例如GenContourPolygonXld)也使用“标志性”类型HXLDContHRegion,这也会导致区域不正确。

我还尝试将轮廓序列化,将其保存在文件中并将其加载到 HDevelop 中。在那里,相应的代码确实创建了一个有效区域:

open_file('D:/HContour.mvt', 'input_binary', hFile)
fread_serialized_item(hFile, hSer)
deserialize_xld(hContour, hSer)
close_file(hFile)
gen_region_contour_xld(hContour, hRegion, 'filled')
area_center(hRegion, Area, Row, Column)

在 C# 中,我还加载了该轮廓文件并尝试创建相应的区域。然而,这种方法也导致了一个错误的空白区域:

HObject hObj;
using (var hFile = new HFile(@"D:\\HContour.mvt", "input_binary"))
{
    FreadSerializedItem(hFile, out var hSerialized);
    DeserializeXld(out hObj, hSerialized);
}
var hContour = new HXLDCont(hObj);
var hRegion = hContour.GenRegionContourXld("filled");
var area = hRegion.AreaCenter(out double row, out var col);
Console.WriteLine($"Area: {area}, Center: {col}|{row}");

Halcon 版本是 12.0.3。

库中有错误,还是我在 C++ 和 C# 代码中做错了?


编辑:

在执行任何 Halcon 代码之前,进行以下设置:

HalconCpp::ResetObjDb(5000, 5000, 1);
HalconCpp::SetSystem("clip_region", "false");
HalconCpp::SetSystem("store_empty_region", "true");

所有坐标都在有效范围内,区域不被剪裁。

已经用于测试的轮廓是this

【问题讨论】:

    标签: c# c++ halcon


    【解决方案1】:

    可能是您的区域部分位于预定义区域工作空间之外。这意味着某些像素的坐标小于零?

    如果是这种情况,在加载之前你需要做的就是运行这个命令:

    set_system ('clip_region', 'false')
    

    【讨论】:

    • 一开始我也是这么想的,后来在代码前加了SetSystem("clip_region", "false"),没有成功。
    • 可以上传区域吗?
    • 我已经上传了轮廓。
    • 我已经复制了你的 C# 代码和剪辑区域解决了这个问题。还有 Halcon 12.0.3:有:subpixelhr-my.sharepoint.com/:i:/g/personal/… 没有:subpixelhr-my.sharepoint.com/:i:/g/personal/…
    • 你是对的。在 C++ 中,我对HalconCpp::SetSystem("clip_region", "false") 的调用来得太早了;中间有一些重置剪辑的第 3 方脚本。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2021-01-15
    • 1970-01-01
    • 2018-06-04
    • 2012-11-09
    • 2015-06-24
    • 2019-07-19
    相关资源
    最近更新 更多