繁体   English   中英

Opencv:如何使用 rectangle() 函数在图像的 COPY 而不是原始图像上绘制矩形?

[英]Opencv: How to use rectangle() function to draw a rectangle on a COPY of an image rather than the original image?

这就是我正在努力实现的目标。 我有一些图像与每个图像关联的多个边界框。 我想加载一个图像,在图像上绘制 box1,并将新图像保存为 image_1。 然后我想在图像上绘制box2,并将其保存为image_2。 我目前遇到的问题是 image_2 上有 box1 和 box2,而不仅仅是 box2。 每次绘制新的边界框时,我都试图通过保存图像的临时副本来规避这个问题,但似乎原始图像仍然以某种方式被修改。 如何创建加载的 img 的副本,以便在调用 opencv 的 rectangle() 函数时对副本的更改不会传播到加载的 img? 以下是我目前所拥有的。

for fname in boxes:
    img = cv2.imread(fname, -1)
    for i in range(len(boxes[fname])):
        x1, y1, x2, y2 = boxes[fname][i]
        tmp = img
        cv2.rectangle(tmp, (x1, y1), (x2, y2), (255,0,0), 2)
        cv2.imwrite(fname+str(i+1), tmp)

这可以使用 numpy 很容易地完成。

for i in range(len(boxes[fname])):
   temp = numpy.copy(img)
   .....

这确保您实际创建图像的副本,就像在 python 中一样

tmp = img

只是创建一个指向标签“img”指向的同一图像的新指针。 这就是为什么如果您编辑 tmp,您也会编辑 img。

你的代码在这里:

tmp = img

正在引用相同的内存位置。 基本上, tmp 和 img 都指向相同的内存地址。 阅读这篇文章

尝试:

tmp = numpy.copy(img)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM