从C++内存读图转换成HObject变量,使用GenImage1遇到问题解决

在Halcon中,通过C++进行图像处理时,发现调用GenImage1生成图像后,先前创建的区域(如GenCircle生成的圆)会变得异常。问题在于GenImage1必须在创建ROI之前执行,以确保ROI与图像数据关联正确。调整代码顺序后,问题得到解决,ROI生成和操作恢复正常。

Halcon联合C++编程

问题1:从C++内存读图转换成HObject变量,使用GenImage1,从指向像素的指针创建一个图像:

如果是先生成了一个(GenCircle)圆区域,然后执行GenImage1,会使区域异常,区域没了。

// 先生成圆regionCircle1
HObject regionCircle1;
int CircleRow = // 972
int CircleCol = // 1180
int CircleRadius = // 100
GenCircle(&regionCircle1, CircleRow, CircleCol, CircleRadius);

GenImage1(&image, "byte", Image->width, Image->height, (Hlong)Image->image); // 作用是将C++中的内存转换为Halcon的图像类型

// 后生成圆regionCircle2
HObject regionCircle2;
GenCircle(&regionCircle2, 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(&regionCircle1, CircleRow, CircleCol, CircleRadius);

// 生成圆regionCircle2
HObject regionCircle2;
GenCircle(&regionCircle2, 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之后。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值