OpenCV 在大图像上调整大小失败,出现“错误:(-215) ssize.area() > 0 in function cv::resize”

新手上路,请多包涵

我正在使用 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)

我收到此错误消息:

cv2.error: C:\opencv-3.0.0\source\modules\imgproc\src\imgwarp.cpp:3208: error: (-215) ssize.area() > 0 函数 cv::resize

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

是什么导致了这个问题,我该如何解决?

原文由 user3667217 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

所以事实证明问题来自 modules\imgproc\src\imgwarp.cpp 中的一行:

 CV_Assert( ssize.area() > 0 );

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

而且我最近才发现以上仅适用于宽度大于高度的图像。对于高度大于宽度的图像,以下行会导致错误:

 CV_Assert( dsize.area() > 0 );

所以这也必须被注释掉。

原文由 user3667217 发布,翻译遵循 CC BY-SA 3.0 许可协议

结果对我来说这个错误实际上是在说实话——我试图调整一个 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

现在我没有看到错误。

原文由 Kelton Temby 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题