loc = cv2.findNonZero(res > threshold) cv2.error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function 'findNonZero' > Overload resolution failed: > - src data type = 0 is not supported > - Expected Ptr<cv::UMat> for argument 'src'
时间: 2023-08-28 21:17:37 浏览: 190
这个错误可能是由于输入的数组`res > threshold`不是一个NumPy数组而是一个OpenCV的矩阵或图像,导致了`cv2.findNonZero()`函数的错误。
为了解决这个问题,可以将`res > threshold`转换为NumPy数组,然后再传给`cv2.findNonZero()`函数。可以使用`np.array()`函数将OpenCV矩阵或图像转换为NumPy数组,示例如下:
```python
import numpy as np
# 将OpenCV矩阵或图像转换为NumPy数组
res_np = np.array(res > threshold, dtype=np.uint8)
# 在NumPy数组中查找非零像素的位置
loc = cv2.findNonZero(res_np)
```
在上述代码中,我们使用`np.array()`函数将`res > threshold`转换为了一个NumPy数组,并指定了数据类型为`np.uint8`,即无符号8位整型。然后,我们将该数组传给了`cv2.findNonZero()`函数,成功地找到了非零像素的位置。
需要注意的是,如果输入的数组是一个OpenCV的图像,可以使用`cv2.cvtColor()`函数将其转换为灰度图像或者其他格式的图像,然后再将其转换为NumPy数组。
相关问题
import cv2 import numpy as np def match_pattern(image, pattern): # 载入图像和模式 img = cv2.imread(image) pattern_img = cv2.imread(pattern) # 获取模式图像的宽高 pattern_height, pattern_width, _ = pattern_img.shape # 使用模板匹配算法进行匹配 result = cv2.matchTemplate(img, pattern_img, cv2.TM_CCOEFF_NORMED) # 设置匹配阈值 threshold = 0.8 # 寻找匹配结果中大于阈值的坐标 locations = np.where(result >= threshold) for loc in zip(*locations[::-1]): # 在原始图像上绘制矩形框标识匹配位置 cv2.rectangle(img, loc, (loc[0] + pattern_width, loc[1] + pattern_height), (0, 255, 0), 2) # 显示结果图像 cv2.imshow('Pattern Matching Result', img) cv2.waitKey(0) cv2.destroyAllWindows() # 调用函数进行模式匹配 match_pattern('rings.png', 'ring.png')
你好!你的代码看起来是对图像中的指定模式进行匹配,并在匹配位置上绘制矩形框。你调用了`match_pattern`函数,将原始图像和模式图像的文件名作为参数传递给函数。在这个例子中,你将原始图像命名为`rings.png`,将模式图像命名为`ring.png`。当你运行这段代码时,它会显示结果图像,其中匹配的位置用绿色矩形框标识出来。
请确保在运行代码之前,你已经安装了OpenCV库,并且将图像文件放置在正确的路径下。如果你想匹配不同的图像,可以将图像文件名替换成你自己的图像文件名。希望这能满足你的需求!如果有任何其他问题,请随时提问。
# 获取匹配程度大于阈值的所有位置 loc = np.where(res >= threshold) 错误
如果你遇到了`TypeError: '>=' not supported between instances of 'NoneType' and 'float'`错误,可能是因为在使用`cv2.matchTemplate()`函数时,没有正确地返回结果导致的。
`cv2.matchTemplate()`函数返回一个包含匹配结果的矩阵,你需要使用这个矩阵来查找匹配程度大于阈值的位置。如果匹配程度小于阈值,`cv2.matchTemplate()`函数会返回一个空矩阵,导致在使用`np.where()`函数时出错。
你可以在使用`cv2.matchTemplate()`函数之后,添加以下代码来检查是否成功返回了匹配结果矩阵:
```python
# 使用cv2.matchTemplate()函数进行模板匹配
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
# 检查是否成功返回了匹配结果矩阵
if res is None:
print("Failed to find template in image!")
return
# 查找匹配程度大于阈值的位置
loc = np.where(res >= threshold)
```
在这个示例中,如果`res`为空矩阵,就会输出一条错误信息并退出函数。如果`res`不为空,就会继续执行查找匹配位置的代码。
阅读全文