Halcon - аффинное преобразование для сопоставления модели NCC с уменьшенным изображением с использованием пирамиды изображений.

Привет, у меня проблема с аффинным преобразованием соответствия модели NCC (NumLevel 4, потому что у меня большое изображение).

Я создал модель NCC в уменьшенном изображении пирамиды (GenGaussPyramid). Затем найдите модель NCC в уменьшенном изображении.

Кто-нибудь знает, как аффинно перенести найденную область модели обратно в исходное изображение (NumLevel 1)?


person nonadoes    schedule 28.08.2020    source источник
comment
Здравствуйте, а размер изображения? Вы пробовали Halcon XL? Он может обрабатывать изображения размером более 32768 x 32768.   -  person Andrea Mannari    schedule 28.08.2020
comment
Да, я использую HalconXL. Проблема в том, что создание и поиск модели займет очень много времени.   -  person nonadoes    schedule 29.08.2020
comment
Предположим, что для функции gen_gauss_pyramid вы использовали масштаб =0,5. Исходное изображение 640 х 480 до 4-го уровня составляет 80 х 60 пикселей. Если вы нашли объект на изображении 80 x 60 и сделали ошибку положения в 1 пиксель, а затем перешли непосредственно к исходному изображению, вы найдете объект с ошибкой положения в 8 пикселей.   -  person Andrea Mannari    schedule 31.08.2020
comment
Алгоритм поиска при работе с пирамидными изображениями ищет объект до 4-го уровня, а когда находит, то ищет на 3-м уровне в ближней позиции, найденной на 4-м уровне. После того, как он найдет объект на 3-м уровне, он будет искать на 2-м уровне в ближней позиции, найденной на 3-м уровне. Это до 1-го уровня. Таким образом, он будет искать объект 4 раза (на уровнях с 1 по 3 он будет искать объект с уменьшенным доменом). В этом случае погрешность будет очень низкой. Итак, вы уверены, что хотите перейти с 4-го уровня сразу на 1-й уровень?   -  person Andrea Mannari    schedule 31.08.2020
comment
я точно понимаю, что вы имеете в виду. Приходится пропускать алгоритм автопоиска разного уровня. Причина в том, что область ROI/reduce все еще слишком велика для обучения и поиска. Это занимает очень много времени. Итак, что я делаю, так это обучаю и ищу все переходы к уменьшенному изображению, чтобы ускорить обучение и поиск.   -  person nonadoes    schedule 01.09.2020
comment
И моя проблема сейчас похожа на то, что вы описали. мои результаты аффинной транс-области обратно к исходному изображению имеют ошибку положения на много пикселей из-за высокого уровня num.   -  person nonadoes    schedule 01.09.2020


Ответы (1)


Я сделал вам небольшую демонстрацию. В ядре написано обратное аффинное преобразование.

Здесь код

* test image with the pattern (circle)
gen_image_const (EmptyImage, 'byte', 640, 480)
OriginalRow :=240
OriginalColumn  := 400
OriginalRadius := 8
gen_circle (Circle, OriginalRow ,OriginalColumn, OriginalRadius)
gen_circle_contour_xld (CircleXLD, OriginalRow, OriginalColumn, OriginalRadius, 0, 6.28318, 'positive', 0.1)
paint_xld (CircleXLD, EmptyImage, OriginalTestImage, 255)

dev_display (OriginalTestImage)
dev_set_draw ('margin')
dev_set_color ('blue')
dev_display (CircleXLD)
stop()

* creation of pyramid image
Scale := 0.5
gen_gauss_pyramid (OriginalTestImage, ImagePyramid, 'weighted', Scale)

LevelIndex := 4
select_obj (ImagePyramid, Level, LevelIndex )

* ideal found circle
LevelScale := pow(Scale,LevelIndex-1)
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_translate (HomMat2DIdentity, OriginalRow*LevelScale -OriginalRow, OriginalColumn*LevelScale - OriginalColumn, HomMat2DTranslate)
hom_mat2d_scale (HomMat2DTranslate, LevelScale, LevelScale, OriginalRow*LevelScale+0.5, OriginalColumn*LevelScale+0.5, HomMat2DScale)
affine_trans_contour_xld (CircleXLD, IdealFoundCircleXLD, HomMat2DScale)

* simulation of searching in the 4th level
threshold_sub_pix (Level, Border, 128)
area_center_xld (Border, Area, FoundRow, FoundColumn, _)
FoundRadius:= sqrt(Area/3.14)
gen_circle_contour_xld (FoundCircleXLD, FoundRow, FoundColumn, FoundRadius, 0, 6.28318, 'positive', 0.1)

dev_display (Level)
dev_set_draw ('margin')
dev_set_color ('green')
dev_display (IdealFoundCircleXLD)
dev_set_color ('red')
dev_display (FoundCircleXLD)
stop()

* reverse affine transformation
ReverseLevelScale := pow(1/Scale,LevelIndex-1)
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_translate (HomMat2DIdentity, FoundRow*ReverseLevelScale -FoundRow, FoundColumn*ReverseLevelScale - FoundColumn, HomMat2DTranslate)
hom_mat2d_scale (HomMat2DTranslate, ReverseLevelScale, ReverseLevelScale, FoundRow*ReverseLevelScale+0.5, FoundColumn*ReverseLevelScale+0.5, HomMat2DScale)

affine_trans_contour_xld (IdealFoundCircleXLD, ReverseIdealFoundCircleXLD, HomMat2DScale)
affine_trans_contour_xld (FoundCircleXLD, ReverseFoundCircleXLD, HomMat2DScale)

dev_display (OriginalTestImage)
dev_set_draw ('margin')
dev_set_color ('blue')
dev_display (CircleXLD)
dev_set_color ('green')
dev_display (ReverseIdealFoundCircleXLD)
dev_set_color ('red')
dev_display (ReverseFoundCircleXLD)
stop()
person Andrea Mannari    schedule 02.09.2020