У меня есть многоугольник, состоящий из 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 Variable Inspect, созданный регион (hRegion
) кажется пустым. HRegion::IsInitialized
возвращает true, а HRegion::AreaCenter
вернет ноль как для площади, так и для положения, что явно неверно.
Существуют также конструкторские версии вызовов этих функций (например, GenContourPolygonXld
), использующие "знаковые" типы 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");
Все координаты находятся в допустимом диапазоне, а области не обрезаны.
Для тестирования использовался этот контур.