Halcon中的赋值拷贝、copy_obj和copy_image的区别

这里写自定义目录标题

三者区别

= 赋值:引用传递
在HDevelop或C++的HObject类中,直接用等号赋值,相当于让两个变量指向同一个对象实例。它们共享完全相同的内存资源,是“命运共同体”。

copy_obj:复制对象的引用,而非图像数据
这是你之前误解的地方。根据MVTec官方对 copy_obj 的说明:“没有为区域和图像分配新的存储空间。相反,创建了包含对现有对象引用的新对象。” 。

这意味着:copy_obj 确实创建了一个“新”的HALCON对象变量,但这个变量内部的指针,依然指向与原图相同的那一块像素数据内存。它更接近于其他编程语言中的“增加一个引用”,而非“克隆”。

copy_image:真正的物理拷贝
当你需要一张真正独立的图像时,应该使用 copy_image。官方文档明确指出:“与HALCON算子(如 copy_obj)相比,所有通道的物理副本均已创建。” 。

操作方式本质内存分配独立性速度适用场景
= (赋值)引用拷贝不分配新内存不独立,完全绑定极快临时用一个新变量名操作同一张图。
copy_obj句柄/引用拷贝不分配新像素内存不独立,共享像素数据需要复制图像的“外壳”(如区域、ROI信息)但不复制数据时,或需要复制对象数组中的某个对象引用。
copy_image物理拷贝 (深拷贝)分配全新的内存完全独立慢 (涉及内存分配和数据拷贝)需要真正修改图像的像素内容,且必须保留原始图像数据不变时。

注意
当你的后续操作(如 OverpaintGray、set_grayval 等)需要修改像素值,并且必须保证原图不被修改时,请务必使用 copy_image 来创建一份真正的物理拷贝。

例子说明

代码A:
CopyObj(hImageAffine, &hResultImage, 1, -1);
...
OverpaintGray(hResultImage, hImageScaled);
代码B:
CopyObj(hImageAffine, &hResultImage, 1, -1);
...
PaintGray(hImageScaled, hResultImage, &hResultImage);
  • 代码A (OverpaintGray)
    是原位修改。它直接改动 hResultImage 指向的那块内存,由于 hResultImage 和 hImageAffine 通过 copy_obj 共享同一块内存,所以原图被修改。

  • 代码B (PaintGray)
    是创建新图像。它读取 hResultImage 的像素数据,然后生成一张全新的图像,最后将这个新图像的句柄赋值给 hResultImage。整个过程没有改动 hResultImage 原来指向的那块共享内存,因此原图 hImageAffine 安然无恙。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值