在opencv中复制和粘贴图像区域?

时间:2015-09-23 14:12:28

标签: python opencv image-processing

我坚持在this教程中,将ROI粘贴到同一图像的另一个区域。当我尝试类似的东西时,Python会出现一个值错误:

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

Exeption:

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]。这让我很困惑。实际上我试图通过鼠标回调方法获取这些坐标,该方法打印了鼠标点击的位置。因此,坐标肯定来自图像内部。

3 个答案:

答案 0 :(得分:5)

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

E.g:

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()

结果:

img&amp; ROI:

img roi

IMG2:

img2

请注意,即使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)

答案 1 :(得分:2)

我猜你的形象有些不对劲。让我们看一下返回的错误

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

因此,眼睛似乎具有尺寸(0,0,3),而img具有尺寸(150,165,3)。 3对应于RGB,它是3种不同的颜色通道。所以你的原始图像是150x165。但你试图在img [349:307,410:383]选择一个区域。我怀疑,因为你指定的区域在图像之外,它没有选择任何东西,因此尺寸(0,0,3)。

尝试导入pdb;在初始化眼睛的第二行之后的pdb.set_trace()。这将使您进入一个交互式python终端,在那里您可以看到正在发生的事情。试着看看img的尺寸是什么,以及它是否真的是你想要的。也许您下载的图像小于导致错误的示例。

查看first answer类似的问题。获取roi的方法看起来是正确的,所以尝试将坐标调整到适合的较小区域。

答案 2 :(得分:0)

img[349:307, 410:383]

要求解释器找到349以上和307以下的所有x值,这是不可能的,并且将返回切片大小0.转动你的数字。

img[307,349, 383:413]

您的尺寸也是错误的。如何将宽度为42的切片放入宽度为150的切片中?