Генерация области HALCON из контура

У меня есть многоугольник, состоящий из 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)

Contour Соответствующий регион

В 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");

Все координаты находятся в допустимом диапазоне, а области не обрезаны.

Для тестирования использовался этот контур.


person Matz    schedule 05.12.2019    source источник


Ответы (1)


Возможно, ваш регион частично находится за пределами предопределенного рабочего пространства региона. Имеется в виду, что некоторые пиксели имеют координаты меньше нуля?

Если это так, все, что вам нужно сделать перед загрузкой, это запустить эту команду:

set_system ('clip_region', 'false')
person Vladimir Perković    schedule 05.12.2019
comment
Я тоже сначала так думал, но потом безуспешно добавил SetSystem("clip_region", "false") перед кодом. - person Matz; 05.12.2019
comment
Не могли бы вы загрузить регион? - person Vladimir Perković; 05.12.2019
comment
Я загрузил контур. - person Matz; 06.12.2019
comment
Я скопировал ваш код С#, и область клипа решила проблему. Также Halcon 12.0.3: с: subpixelhr-my.sharepoint.com/:i:/g/personal/ Без: subpixelhr-my.sharepoint.com/:i:/g/personal/ - person Vladimir Perković; 06.12.2019
comment
Ты прав. В C++ мой вызов HalconCpp::SetSystem("clip_region", "false") пришел слишком рано; между ними были некоторые сторонние сценарии, которые сбрасывали отсечение. Спасибо! - person Matz; 06.12.2019