11- OpenCV进行目标追踪 (OpenCV系列) (机器视觉)

这篇具有很好参考价值的文章主要介绍了11- OpenCV进行目标追踪 (OpenCV系列) (机器视觉)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

知识要点

1. OpenCV目标跟踪算法的使用大概可以分为以下几个步骤:

  1. 创建MultiTracker对象:  trackers = cv2.legacy.MultiTracker_create()

  2. 读取视频或摄像头数据:  cap = cv2.VideoCapture('./videos/soccer_02.mp4')

  3. 框选ROI区域:  roi = cv2.selectROI('frame', frame, showCrosshair = True)

  4. 添加实际的追踪算法.  tracker = OPENCV_OBJECT_TRACKERS['boosting'](), trackers.add(tracker, frame, roi)

  5. 对每一帧进行进行目标追踪: success, boxes = trackers.update(frame) 

2. 光流估计:(稀疏光流估计算法为Lucas-Kanade算法, 比较经典)

  • p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, gray, p0, None,winSize=(15,15),maxLevel=2) # p1为更新的点, st是状态
  • cv2.calcOpticalFlowPyrLK()      # 稀疏光流
  • cv2.calcOpticalFlowFarneback()     # 稠密光流

随机颜色 数组生成:

  • color = np.random.randint(0, 255, (100, 3))

参考资料:  目标追踪综述 - 知乎


12 目标追踪

12.1 OpenCV目标追踪算法介绍

OpenCV上有八种不同的目标追踪算法:

  • BOOSTING Tracker:和Haar cascades(AdaBoost)背后所用的机器学习算法相同,但是距其诞生已有十多年了。这一追踪器速度较慢,并且表现不好。(最低支持OpenCV 3.0.0)
  • MIL Tracker:比上一个追踪器更精确,但是失败率比较高。(最低支持OpenCV 3.0.0)
  • KCF Tracker:比BOOSTING和MIL都快,但是在有遮挡的情况下表现不佳。(最低支持OpenCV 3.1.0)
  • CSRT Tracker比KCF稍精确,但速度不如后者。(最低支持OpenCV 3.4.2)
  • MedianFlow Tracker:出色的跟踪故障报告。当运动是可预测的并且没有遮挡时,效果非常好,但是对于快速跳动或快速移动的物体,模型会失效。(最低支持OpenCV 3.0.0)
  • TLD Tracker:在多帧遮挡下效果最好。但是TLD的误报非常多,所以不推荐。(最低支持OpenCV 3.0.0)
  • MOSSE Tracker速度真心快,但是不如CSRT和KCF的准确率那么高,如果追求速度选它准没错(最低支持OpenCV 3.4.1)
  • GOTURN Tracker:这是OpenCV中唯一一深度学习为基础的目标检测器。它需要额外的模型才能运行。(最低支持OpenCV 3.2.0)

12.2  目标跟踪算法的使用

OpenCV目标跟踪算法的使用大概可以分为以下几个步骤:

  1. 创建MultiTracker对象.

  2. 读取视频或摄像头数据.

  3. 框选ROI区域

  4. 给MultiTracker对象添加实际的追踪算法.

  5. 对每一帧进行进行目标追踪.

下面是一个使用例子:

import cv2
import numpy as np

cap = cv2.VideoCapture('./videos/los_angeles.mp4') # 读取视频
# 定义OpenCV的七种追踪算法
OPENCV_OBJECT_TRACKERS = {
    'boosting' : cv2.legacy.TrackerBoosting_create,
    'csrt' : cv2.legacy.TrackerCSRT_create,
    'kcf' : cv2.legacy.TrackerKCF_create,
    'mil' : cv2.legacy.TrackerMIL_create,
    'tld' : cv2.legacy.TrackerTLD_create,
    'medianflow' : cv2.legacy.TrackerMedianFlow_create,
    'mosse' :cv2.legacy.TrackerMOSSE_create}
trackers = cv2.legacy.MultiTracker_create()   # 创建追踪器

while True:
    flag, frame = cap.read()
    if frame is None:
        break
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 变为黑白的
    # 目标追踪, # 第一帧追踪时为空,跳过
    success, boxes = trackers.update(frame)
    # print(boxes)   # [[685. 433. 106.  84.]] 矩形位置会有调整
    # 绘制追踪到的矩形区域
    for box in boxes:
        # box是float的数据类型
        (x, y, w, h) = [int(v) for v in box]
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
    
    cv2.imshow('frame', frame)
    key = cv2.waitKey(1)
    if key == ord('s'):
        # 框选ROI区域, 后两个参数的含义,是否包含中间十字和从中心点开始画
        roi = cv2.selectROI('frame',frame, showCrosshair = True, fromCenter = False)
        print(roi)    # (1075, 326, 46, 70)
        # 创建实际的追踪器
        tracker = OPENCV_OBJECT_TRACKERS['boosting']()
        trackers.add(tracker, frame, roi)
    elif key == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

11- OpenCV进行目标追踪 (OpenCV系列) (机器视觉)

 12.3  opencv 和深度学习结合 做目标识别

  • 目标识别?

  • 把图片变成tensor:  blob = cv2.dnn.blobFromImage(img)

  • 把图片给到网络预测net.setInput(blob)

  • 预测net.forward()

11- OpenCV进行目标追踪 (OpenCV系列) (机器视觉)

import cv2
import numpy as np

img = cv2.imread('./smallcat.jpeg')   # 读图片
# opencv 和深度学习结合
config = './bvlc_googlenet.prototxt'   # 分类文件
model = './bvlc_googlenet.caffemodel'   # 模型
net = cv2.dnn.readNetFromCaffe(config, model)

# 图片转化为tensor
blob = cv2.dnn.blobFromImage(img, 1.0, (224, 224), (104, 117, 223))
net.setInput(blob)
r = net.forward()
print(r.shape)   # (1, 1000)  1000类
# 读类别  # 看下比较明显的特征
classes = []
with open('./synset_words.txt', 'r') as fp:
    # find 函数返回字符串的索引  # strip 去掉结尾换行符号
    classes = [x[x.find(' ') + 1:].strip() for x in fp]
# 对得到的结果排序
order = sorted(r[0], reverse = True)   # 1000类

z = list(range(3))    # [0, 1, 2]  # 只要前三的概率
for i in range(3):
    # 返回满足条件的索引
    z[i] = np.where(r[0] == order[i])[0][0]
    print(f'第{i + 1}项匹配:', classes[z[i]], end = '')
    print(' 类所在行:', z[i] + 1, ' ', '可能性:', order[i])
    
cv2.imshow('img', img)
cv2.waitKey(50000)
cv2.destroyAllWindows()
第1项匹配: tabby, tabby cat 类所在行: 282   可能性: 0.2946576
第2项匹配: Egyptian cat 类所在行: 286   可能性: 0.2306798
第3项匹配: carton 类所在行: 479   可能性: 0.061365135

13 光流估计

光流,顾名思义,光的流动比如人眼感受到的夜空中划过的流星。在计算机视觉中,定义图像中对象的移动,这个移动可以是相机移动或者物体移动引起的。具体是指,视频图像的一帧中的代表同一对象(物体)像素点移动到下一帧的移动量,使用二维向量表示.

11- OpenCV进行目标追踪 (OpenCV系列) (机器视觉)

根据是否选取图像稀疏点进行光流估计,可以将光流估计分为稀疏光流和稠密光流.

OpenCV中提供了光流估计的接口,包括 稀疏光流估计算法 cv2.calcOpticalFlowPyrLK(),和 稠密光流估计 cv2.calcOpticalFlowFarneback()。其中稀疏光流估计算法为Lucas-Kanade算法,该算法为1981年由Lucas和Kanade两位科学家提出的,最为经典也较容易理解的算法.

13.1 传统算法 Lucas-Kanade

为了将光流估计进行建模,Lucas-Kanade做了三个重要的假设:

  • 亮度恒定:同一点随着时间的变化,其亮度不会发生改变。

  • 小运动:随着时间的变化不会引起位置的剧烈变化,只有小运动情况下才能用前后帧之间单位位置变化引起的灰度变化去近似灰度对位置的偏导数。

  • 空间一致:一个场景上邻近的点投影到图像上也是邻近点,且邻近点速度一致。因为光流法基本方程约束只有一个,而要求x,y方向的速度,有两个未知变量。所以需要连立n多个方程求解。

cv2.calcOpticalFlowPyrLK(): 参数:

  • prevImage 前一帧图像

  • nextImage 当前帧图像

  • prevPts 待跟踪的特征点向量

  • winSize 搜索窗口的大小

  • maxLevel 最大的金字塔层数

返回值:

  • nextPts 输出跟踪特征点向量

  • status 特征点是否找到,找到的状态为1,未找到的状态为0

import numpy as np
import cv2

cap = cv2.VideoCapture('./test.avi')  # 读取视频
ret, old_frame = cap.read()  # 获取第一帧的图片
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)  # 变成黑白图

# 检测角点
feature_params = dict(maxCorners = 100,
                      qualityLevel = 0.3,
                      minDistance = 7)
p0 = cv2.goodFeaturesToTrack(old_gray, mask = None, **feature_params)

# 创建mask
mask = np.zeros_like(old_frame)
# 随机颜色
color = np.random.randint(0, 255, (100, 3))
while True:
    ret, frame = cap.read()
    if frame is None:
        break
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 光流估计, p1为更新的点, st是状态
    p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, gray, p0, None,
                                           winSize = (15, 15), maxLevel = 2) 
    # print(p1.shape, '==', st.shape)   # (31, 1, 2) == (31, 1)
    
    # 哪些点找到了哪些没找到
    good_new = p1[st == 1]
    good_old = p0[st == 1]
    # print(good_new.shape, good_old.shape)   # (38, 2) (38, 2)
    # 绘制轨迹
    for i, (new, old) in enumerate(zip(good_new, good_old)):
        a, b = new.ravel()
        c, d = old.ravel()
        mask = cv2.line(mask, (int(a), int(b)), (int(c), int(d)),
                        color[i].tolist(), 2) # 画线,随机颜色
        frame = cv2.circle(frame, (int(a), int(b)), 5, color[i].tolist(), -1)
        
    img = cv2.add(frame, mask)
    cv2.imshow('frame', img)
    key = cv2.waitKey(10)
    if key == ord('q'):
        break
    # 更新每一帧
    old_gray = gray.copy()
    p0 = good_new.reshape(-1, 1, 2)
    # print('p0de', p0.shape)   # p0de (38, 1, 2)
cap.release()
cv2.destroyAllWindows()

11- OpenCV进行目标追踪 (OpenCV系列) (机器视觉)文章来源地址https://www.toymoban.com/news/detail-449231.html

到了这里,关于11- OpenCV进行目标追踪 (OpenCV系列) (机器视觉)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 竞赛保研 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习多目标跟踪 实时检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/dancheng-sen

    2024年01月16日
    浏览(69)
  • 计算机视觉+深度学习+机器学习+opencv+目标检测跟踪(代码+视频)

    计算机视觉、深度学习和机器学习是当今最热门的技术,它们被广泛应用于各种领域,如自动驾驶、医学图像分析、安防监控等。而目标检测跟踪技术则是计算机视觉中的一个重要分支,它可以帮助我们在图像或视频中自动识别和跟踪特定的目标。 下面我们来一一介绍这些技

    2024年02月01日
    浏览(111)
  • 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉 计算机竞赛

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习多目标跟踪 实时检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/dancheng-sen

    2024年02月05日
    浏览(70)
  • 互联网加竞赛 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习多目标跟踪 实时检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/dancheng-sen

    2024年02月19日
    浏览(51)
  • 目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】机器视觉(基础篇)(十七)

    目录 几个高频面试题目 如何选择合适的面扫相机 算法原理 分辨率与视野 像素尺寸与景深 像素尺寸

    2024年02月19日
    浏览(56)
  • 计算机视觉+深度学习+机器学习+opencv+目标检测跟踪+一站式学习(代码+视频+PPT)

    第1章:视觉项目资料介绍与学习指南 相关知识: 介绍计算机视觉、OpenCV库,以及课程的整体结构。 学习概要: 了解课程的目标和学习路径,为后续章节做好准备。 重要性: 提供学生对整个课程的整体认识,为学习提供框架和背景。 包括了 计算机视觉/opencv视频 视频对应

    2024年02月05日
    浏览(59)
  • 计算机视觉项目-实时目标追踪

    😊😊😊 欢迎来到本博客 😊😊😊 本次博客内容将继续讲解关于OpenCV的相关知识 🎉 作者简介 : ⭐️⭐️⭐️ 目前计算机研究生在读。主要研究方向是人工智能和群智能算法方向。目前熟悉深度学习(keras、pytorch、yolo系列),python网页爬虫、机器学习、计算机视觉(Op

    2024年02月03日
    浏览(38)
  • 04- 图像卷积及图片的模糊和边缘检测 (OpenCV系列) (机器视觉)

    知识重点 padding指的就是填充的0的圈数 重构图片大小:  img = cv2.resize(img, dsize=(300, 300)) 模糊操作 :  dst = cv2.filter2D (img, -1, kernel) 模糊操作 : 方盒滤波 :  dst = cv2.boxFilter (img, -1, (5, 5), normalize = True)   # normalize = True时, a = 1 / (W * H) 滤波器的宽高, 且此时方盒滤波等价于均值滤波

    2024年02月02日
    浏览(43)
  • 实战指南:使用OpenCV 4.0+Python进行机器学习与计算机视觉

    💂 个人网站:【办公神器】【游戏大全】【神级源码资源网】 🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】 💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 计算机视觉和机器学习的融合为我们带来了前所未有的机会和挑战。从智能助手到

    2024年02月13日
    浏览(54)
  • 机器视觉值-视觉追踪

    一、视觉追踪是指通过计算机视觉技术,对目标物体在三维空间中的运动轨迹进行跟踪和预测。视觉追踪技术广泛应用于机器人、自动化生产线、无人驾驶等领域。 二、halcon 中的3d 视觉追踪算子包括: 1. create_shape_model_3d:用于创建三维形状模板,可以用于物体识别和追踪。

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包