Halcon联合C++编程
问题1:从C++内存读图转换成HObject变量,使用GenImage1,从指向像素的指针创建一个图像:
如果是先生成了一个(GenCircle)圆区域,然后执行GenImage1,会使区域异常,区域没了。
// 先生成圆regionCircle1
HObject regionCircle1;
int CircleRow = // 972
int CircleCol = // 1180
int CircleRadius = // 100
GenCircle(®ionCircle1, CircleRow, CircleCol, CircleRadius);
GenImage1(&image, "byte", Image->width, Image->height, (Hlong)Image->image); // 作用是将C++中的内存转换为Halcon的图像类型
// 后生成圆regionCircle2
HObject regionCircle2;
GenCircle(®ionCircle2, 972, 1180, 100);
// 结果显示
HObject tempImage;
RegionToBin(regionCircle1, &tempImage, 255, 0, hv_Width, hv_Height);
WriteImage(tempImage, "png", 0, "E://1.png"); // 异常区域
RegionToBin(regionCircle2, &tempImage, 255, 0, hv_Width, hv_Height);
WriteImage(tempImage, "png", 0, "E://2.png"); // 正常区域
结果区域图:
修改代码:
// 这句话放到最前面
GenImage1(&image, "byte", Image->width, Image->height, (Hlong)Image->image); // 作用是将C++中的内存转换为Halcon的图像类型
// 生成圆regionCircle1
HObject regionCircle1;
int CircleRow = // 972
int CircleCol = // 1180
int CircleRadius = // 100
GenCircle(®ionCircle1, CircleRow, CircleCol, CircleRadius);
// 生成圆regionCircle2
HObject regionCircle2;
GenCircle(®ionCircle2, 972, 1180, 100);
// 结果显示
HObject tempImage;
RegionToBin(regionCircle1, &tempImage, 255, 0, hv_Width, hv_Height);
WriteImage(tempImage, "png", 0, "E://1.png"); // 调整后正常区域
RegionToBin(regionCircle2, &tempImage, 255, 0, hv_Width, hv_Height);
WriteImage(tempImage, "png", 0, "E://2.png"); // 正常区域
结论:生成ROI和调用要在GenImage1之后。
在Halcon中,通过C++进行图像处理时,发现调用GenImage1生成图像后,先前创建的区域(如GenCircle生成的圆)会变得异常。问题在于GenImage1必须在创建ROI之前执行,以确保ROI与图像数据关联正确。调整代码顺序后,问题得到解决,ROI生成和操作恢复正常。
1081






