[ WARN:0] global /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (933) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1 Traceback (most recent call last): File "color.py", line 50, in <module> find_template(template_path, video_device) File "color.py", line 28, in find_template loc = cv2.where(result >= threshold) AttributeError: module 'cv2' has no attribute 'where'
时间: 2024-04-23 10:28:27 浏览: 221
非常抱歉,我之前给出的示例代码中存在错误。在OpenCV中,`cv2.where`函数不存在,所以导致了`AttributeError: module 'cv2' has no attribute 'where'`的错误。
请改用`cv2.findNonZero`函数来获取匹配结果大于阈值的位置。以下是更新后的示例代码:
```python
import cv2
import numpy as np
def find_template(template_path, video_device):
# 读取模板图片
template = cv2.imread(template_path, 0)
# 打开视频流
cap = cv2.VideoCapture(video_device)
while True:
# 读取视频帧
ret, frame = cap.read()
if not ret:
print("无法读取视频流")
break
# 转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 进行模板匹配
result = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)
# 设置匹配阈值
threshold = 0.8
# 获取匹配结果大于阈值的位置
loc = np.where(result >= threshold)
# 在原始图像中绘制矩形框
for pt in zip(*loc[::-1]):
cv2.rectangle(frame, pt, (pt[0] + template.shape[1], pt[1] + template.shape[0]), (0, 255, 0), 2)
# 显示图像
cv2.imshow('Video', frame)
# 按下 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放视频流和窗口
cap.release()
cv2.destroyAllWindows()
# 指定模板图片和视频设备索引
template_path = 'template.png'
video_device = 0
# 调用函数进行模板匹配
find_template(template_path, video_device)
```
这次使用了`np.where`函数来获取匹配结果大于阈值的位置。希望这次能够正常运行。如果还有其他问题,请随时提问。
阅读全文