【问题标题】:Copy and paste region of image in opencv?在opencv中复制和粘贴图像区域?
【发布时间】:2015-12-20 21:55:06
【问题描述】:

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

【问题讨论】:

    标签: python opencv image-processing


    【解决方案1】:

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

    例如:

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

    【讨论】:

    • 你怎么能把它放到别处呢?比如 x=10 和 y=30
    • 你的示例图片选择到底是什么鬼!
    【解决方案2】:

    我猜你的图片有问题。我们看看返回的错误

    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 个不同的颜色通道。所以你的原始图像是 150x165。但是您尝试在 img[349:307, 410:383] 处选择一个区域。我怀疑由于您指定的区域在图像之外,因此它没有选择任何东西,因此尺寸为 (0,0,3)。

    尝试导入 pdb; pdb.set_trace() 在您初始化 eye 的第二行之后。这会将您弹出一个交互式 python 终端,您可以在其中查看正在发生的事情。试着看看 img 的尺寸是多少,如果它真的是你想要的。可能您下载的图片比导致错误的示例小。

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

    【讨论】:

    • TY。编辑了问题,看看。
    • 从我链接的答案看来,您可以这样做:img[y1:y2, x1:x2]img[x1:x2, y1:y2]
    【解决方案3】:
    img[349:307, 410:383]
    

    要求解释器找出所有高于 349 和低于 307 的 x 值,这是不可能的,并且会返回一个大小为 0 的切片。把你的数字转过来。

    img[307,349, 383:413]
    

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

    【讨论】:

      猜你喜欢
      • 2012-03-25
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      相关资源
      最近更新 更多