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'
时间: 2023-06-09 14:04:10 浏览: 1914
这个错误是由于imshow函数的参数不正确而引起的。根据错误信息,有可能是你传递给函数的参数不是一个numpy数组,也可能是mat参数需要传递一个指向cv::cuda::GpuMat或cv::UMat的指针。请检查你的代码,确保传递给imshow函数的参数是numpy数组或者是正确的指针类型,或者提供更多的代码信息以便我更好地帮助你解决问题。
相关问题
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类型,避免传递错误的参数类型。
阅读全文