OpenCV新手使用cv2.resize遇SystemError:参数非元组格式问题求助
解决cv2.resize报错SystemError的问题
Hey there! 作为OpenCV新手遇到这个问题很正常,我帮你分析下这个错误的常见原因和解决办法:
错误核心原因
这个SystemError: new style getargs format but argument is not a tuple错误,绝大多数情况下是因为你给cv2.resize()传递的尺寸参数格式不对。OpenCV的resize函数对第二个参数dsize有严格要求——必须是**(宽度, 高度)**的元组,不能是单个数值、列表或者其他格式。
常见问题场景&修复方案
1. 错误传递尺寸参数
比如你可能写成了这样(错误示例):
# 错误:把尺寸拆成两个单独参数,或者传了列表 resized_img = cv2.resize(img_np, 28, 28) # 或者 resized_img = cv2.resize(img_np, [28, 28])
正确的写法应该是把尺寸打包成元组:
# 正确:dsize是(宽度, 高度)的元组 resized_img = cv2.resize(img_np, (28, 28))
2. 确认PIL转numpy数组的正确性
用np.array(pil_image_rgb)转换PIL图像到numpy数组本身是没问题的,转出来的数组形状应该是(H, W, 3)(高度、宽度、通道数),你可以先打印下数组形状确认:
img_np = np.array(pil_image_rgb) print(img_np.shape) # 应该输出类似(xxx, xxx, 3)的结果
如果形状异常(比如通道数不对、是单通道图像),可能需要先把PIL图像转为RGB格式:
pil_image_rgb = Image.open("your_image_path").convert("RGB")
完整可运行示例代码
这里给你一个完整的流程示例,确保每一步都正确:
from PIL import Image import cv2 import numpy as np # 1. 读取图像并转为RGB格式 pil_img = Image.open("test_image.jpg").convert("RGB") # 2. 转换为numpy数组 img_array = np.array(pil_img) # 3. 正确调用cv2.resize,尺寸用元组(28,28) resized_img = cv2.resize(img_array, (28, 28)) # 4. 验证结果形状 print("调整后图像形状:", resized_img.shape) # 应该输出(28, 28, 3)
按照这个步骤走,应该就能解决你遇到的错误了。如果还有问题,可以检查下自己代码中cv2.resize的参数传递细节,或者确认输入图像的格式是否正常。
内容的提问来源于stack exchange,提问作者Saurabh




