Opencv:如何使用 rectangle() 函数在图像的副本而不是原始图像上绘制矩形?
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 this
tmp = img
只是创建一个指向标签 'img' 指向的同一图像的新指针。这就是为什么如果你编辑 tmp,你也会编辑 img。
您的代码:
tmp = img
正在引用相同的内存位置。基本上,tmp 和 img 都指向相同的内存地址。阅读此 post。
尝试:
tmp = numpy.copy(img)
这就是我想要完成的。我有一些图像,每个图像都有多个边界框。我想加载一张图片,在图片上绘制 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 this
tmp = img
只是创建一个指向标签 'img' 指向的同一图像的新指针。这就是为什么如果你编辑 tmp,你也会编辑 img。
您的代码:
tmp = img
正在引用相同的内存位置。基本上,tmp 和 img 都指向相同的内存地址。阅读此 post。
尝试:
tmp = numpy.copy(img)