cv2.error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function 'imshow' > Overload resolution failed: > - mat is not a numerical tuple > - Expected Ptr<cv::cuda::GpuMat> for argument 'mat' > - Expected Ptr<cv::UMat> for argument 'mat'
时间: 2023-06-10 08:05:16 浏览: 1712
这个错误通常是由于 imshow() 函数传递了错误的参数导致的,具体原因可能是图像数据类型不匹配、图像大小不匹配,或者是传入的参数为空值等。建议您检查一下代码中传递给 imshow() 函数的参数是否正确,也可以尝试使用其他函数或方法来显示图像,比如 cv2.namedWindow() 和 cv2.imshow()。如果问题仍然存在,可以尝试更新或重新安装 OpenCV 库,或者查看一下 OpenCV 官方文档以获得更多帮助。
相关问题
Traceback (most recent call last): File "C:\Users\l\Desktop\临时文件夹\Python入门\ks_txzq.py", line 29, in <module> cv2.imshow('Rotated Image', enhancer) cv2.error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function 'imshow' > Overload resolution failed: > - mat is not a numpy array, neither a scalar > - Expected Ptr<cv::cuda::GpuMat> for argument 'mat' > - Expected Ptr<cv::UMat> for argument 'mat'
根据错误提示,`cv2.imshow()`函数的参数`enhancer`不是numpy数组,也不是标量,因此出现了错误。这可能是因为在`enhancer`变量中存储的是Pillow库中的Image对象,而`cv2.imshow()`函数需要的是OpenCV中的numpy数组。要解决这个问题,可以使用Pillow库中的`np.array()`函数将Image对象转换为numpy数组,然后将转换后的数组传递给`cv2.imshow()`函数。
以下是一种可能的解决方案:
```python
from PIL import Image, ImageEnhance
import cv2
import numpy as np
# 打开图像
img = Image.open('image.jpg')
# 旋转图像
rotated = img.rotate(45)
# 增强图像对比度
enhancer = ImageEnhance.Contrast(rotated).enhance(1.5)
# 将Image对象转换为numpy数组
enhancer_arr = np.array(enhancer)
# 显示处理后的图像
cv2.imshow('Rotated and Enhanced Image', enhancer_arr)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在这个解决方案中,我们首先使用Pillow库中的`np.array()`函数将Image对象`enhancer`转换为numpy数组`enhancer_arr`,然后将`enhancer_arr`传递给`cv2.imshow()`函数。这样就可以正确显示处理后的图像了。
error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function 'imencode' > Overload resolution failed: > - img is not a numpy array, neither a scalar > - Expected Ptr<cv::UMat> for argument 'img'
这个错误通常是因为`img`不是numpy数组或者cv::UMat指针类型导致的。可以检查一下`img`的类型,确保它是numpy数组,并且在调用`cv2.imencode()`函数时,将numpy数组传递给`img`参数。
如果`img`确实是numpy数组,那么可以将其转换为cv::UMat类型,然后再传递给`cv2.imencode()`函数。可以使用`cv2.UMat()`函数将numpy数组转换为cv::UMat类型,如下所示:
```
import cv2
import os
# 读取灰度图像
img_path = 'gray_image.jpg'
img = cv2.imread(img_path, 0)
# 将numpy数组转换为cv::UMat类型
img_um = cv2.UMat(img)
# 设置JPEG压缩参数
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 90]
# 进行JPEG压缩
with open(img_path, 'rb') as f:
img_data = f.read()
result, compress_img = cv2.imencode('.jpg', img_um, encode_param)
# 计算压缩率
original_size = os.path.getsize(img_path)
compress_size = compress_img.size
compression_ratio = original_size / compress_size
# 解码压缩图像
decompress_img = cv2.imdecode(compress_img, 0)
# 显示压缩前后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Compressed Image', decompress_img)
print('Compression Ratio:', compression_ratio)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这样可以将numpy数组转换为cv::UMat类型,避免传递错误的参数类型。
阅读全文