line 21, in <module> qr_img_cv = cv2.cvtColor(cv2.UMat(np.asarray(qr_img)), cv2.COLOR_RGB2BGR) TypeError: UMat() missing required argument 'ranges' (pos 2)怎么解决
时间: 2024-02-25 19:55:42 浏览: 127
这个错误是因为在使用 `cv2.UMat()` 函数时缺少了 `ranges` 参数。`ranges` 参数是指像素值的范围,例如对于灰度图像,范围是 `[0, 256]`。如果你在使用 `cv2.UMat()` 函数时没有指定 `ranges` 参数,可以尝试添加它。例如,如果你正在处理灰度图像,可以这样写:
```
qr_img_cv = cv2.cvtColor(cv2.UMat(np.asarray(qr_img)), cv2.COLOR_GRAY2BGR, ranges=[0, 256])
```
如果你正在处理彩色图像,可以根据具体情况调整 `ranges` 参数。
相关问题
Traceback (most recent call last): File "D:\pythonProject\guidao.py", line 20, in <module> imggray = cv2.cvtColor(selected_files, cv2.COLOR_BGR2GRAY) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cv2.error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function 'cvtColor' > Overload resolution failed: > - src is not a numpy array, neither a scalar > - Expected Ptr<cv::UMat> for argument 'src'
根据错误信息看,是因为 `cvtColor` 函数的第一个参数需要是一个 numpy 数组,而 `selected_files` 是一个文件名列表,不是 numpy 数组。因此,你需要在读取每个文件时使用 OpenCV 的 `imread` 函数将其转换为 numpy 数组,然后再将其转换为灰度图像。
以下是修改后的代码:
```python
import os
import cv2
import random
# 文件夹路径
folder_path = "path/to/folder"
# 读取文件夹中所有文件名
files = os.listdir(folder_path)
# 随机选择 20 个文件
selected_files = random.sample(files, 20)
# 读取每个文件并转换为灰度图像
images = []
for file_name in selected_files:
file_path = os.path.join(folder_path, file_name)
img = cv2.imread(file_path)
imggray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
images.append(imggray)
# 显示灰度图像
for img in images:
cv2.imshow("Gray Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在上面的代码中,我们使用 `imread` 函数读取每个文件,并使用 `cvtColor` 函数将其转换为灰度图像。然后将每个灰度图像添加到 `images` 列表中。最后,我们循环显示每个灰度图像。
请注意,你需要将 `folder_path` 替换为你的文件夹路径。
这段代码的第38行运行不了 import cv2 import numpy as np # 读取左右两张图像 img_left = cv2.imread('share4/img_put/7/7.3/left_0.jpg', 0) img_right = cv2.imread('share4/img_put/7/7.3/right_0.jpg', 0) # 读取左右两张图像 img1 = cv2.imread('left.png', 0) img2 = cv2.imread('right.png', 0) img1 = cv2.UMat(img1) img2 = cv2.UMat(img2) # 初始化ORB特征点提取器和SGBM算法 orb = cv2.ORB_create() sgbm = cv2.StereoSGBM_create(minDisparity=0, numDisparities=128, blockSize=11) # 提取左右两幅图像的特征点 kp_left, desc_left = orb.detectAndCompute(img_left, None) kp_right, desc_right = orb.detectAndCompute(img_right, None) # 特征点匹配 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) matches = bf.match(desc_left, desc_right) # 根据特征点得到匹配窗口并进行立体匹配 disparities = np.zeros_like(img_left) for match in matches: pt_left = np.array(kp_left[match.queryIdx].pt, dtype=np.int) pt_right = np.array(kp_right[match.trainIdx].pt, dtype=np.int) win_size = 11 left_win = cv2.getRectSubPix(img_left, (win_size, win_size), tuple(pt_left)) right_win = cv2.getRectSubPix(img_right, (win_size, win_size), tuple(pt_right)) disparity = sgbm.compute(left_win, right_win).astype(np.float32) / 16.0 disparities[pt_left[1], pt_left[0]] = disparity # 显示视差图 cv2.imshow('disparities', disparities) cv2.waitKey()
这个问题可能是因为缺少了cv2或numpy模块。你需要在你的计算机上安装这些模块才能运行该程序。你可以通过在终端上使用pip命令来安装这些模块。例如,你可以输入"pip install opencv-python"来安装cv2模块,输入"pip install numpy"来安装numpy模块。
阅读全文