基于opencv的csrt目标识别

简介: 基于opencv的csrt目标识别

本文实现了基于python的csrt方法,读取摄像头第一帧进行标注,并使用s能够实现多个目标的同时识别,然后鼠标框选,来选择目标,空格键确认。


import argparse
import time
import cv2
import numpy as np
# 配置参数
ap = argparse.ArgumentParser()  # -v videos/nascar.mp4 不要少了文件夹名字
ap.add_argument("-v", "--video", type=str,
                help="path to input video file")
ap.add_argument("-t", "--tracker", type=str, default="csrt",  # 这个感觉比kcf好
                help="OpenCV object tracker type")
args = vars(ap.parse_args())
# opencv已经实现了的追踪算法,传统算法
# 深度学习??准确高,实时低,电子设备中难,因为网络大
OPENCV_OBJECT_TRACKERS = {
    "csrt": cv2.TrackerCSRT_create,
    "kcf": cv2.TrackerKCF_create,  # 流行,cf相关滤波,14年
    # cf找到待追踪的圆(第一帧所在的位置),再对边缘进行padding,训练一个分类器(或者滤波矩阵),
    # 生成正样本和负样本训练,训练的目标是找到滤波矩阵,计算下一步哪个位置得到响应大。
    # 具体内容,看论文。
    # kcf,改进了计算,提高计算速度。1正负样本选择上改进;2核函数,低维变成高维。
    "boosting": cv2.TrackerBoosting_create,  # 十几年前
    "mil": cv2.TrackerMIL_create,
    "tld": cv2.TrackerTLD_create,
    "medianflow": cv2.TrackerMedianFlow_create,
    "mosse": cv2.TrackerMOSSE_create  # 10年
}
# 速度(实时)和准确性
# 实例化OpenCV's multi-object tracker
trackers = cv2.MultiTracker_create()  # 实例化多目标追踪。
# tracker = cv2.TrackerCSRT_create()  # 追踪器不要在这里创建,这里创建就只产生一个追踪器
vs = cv2.VideoCapture(0)  # 这个不要在while里面创建
# 视频流
while True:
    # 取当前帧
    frame = vs.read()
    # (true, data)
    frame = frame[1]
    # ret, frame = capture.read()  # 这个就不用cv2.imread(frame),frame已经是参数了
    # 到头了就结束
    if frame is None:
        break
    # resize每一帧
    (h, w) = frame.shape[:2]  # 原始图片大,计算性能低
    width = 600
    r = width / float(w)
    dim = (width, int(h * r))
    frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)
    # 追踪结果
    (success, boxes) = trackers.update(frame)  # 没有添加追踪器,是一个空架子。
    print(success, boxes)  # success返回值一直都是True,
    if len(boxes)==0:
        box = cv2.selectROI("Frame", frame, fromCenter=False,
                            showCrosshair=False)  # fromCenter选中的为中心点拉。showCrosshair展示中心十字架。
        # 对应显示窗口名称和窗口显示的内容,cv2.imshow("Frame", frame)
        # 创建一个新的追踪器
        tracker = OPENCV_OBJECT_TRACKERS[args["tracker"]]()  # 指定追踪器
        trackers.add(tracker, frame, box)  # 添加追踪器,frame哪幅图像,哪个区域box
    # boxes返回值为:[[333. 172.  45.  76.]],# 在未画下框的时候,读取为空。
    # [[278. 166.  36.  62.]
    #  [501. 242.  41.  67.]]
    print("trackers:", trackers)
    # 绘制区域
    for box in boxes:  # 确保适合多追踪器
        (x, y, w, h) = [int(v) for v in box]
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
    # 显示
    cv2.imshow("Frame", frame)
    print(cv2.waitKey(100))  # 返回值为-1,-1&0xFF的结果为255
    key = cv2.waitKey(100) & 0xFF
    # 0xFF是十六进制常数,二进制值为11111111。通过使用位和(和)这个常数,
    # 它只留下原始的最后8位(在这种情况下,无论CV2.WaITKEY(0)是),此处是防止BUG。
    if key == ord("s"):  # ord
        # 选择一个区域,按s
        box = cv2.selectROI("Frame", frame, fromCenter=False,
                            showCrosshair=False)  # fromCenter选中的为中心点拉。showCrosshair展示中心十字架。
        # 对应显示窗口名称和窗口显示的内容,cv2.imshow("Frame", frame)
        # 创建一个新的追踪器
        tracker = OPENCV_OBJECT_TRACKERS[args["tracker"]]()  # 指定追踪器
        trackers.add(tracker, frame, box)  # 添加追踪器,frame哪幅图像,哪个区域box
    # 退出
    elif key == 27:
        break
vs.release()
cv2.destroyAllWindows()
相关文章
|
计算机视觉 算法
基于opencv模板匹配的目标识别方法
因为pcl的点云模板匹配遇到了各种困难,暂时先用opencv的模板匹配函数做一个简单的焊缝识别,看看效果。此方法的缺陷就在于物体和相机位置必须固定,只允许微小位移,否则数据将失效。
4474 0
|
1月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
309 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
2月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
47 4
|
2月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
3月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
3月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
105 1
|
5月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
164 1
|
5月前
|
运维 算法 计算机视觉
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
75 1
|
5月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
89 0
|
4月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。