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