Я пытаюсь создать программу WinForms, которая показывает результат процедуры Halcon. Эта процедура (на данный момент) представляет собой вариант обнаружения_mura_defects_texture, которую я адаптировал и превратил в hdvp.
Дело в том, что я не знаю, как показать defects, выбранный функцией select_mask_obj. На данный момент моя процедура Halcon такова:
decompose3(Image, R, G, B)
get_image_size(B, Width, Height)
rft_generic(B, ImageFFT, 'to_freq', 'none', 'complex', Width)
gen_gauss_filter(ImageGauss, 50, 50, 0, 'n', 'rft', Width, Height)
convol_fft(ImageFFT, ImageGauss, ImageConvol)
rft_generic(ImageConvol, IlluminationImage, 'from_freq', 'none', 'byte', Width)
sub_image(B, IlluminationImage, ImageSub, 2, 100)
median_image(ImageSub, ImageMedian, 'circle', 9, 'mirrored')
watersheds_threshold(ImageMedian, Basins, 20)
cooc_feature_image(Basins, ImageMedian, 6, 0, Energy, Correlation, Homogeneity, Contrast)
Mask := Energy [<=] 0.05
select_mask_obj(Basins, Defects, Mask)
dev_open_window(0, 0, 640, 480, 'green', WindowHandle)
dev_display(Image)
dev_display(Defects)
return ()
В моем приложении WinForms я могу выполнить процедуру Halcon и показать результат в «Halcon.DotNet.HWindowControl» (я пробовал это с другими процедурами Halcon, которые возвращают изображение), но я не знаю, как получить « Дефекты», которые этот скрипт рассчитывает и отображает в hWindowControl1.
private void ImageJoinBtn_Click (object sender, EventArgs e) {
string procedureName = selectHalconProcedure.Text;
switch (procedureName.Split(' ')[0]) {
case "0":
JoinTwoImagesProcedure();
break;
case "1":
GetDefectsProcedure();
break;
}
}
private void GetDefectsProcedure () {
try {
ING_Halcon halconScript = new ING_Halcon(HALCON_SCRIPTS_LIST[SCRIPT_TWO]);
halconScript.SetInputImage("Image", img1HParam);
halconScript.Execute();
var defects = halconScript.GetParamTupleImage("Defects");
HWindow hWin = hWindowControl1.HalconWindow;
HImage result = img1HParam;
hWin.DispImage(result);
hWin.DispObj(defects); // TODO: this instruction do nothing.
}
catch (Exception exc) {
Console.WriteLine($"GetDefectsProcedure Exception:\n\t{exc}.");
}
}
Спасибо за вашу помощь





На самом деле решение очень простое. Мой элемент управления HWindow «hwin» не был запрограммирован на увеличение или уменьшение масштаба. Я также не мог перетащить изображение, которое выглядело слишком увеличенным. Чтобы решить эту проблему, просто измените окно инструмента «HWindowControl» на «HSmartWindowControl». Вам также необходимо запланировать событие «Загрузка» следующим образом.
private void Form1_Load(object sender, EventArgs e) {
hWin = hSmartWindowControl1.HalconWindow; // "hWin" has a private variable now.
hSmartWindowControl1.MouseWheel += hSmartWindowControl1.HSmartWindowControl_MouseWheel;
}
Возможно, что элементы, полученные функцией hWin.DispObj(...), могут выглядеть белыми на изображении в оттенках серого, поэтому они могут не сильно выделяться в вашем приложении. Можно изменить, добавив:
hWin.SetColor("green");
hWin.SetLineWidth(5);
Ссылка: SetColor и SetLineWidth.