是否在opencv中复制并粘贴图像区域?

dfuffjeb  于 2022-12-13  发布在  其他
关注(0)|答案(3)|浏览(167)

我在本教程中遇到了一个问题,即ROI粘贴在同一图像的另一个区域上。当我尝试类似的操作时,Python出现了一个值错误:

img = cv2.imread(path, -1)
eye = img[349:307, 410:383]
img[30:180, 91:256] = eye

例外情况:

Traceback (most recent call last):
  File "test.py", line 13, in <module>
    img[30:180, 91:256] = eye
ValueError: could not broadcast input array from shape (0,0,3) into shape (150,165,3)

这可能是一个很新的问题,但是我在谷歌上搜索了一下,却没有找到答案。还有其他的 numpy 方法吗?
编辑:在教程中也没有指定坐标应该如何输入。例如:我可以输入我想要的区域的坐标,例如:eye = img[x1:y1, x2:y2]img[x1:x2, y1:y2]。这就是我困惑的地方。实际上我试图从一个打印鼠标点击位置的鼠标回调方法中获得这些坐标。所以,坐标肯定是来自图像内部的。

tp5buhyn

tp5buhyn1#

切片[349:307, 410:383]返回一个空数组eye,该数组无法分配给不同shape的数组视图。
例如:

In [8]: import cv2
   ...: fn=r'D:\Documents\Desktop\1.jpg'
   ...: img=cv2.imread(fn, -1)
   ...: roi=img[200:400, 200:300]

In [9]: roi.shape
Out[9]: (200, 100, 3)

In [10]: img2=img.copy()

In [11]: img2[:roi.shape[0], :roi.shape[1]]=roi

In [12]: cv2.imshow('img', img)
    ...: cv2.imshow('roi', roi)
    ...: cv2.imshow('img2', img2)
    ...: cv2.waitKey(0)
    ...: cv2.destroyAllWindows()

实验结果:
请注意,即使roi不是空数组,使用不匹配的形状进行赋值也会引发错误:

In [13]: img2[:100, :100]=roi
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-13-85de95cf3ded> in <module>()
----> 1 img2[:100, :100]=roi

ValueError: could not broadcast input array from shape (200,100,3) into shape (100,100,3)
pengsaosao

pengsaosao2#

我猜您的图像可能有问题。

ValueError: could not broadcast input array from shape (0,0,3) into shape (150,165,3)

所以eye看起来有维度(0,0,3),img有维度(150,165,3)。3对应于RGB,这是3个不同的颜色通道。所以你的原始图像是150 x165。但是你试图选择img[349:307,410:383]的一个区域。我怀疑因为你指定的区域在图像之外,它没有选择任何东西,因此维度(0,0,3)。
尝试导入pdb; pdb.set_trace()。这将弹出一个交互式的python终端,在那里你可以看到发生了什么。尝试看看img的尺寸是多少,它是否真的是你想要的。也许你下载的图像比导致错误的例子小。
看看first answer,你的方法看起来是正确的,所以试着把坐标调整到一个更小的区域。

vnzz0bqm

vnzz0bqm3#

img[349:307, 410:383]

is asking for the interpreter to find all the x values above 349 AND below 307, which is impossible, and will return a slice size 0. Turn your numbers around.

img[307,349, 383:413]

Also your dimensions are wrong. How can you put a slice of width 42 into a slice of width 150?

相关问题