从轮廓生成 HALCON 区域
Generate HALCON region from contour
我在内部数据结构中有一个多边形,由代表像素坐标的二维点组成。我需要这个多边形作为 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 Variable Inspect,创建的区域 (hRegion
) 似乎是空的。 HRegion::IsInitialized
return 是正确的,但是 HRegion::AreaCenter
会 return 面积和位置都为零,这显然是错误的。
这些函数调用(例如 GenContourPolygonXld
)也有构造函数版本,使用 "iconic" 类型 HXLDCont
和 HRegion
,这会导致不正确的区域作为嗯。
我还尝试了序列化轮廓,将其保存在文件中并加载到 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。
会不会是您所在的区域部分超出了预定义的区域工作 space。意味着某些像素的坐标小于零?
如果是这样,您在加载之前需要做的就是运行这个命令:
set_system ('clip_region', 'false')
我在内部数据结构中有一个多边形,由代表像素坐标的二维点组成。我需要这个多边形作为 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 Variable Inspect,创建的区域 (hRegion
) 似乎是空的。 HRegion::IsInitialized
return 是正确的,但是 HRegion::AreaCenter
会 return 面积和位置都为零,这显然是错误的。
这些函数调用(例如 GenContourPolygonXld
)也有构造函数版本,使用 "iconic" 类型 HXLDCont
和 HRegion
,这会导致不正确的区域作为嗯。
我还尝试了序列化轮廓,将其保存在文件中并加载到 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。
会不会是您所在的区域部分超出了预定义的区域工作 space。意味着某些像素的坐标小于零?
如果是这样,您在加载之前需要做的就是运行这个命令:
set_system ('clip_region', 'false')