OpenCV调整大小在大图像上失败,在函数cv :: resize中出现"error:(-215)ssize.area()> 0"

use*_*217 24 opencv image image-processing python-3.x opencv3.0

我正在使用OpenCV 3.0.0和Python 3.4.3来处理非常大的RGB图像(107162,79553,3).我正在尝试使用以下代码调整它的大小:

import cv2
image = cv2.resize(img, (0,0), fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
Run Code Online (Sandbox Code Playgroud)

我有这个错误消息:
"cv2.error:C:\ opencv-3.0.0\source\modules\imgproc\src\imgwarp.cpp:3208:错误:(-215)ssize.area()> 0 in function cv :: resize"

我确定图像阵列中有图像内容,因为我可以将它们保存为jpg格式的小图块.当我尝试仅调整图像的一小部分时,没有问题,我最终得到了正确调整大小的图像.(拿一个相当大的块(50000,50000,3)仍然无法工作,但它可以工作在(10000,10000,3)块)

我想知道是什么原因导致这个问题以及如何解决这个问题?

谢谢

use*_*217 24

事实证明问题来自于以下一行modules\imgproc\src\imgwarp.cpp:

CV_Assert( ssize.area() > 0 );
Run Code Online (Sandbox Code Playgroud)

当要调整大小的图像的行和列的乘积大于2 ^ 31时,ssize.area()导致负数.这似乎是OpenCV中的一个错误,希望将来的版本中修复.临时解决方法是使用此行注释掉构建OpenCV.虽然不理想,但它对我有用.

我刚刚发现上述内容仅适用于宽度大于高度的图像.对于高度大于宽度的图像,它是导致错误的以下行:

CV_Assert( dsize.area() > 0 );
Run Code Online (Sandbox Code Playgroud)

所以这也必须被注释掉.

  • 你如何改变这行代码?文件位于何处? (6认同)
  • 是的,这很棒,但是我们在哪里可以找到该文件 (2认同)
  • 是一个解决方案,以修复发布/发现的这行代码? (2认同)

小智 9

还要注意你的 numpy 数组的对象类型,使用它来转换它.astype('uint8')为我解决了这个问题。


Kel*_*mby 8

事实证明,这个错误实际上是在说实话 - 我试图调整Null图像的大小,这通常是视频文件的"最后一帧",所以断言是有效的.

现在我在尝试调整大小操作之前还有一个额外的步骤,即自己做断言:

def getSizedFrame(width, height):
"""Function to return an image with the size I want"""    
    s, img = self.cam.read()

    # Only process valid image frames
    if s:
            img = cv2.resize(img, (width, height), interpolation = cv2.INTER_AREA)
    return s, img
Run Code Online (Sandbox Code Playgroud)

现在我没有看到错误.

  • 这是Google上的首个热门歌曲,应该予以推荐!!在开始注释掉openCV代码之前,请检查您的img,在预处理过程中解析几十个图像时,我遇到了完全相同的问题。 (2认同)