OpenCV 物体跟踪

声明

声明:本系列博客是我在学习OpenCV官方教程中文版(For Python)(段力辉 译)所做的笔记。所以,其中的绝大部分内容引自这本书,博客中的代码也是其配套所附带的代码或书中的代码,侵删。其中部分代码可能会因需要而改动。在本系列博客中,其中包含书中的引用,也包括我自己对知识的理解,思考和总结。本系列博客的目的主要有两个,一个是可以作为我自己的学习笔记,时常复习巩固。第二个是可以为想学习python下的opencv 3 相关知识的朋友提供一些参考。

正文

1.明确任务

利用opencv知识,通过摄像头录像,实时提取带有某个特定颜色的物体,从而实现物体跟踪。

2.需要用到的函数

  • cv2.VideoCapture(0)
    这个函数用来捕获视频,VideoCapture()中参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频。,记得最后要用cap.release()来关闭摄像头。

  • ret,frame=cap.read()
    cap.read()按帧读取视频,ret,frame是cap.read()方法的两个返回值。其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。

  • cv2.cvtColor(image,flag)
    这个函数是一个颜色空间转换函数,flag代表转换方式。

  • cv2.inRange()
    括号里有三个参数,依次是hsv,lower,upper,第一个参数:hsv指的是原图,第二个参数:lower指的是图像中低于这个lower的值,图像值变为0,第三个参数:upperd指的是图像中高于这个upper_red的值,图像值变为0,而在lower~upper之间的值变成255。

  • cv2.bitwise_and()
    bitwise_and()是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0

3.完整代码

import cv2
import numpy as np

cap=cv2.VideoCapture(0)
while(1):
# 获取每一帧
    ret,frame=cap.read()
# 转换到 HSV
    hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
# 设定颜色的阈值
    lower_red=np.array([0,43,46])
    upper_red=np.array([10,255,255])
# 根据阈值构建掩模
    mask=cv2.inRange(hsv,lower_red,upper_red)
# 对原图像和掩模进行位运算
    res=cv2.bitwise_and(frame,frame,mask=mask)
# 显示图像
    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k=cv2.waitKey(5)&0xFF
    if k==27:
        break
cap.release()    #关闭摄像头
# 关闭窗口
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(当时截图时没截好,所以原始图片与前两张不一样)

4.另外

怎样找到要跟踪对象的 HSV 值?
只需要以下代码就可以轻松获得你需要的HSV值:

import cv2
import numpy as np

#假设我们想得到绿色的HSV值
green=np.uint8([[[0,255,0]]])#注意:是RGB,而不是BGR,还有这里是三层括号
hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print(hsv_green)

运行结果:

[[[ 60 255 255]]]

得到这个值后,现在你可以分别用 [H-100,100,100] 和 [H+100,255,255] 做上下阈值。

感谢观看!

如有错误,欢迎批评指正!

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中使用 OpenCV 实现物体跟踪,你可以通过选择合适的跟踪算法和函数来实现。下面是一个使用 OpenCV 中的 CSRT 跟踪器进行物体跟踪的示例代码: ```python import cv2 # 创建一个跟踪器对象 tracker = cv2.TrackerCSRT_create() # 读取视频或打开摄像头 video = cv2.VideoCapture("input.mp4") if not video.isOpened(): print("无法打开视频文件") exit() # 读取第一帧并选择目标区域 ret, frame = video.read() if not ret: print("无法读取视频帧") exit() bbox = cv2.selectROI("Object Tracking", frame, False) tracker.init(frame, bbox) while True: ret, frame = video.read() if not ret: break # 跟踪目标并获取边界框 success, bbox = tracker.update(frame) # 根据跟踪结果在图像上绘制边界框 if success: (x, y, w, h) = [int(v) for v in bbox] cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) else: cv2.putText(frame, "Tracking failure detected", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2) # 显示跟踪结果 cv2.imshow("Object Tracking", frame) # 按下 ESC 键退出循环 if cv2.waitKey(1) == 27: break # 释放视频或关闭摄像头 video.release() # 关闭窗口 cv2.destroyAllWindows() ``` 在上述代码中,我们首先创建一个 CSRT 跟踪器对象。然后,我们使用 `cv2.VideoCapture` 打开视频文件或摄像头,并读取第一帧图像。通过使用 `cv2.selectROI` 函数选择目标区域,并使用 `tracker.init` 初始化跟踪器。接下来,我们进入一个循环中,在每一帧图像上进行目标跟踪,并根据跟踪结果绘制边界框。最后,我们使用 `cv2.imshow` 显示跟踪结果,并通过按下 ESC 键退出循环。 请注意,这只是一个基本的示例代码,你可以根据实际需求进行修改和扩展。还有其他的跟踪算法可供选择,如 KCF、MOSSE 等。你可以尝试不同的算法并调整参数以获得更好的跟踪效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值