opencv跟踪算法

前言

OpenCV有8种不同的跟踪器类型:BOOSTING,MIL,KCF,TLD,MEDIANFLOW,GOTURN,MOSSE,CSRT。

一、OPENCV TRACK

c++代码如下:

C++代码:

#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/tracking.hpp>
using namespace cv;
using namespace std;
vector<string> trackerTypes = {"BOOSTING", "MIL", "KCF", "TLD", "MEDIANFLOW", "GOTURN", "MOSSE", "CSRT"};

Ptr<Tracker> createTrackerByName(string trackerType)
{
  Ptr<Tracker> tracker;
  if (trackerType == trackerTypes[0])
      tracker = TrackerBoosting::create();
  else if (trackerType == trackerTypes[1])
      tracker = TrackerMIL::create();
  else if (trackerType == trackerTypes[2])
      tracker = TrackerKCF::create();
  else if (trackerType == trackerTypes[3])
      tracker = TrackerTLD::create();
  else if (trackerType == trackerTypes[4])
      tracker = TrackerMedianFlow::create();
  else if (trackerType == trackerTypes[5])
      tracker = TrackerGOTURN::create();
  else if (trackerType == trackerTypes[6])
      tracker = TrackerMOSSE::create();
  else if (trackerType == trackerTypes[7])
      tracker = TrackerCSRT::create();
  else
  {
      cout << "Incorrect tracker name" << endl;
      cout << "Available trackers are: " << endl;
      for (vector<string>::iterator it = trackerTypes.begin(); it != trackerTypes.end(); ++it)
      {
          std::cout << " " << *it << endl;
      }
  }
  return tracker;
}

/**
* @brief Get the Random Colors object 随机涂色
*
* @param colors
* @param numColors
*/
void getRandomColors(vector<Scalar> &colors, int numColors)
{
  RNG rng(0);
  for (int i = 0; i < numColors; i++)
  {
      colors.push_back(Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)));
  }
}
int main(int argc, char *argv[])
{
  // Set tracker type. Change this to try different trackers. 选择追踪器类型
  string trackerType = trackerTypes[7];
  // set default values for tracking algorithm and video 视频读取
  string videoPath = "video/run.mp4";

  // Initialize MultiTracker with tracking algo 边界框
  vector<Rect> bboxes;

  // create a video capture object to read videos 读视频
  cv::VideoCapture cap(videoPath);
  Mat frame;

  // quit if unable to read video file
  if (!cap.isOpened())
  {
      cout << "Error opening video file " << videoPath << endl;
      return -1;
  }
  // read first frame 读第一帧
  cap >> frame;
  // draw bounding boxes over objects 在第一帧内确定对象框
  /*
      先在图像上画框,然后按ENTER确定画下一个框。按ESC退出画框开始执行程序
  */
  cout << "\n==========================================================\n";
  cout << "OpenCV says press c to cancel objects selection process" << endl;
  cout << "It doesn't work. Press Esc to exit selection process" << endl;
  cout << "\n==========================================================\n";
  cv::selectROIs("MultiTracker", frame, bboxes, false);

  //自己设定对象的检测框
  //x,y,width,height
  //bboxes.push_back(Rect(388, 155, 30, 40));
  //bboxes.push_back(Rect(492, 205, 50, 80));
  // quit if there are no objects to track 如果没有选择对象
  if (bboxes.size() < 1)
  {
      return 0;
  }
  vector<Scalar> colors;
  //给各个框涂色
  getRandomColors(colors, bboxes.size());
  // Create multitracker 创建多目标跟踪类
  Ptr<MultiTracker> multiTracker = cv::MultiTracker::create();
  // initialize multitracker 初始化
  for (int i = 0; i < bboxes.size(); i++)
  {
      multiTracker->add(createTrackerByName(trackerType), frame, Rect2d(bboxes[i]));
  }

  // process video and track objects 开始处理图像
  cout << "\n==========================================================\n";
  cout << "Started tracking, press ESC to quit." << endl;
  while (cap.isOpened())
  {
      // get frame from the video 逐帧处理
      cap >> frame;
      // stop the program if reached end of video
      if (frame.empty())
      {
          break;
      }
      //update the tracking result with new frame 更新每一帧
      bool ok = multiTracker->update(frame);
      if (ok == true)
      {
          cout << "Tracking success" << endl;
      }
      else
      {
          cout << "Tracking failure" << endl;
      }
      // draw tracked objects 画框
      for (unsigned i = 0; i < multiTracker->getObjects().size(); i++)
      {
          rectangle(frame, multiTracker->getObjects()[i], colors[i], 2, 1);
      }

      // show frame
      imshow("MultiTracker", frame);

      // quit on x button
      if (waitKey(1) == 27)
      {
          break;
      }
  }
  waitKey(0);
  return 0;
}

python版本代码如下:

#python代码 
from __future__ import print_function
import sys
import cv2
from random import randint
trackerTypes = ['BOOSTING', 'MIL', 'KCF','TLD', 'MEDIANFLOW', 'GOTURN', 'MOSSE', 'CSRT']
def createTrackerByName(trackerType):
# Create a tracker based on tracker name
if trackerType == trackerTypes[0]:
  tracker = cv2.TrackerBoosting_create()
elif trackerType == trackerTypes[1]:
  tracker = cv2.TrackerMIL_create()
elif trackerType == trackerTypes[2]:
  tracker = cv2.TrackerKCF_create()
elif trackerType == trackerTypes[3]:
  tracker = cv2.TrackerTLD_create()
elif trackerType == trackerTypes[4]:
  tracker = cv2.TrackerMedianFlow_create()
elif trackerType == trackerTypes[5]:
  tracker = cv2.TrackerGOTURN_create()
elif trackerType == trackerTypes[6]:
  tracker = cv2.TrackerMOSSE_create()
elif trackerType == trackerTypes[7]:
  tracker = cv2.TrackerCSRT_create()
else:
  tracker = None
  print('Incorrect tracker name')
  print('Available trackers are:')
  for t in trackerTypes:
    print(t)

return tracker

if __name__ == '__main__':

print("Default tracking algoritm is CSRT \n"
      "Available tracking algorithms are:\n")
for t in trackerTypes:
    print(t)

trackerType = "CSRT"

# Set video to load
videoPath = "video/run.mp4"

# Create a video capture object to read videos
cap = cv2.VideoCapture(videoPath)

# Read first frame
success, frame = cap.read()
# quit if unable to read the video file
if not success:
  print('Failed to read video')
  sys.exit(1)

## Select boxes
bboxes = []
colors = []

# OpenCV's selectROI function doesn't work for selecting multiple objects in Python
# So we will call this function in a loop till we are done selecting all objects
while True:
  # draw bounding boxes over objects
  # selectROI's default behaviour is to draw box starting from the center
  # when fromCenter is set to false, you can draw box starting from top left corner
  bbox = cv2.selectROI('MultiTracker', frame)
  bboxes.append(bbox)
  colors.append((randint(64, 255), randint(64, 255), randint(64, 255)))
  print("Press q to quit selecting boxes and start tracking")
  print("Press any other key to select next object")
  k = cv2.waitKey(0) &amp; 0xFF
  if (k == 113):  # q is pressed
    break

print('Selected bounding boxes {}'.format(bboxes))

## Initialize MultiTracker
# There are two ways you can initialize multitracker
# 1. tracker = cv2.MultiTracker("CSRT")
# All the trackers added to this multitracker
# will use CSRT algorithm as default
# 2. tracker = cv2.MultiTracker()
# No default algorithm specified

# Initialize MultiTracker with tracking algo
# Specify tracker type

# Create MultiTracker object
multiTracker = cv2.MultiTracker_create()

# Initialize MultiTracker
for bbox in bboxes:
  multiTracker.add(createTrackerByName(trackerType), frame, bbox)

# Process video and track objects
while cap.isOpened():
  success, frame = cap.read()
  if not success:
    break
  # get updated location of objects in subsequent frames
  success, boxes = multiTracker.update(frame)

  # draw tracked objects
  for i, newbox in enumerate(boxes):
    p1 = (int(newbox[0]), int(newbox[1]))
    p2 = (int(newbox[0] + newbox[2]), int(newbox[1] + newbox[3]))
    cv2.rectangle(frame, p1, p2, colors[i], 2, 1)
  # show frame
  cv2.imshow('MultiTracker', frame)

  # quit on ESC button
  if cv2.waitKey(1) &amp; 0xFF == 27:  # Esc pressed
    break

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 卡尔曼滤波是一种运动状态预测方法,能够对目标的未来位置进行预测,在目标跟踪中非常常用。而OpenCV是一款开源的计算机视觉库,其中包含了很多算法和函数,能够方便地进行图像处理和目标跟踪。在OpenCV中,提供了另一种目标跟踪方法——基于卡尔曼滤波的目标跟踪算法。 卡尔曼滤波c opencv目标跟踪算法的基本思想是利用对目标运动规律的预测,不断更新目标的位置,在目标运动中不断调整跟踪目标的位置,从而进行目标跟踪。首先通过图像处理或者计算机视觉算法获取目标的位置,然后通过卡尔曼滤波来对目标的运动状态进行预测,并更新目标的位置。在预测过程中,一般会考虑目标的速度和方向等因素。通过不断地预测和更新目标的位置,就实现了目标的跟踪。 卡尔曼滤波c opencv目标跟踪算法的优点是具有预测和适应性,能够在目标运动过程中实时对目标的位置进行跟踪,同时能够自适应地处理信号噪声和测量误差等问题。但是需要注意的是,卡尔曼滤波的精度和效果受到很多因素的影响,比如目标的速度、光照条件、背景变化等,因此在应用过程中需要根据具体情况进行调整和优化。 ### 回答2: 卡尔曼滤波是一种常见的状态估计算法,也被广泛应用于目标跟踪中。这种算法能够通过对目标状态的预测和实际观测值之间的差异进行最优估计,实现对目标轨迹的准确预测和跟踪。 在OpenCV中,卡尔曼滤波的应用主要包括以下几个步骤: 1. 定义状态空间和观测空间:根据跟踪目标的特点和场景要求,建立目标状态和观测值之间的数学模型。 2. 初始化滤波器:设置目标的初始状态,以及各协方差矩阵的初始值。 3. 预测目标状态:通过上一时刻的状态和运动模型,预测目标当前的状态和协方差矩阵。 4. 测量更新:获取目标的观测值,并通过观测值与预测值之间的差异,更新目标状态和协方差矩阵。 5. 迭代计算:循环进行预测和更新步骤,完成对目标轨迹的跟踪。 卡尔曼滤波在目标跟踪中的应用,能够有效解决目标漂移、噪声干扰等问题,提高跟踪的准确性和稳定性。同时,OpenCV提供了丰富的API和样例代码,方便用户进行快速开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_cv_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值