三者区别
= 赋值:引用传递
在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 安然无恙。

7143

被折叠的 条评论
为什么被折叠?



