OpenCV resize fails on large image with "error: (-215) ssize.area() > 0 in function cv::resize"
OpenCV resize fails on large image with "error: (-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 in function cv::resize
我确定图像数组中有图像内容,因为我可以将它们保存为 jpg 格式的小图块。当我尝试调整图像的一小部分大小时,没有问题,我最终得到了正确调整大小的图像。 (取一个相当大的块 (50000,50000,3) 仍然行不通,但它可以用于 (10000,10000,3) 块)
什么可能导致这个问题,我该如何解决?
原来问题出在modules\imgproc\src\imgwarp.cpp
中的一行:
CV_Assert( ssize.area() > 0 );
当要调整大小的图片的行列乘积大于2^31时,ssize.area()结果为负数。这似乎是 OpenCV 中的一个错误,希望在未来的版本中得到修复。一个临时的修复方法是在构建 OpenCV 时将这一行注释掉。虽然不理想,但对我有用。
而且我最近才发现,以上仅适用于宽度大于高度的图像。对于高度大于宽度的图像,以下行会导致错误:
CV_Assert( dsize.area() > 0 );
所以这也必须注释掉。
对我来说这个错误实际上是在说实话 - 我试图调整 Null 图像的大小,它通常是视频文件的 'last' 帧,所以断言是有效的。
现在我在尝试调整大小操作之前有一个额外的步骤,即自己进行断言:
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
现在我没有看到错误。
对我来说,以下解决方法有效:
- 将数组拆分成更小的子数组
- 调整子数组的大小
- 再次合并子数组
这里是代码:
def split_up_resize(arr, res):
"""
function which resizes large array (direct resize yields error (addedtypo))
"""
# compute destination resolution for subarrays
res_1 = (res[0], res[1]/2)
res_2 = (res[0], res[1] - res[1]/2)
# get sub-arrays
arr_1 = arr[0 : len(arr)/2]
arr_2 = arr[len(arr)/2 :]
# resize sub arrays
arr_1 = cv2.resize(arr_1, res_1, interpolation = cv2.INTER_LINEAR)
arr_2 = cv2.resize(arr_2, res_2, interpolation = cv2.INTER_LINEAR)
# init resized array
arr = np.zeros((res[1], res[0]))
# merge resized sub arrays
arr[0 : len(arr)/2] = arr_1
arr[len(arr)/2 :] = arr_2
return arr
我知道这是一个非常古老的话题,但我遇到了同样的问题,这是由于图像名称中的空格。
例如
Image name: "hello o.jpg"
奇怪的是,通过删除空格,函数运行得很好。
Image name: "hello_o.jpg"
原来我在读取所有图像的文件夹末尾有一个 .csv 文件。
一旦我删除它就可以正常工作
确保它是所有图像并且您没有任何其他类型的文件
在我的例子中,我对图像进行了错误的修改。
我在检查图像形状时发现了问题。
print img.shape
还要注意你的 numpy 数组的对象类型,使用 .astype('uint8')
转换它解决了我的问题。
我在 MacOS 上安装的是 OpenCV 3.4.3 版。
我遇到了与上述相同的错误。
我更改了我的代码
frame = cv2.resize(frame, (0,0), fx=0.5, fy=0.5)
至
frame = cv2.resize(frame, None, fx=0.5, fy=0.5)
现在它对我来说工作正常。
我正在处理 3 个文件:python 脚本、图像和训练模型。
当我将这 3 个文件移动到它们自己的文件夹 而不是与其他 python 脚本所在的目录中时,一切正常。
出现这种错误也是因为resize无法简单获取图片
图片的目录可能是 wrong.In 我的情况是我在提供文件位置时留下了正斜杠,这个错误发生在我把斜杠问题解决后。
您可以在代码中手动检查。像这样:
if result != []:
for face in result:
bounding_box = face['box']
x, y, w, h = bounding_box[0], bounding_box[1], bounding_box[2], bounding_box[3]
rect_face = cv2.rectangle(frame, (x, y), (x+w, y+h), (46, 204, 113), 2)
face = rgb[y:y+h, x:x+w]
#CHECK FACE SIZE (EXIST OR NOT)
if face.shape[0]*face.shape[1] > 0:
predicted_name, class_probability = face_recognition(face)
print("Result: ", predicted_name, class_probability)
我有同样的错误。调整图像大小解决了这个问题。但是,我使用在线工具调整图像大小,因为使用枕头调整图像大小并没有解决我的问题。
就我而言,
image = cv2.imread(filepath)
final_img = cv2.resize(image, size_img)
文件路径不正确,cv2.imshow 在这种情况下没有给出任何错误,但由于路径错误 cv2.resize 给我错误。
我在尝试放大图像大小时遇到了相同的错误消息。将图像类型指定为 uint8 为我完成了工作,我能够将图像的大小调整为原始大小的 30 倍。这是一个例子,供遇到此类问题的其他人参考。
scale_percent = 3000
width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent /100)
dim = (width, height)
image = cv2.resize(img.astype('uint8'), dim, interpolation=cv2.INTER_AREA)
我正在使用 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 in function cv::resize
我确定图像数组中有图像内容,因为我可以将它们保存为 jpg 格式的小图块。当我尝试调整图像的一小部分大小时,没有问题,我最终得到了正确调整大小的图像。 (取一个相当大的块 (50000,50000,3) 仍然行不通,但它可以用于 (10000,10000,3) 块)
什么可能导致这个问题,我该如何解决?
原来问题出在modules\imgproc\src\imgwarp.cpp
中的一行:
CV_Assert( ssize.area() > 0 );
当要调整大小的图片的行列乘积大于2^31时,ssize.area()结果为负数。这似乎是 OpenCV 中的一个错误,希望在未来的版本中得到修复。一个临时的修复方法是在构建 OpenCV 时将这一行注释掉。虽然不理想,但对我有用。
而且我最近才发现,以上仅适用于宽度大于高度的图像。对于高度大于宽度的图像,以下行会导致错误:
CV_Assert( dsize.area() > 0 );
所以这也必须注释掉。
对我来说这个错误实际上是在说实话 - 我试图调整 Null 图像的大小,它通常是视频文件的 'last' 帧,所以断言是有效的。
现在我在尝试调整大小操作之前有一个额外的步骤,即自己进行断言:
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
现在我没有看到错误。
对我来说,以下解决方法有效:
- 将数组拆分成更小的子数组
- 调整子数组的大小
- 再次合并子数组
这里是代码:
def split_up_resize(arr, res):
"""
function which resizes large array (direct resize yields error (addedtypo))
"""
# compute destination resolution for subarrays
res_1 = (res[0], res[1]/2)
res_2 = (res[0], res[1] - res[1]/2)
# get sub-arrays
arr_1 = arr[0 : len(arr)/2]
arr_2 = arr[len(arr)/2 :]
# resize sub arrays
arr_1 = cv2.resize(arr_1, res_1, interpolation = cv2.INTER_LINEAR)
arr_2 = cv2.resize(arr_2, res_2, interpolation = cv2.INTER_LINEAR)
# init resized array
arr = np.zeros((res[1], res[0]))
# merge resized sub arrays
arr[0 : len(arr)/2] = arr_1
arr[len(arr)/2 :] = arr_2
return arr
我知道这是一个非常古老的话题,但我遇到了同样的问题,这是由于图像名称中的空格。
例如
Image name: "hello o.jpg"
奇怪的是,通过删除空格,函数运行得很好。
Image name: "hello_o.jpg"
原来我在读取所有图像的文件夹末尾有一个 .csv 文件。 一旦我删除它就可以正常工作
确保它是所有图像并且您没有任何其他类型的文件
在我的例子中,我对图像进行了错误的修改。
我在检查图像形状时发现了问题。
print img.shape
还要注意你的 numpy 数组的对象类型,使用 .astype('uint8')
转换它解决了我的问题。
我在 MacOS 上安装的是 OpenCV 3.4.3 版。 我遇到了与上述相同的错误。
我更改了我的代码
frame = cv2.resize(frame, (0,0), fx=0.5, fy=0.5)
至
frame = cv2.resize(frame, None, fx=0.5, fy=0.5)
现在它对我来说工作正常。
我正在处理 3 个文件:python 脚本、图像和训练模型。
当我将这 3 个文件移动到它们自己的文件夹 而不是与其他 python 脚本所在的目录中时,一切正常。
出现这种错误也是因为resize无法简单获取图片 图片的目录可能是 wrong.In 我的情况是我在提供文件位置时留下了正斜杠,这个错误发生在我把斜杠问题解决后。
您可以在代码中手动检查。像这样:
if result != []:
for face in result:
bounding_box = face['box']
x, y, w, h = bounding_box[0], bounding_box[1], bounding_box[2], bounding_box[3]
rect_face = cv2.rectangle(frame, (x, y), (x+w, y+h), (46, 204, 113), 2)
face = rgb[y:y+h, x:x+w]
#CHECK FACE SIZE (EXIST OR NOT)
if face.shape[0]*face.shape[1] > 0:
predicted_name, class_probability = face_recognition(face)
print("Result: ", predicted_name, class_probability)
我有同样的错误。调整图像大小解决了这个问题。但是,我使用在线工具调整图像大小,因为使用枕头调整图像大小并没有解决我的问题。
就我而言,
image = cv2.imread(filepath)
final_img = cv2.resize(image, size_img)
文件路径不正确,cv2.imshow 在这种情况下没有给出任何错误,但由于路径错误 cv2.resize 给我错误。
我在尝试放大图像大小时遇到了相同的错误消息。将图像类型指定为 uint8 为我完成了工作,我能够将图像的大小调整为原始大小的 30 倍。这是一个例子,供遇到此类问题的其他人参考。
scale_percent = 3000
width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent /100)
dim = (width, height)
image = cv2.resize(img.astype('uint8'), dim, interpolation=cv2.INTER_AREA)