一、前言

根据鼠标框选区域的色度光谱来进行摄像头读入的视频目标的跟踪

主要采用CamShift算法,全程Continuously Adaptive Mean-SHIFT,是对MeanShift算法 改进,被称为连续自适应的MeanShift算法。

二、代码

#include <opencv2/core/utility.hpp>
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/videoio.hpp"
#include "opencv2/highgui.hpp"#include <iostream>
#include <ctype.h>using namespace cv;
using namespace std;Mat image;bool backprojMode = false;
bool selectObject = false;
int trackObject = 0;
bool showHist = true;
Point origin;
Rect selection;
int vmin = 10, vmax = 256, smin = 30;// User draws box around object to track. This triggers CAMShift to start tracking
static void onMouse(int event, int x, int y, int, void*)
{if (selectObject){selection.x = MIN(x, origin.x);selection.y = MIN(y, origin.y);selection.width = std::abs(x - origin.x);selection.height = std::abs(y - origin.y);selection &= Rect(0, 0, image.cols, image.rows);}switch (event){case EVENT_LBUTTONDOWN:origin = Point(x, y);selection = Rect(x, y, 0, 0);selectObject = true;break;case EVENT_LBUTTONUP:selectObject = false;if (selection.width > 0 && selection.height > 0)trackObject = -1;   // Set up CAMShift properties in main() loopbreak;}
}string hot_keys =
"\n\nHot keys: \n"
"\tESC - quit the program\n"
"\tc - stop the tracking\n"
"\tb - switch to/from backprojection view\n"
"\th - show/hide object histogram\n"
"\tp - pause video\n"
"To initialize tracking, select the object with mouse\n";static void help()
{cout << "\nThis is a demo that shows mean-shift based tracking\n""You select a color objects such as your face and it tracks it.\n""This reads from video camera (0 by default, or the camera number the user enters\n""Usage: \n""   ./camshiftdemo [camera number]\n";cout << hot_keys;
}const char* keys =
{"{help h | | show help message}{@camera_number| 0 | camera number}"
};int main(int argc, const char** argv)
{VideoCapture cap;Rect trackWindow;int hsize = 16;float hranges[] = { 0,180 };const float* phranges = hranges;CommandLineParser parser(argc, argv, keys);if (parser.has("help")){help();return 0;}int camNum = parser.get<int>(0);cap.open(camNum);if (!cap.isOpened()){help();cout << "***Could not initialize capturing...***\n";cout << "Current parameter's value: \n";parser.printMessage();return -1;}cout << hot_keys;namedWindow("Histogram", 0);namedWindow("CamShift Demo", 0);setMouseCallback("CamShift Demo", onMouse, 0);createTrackbar("Vmin", "CamShift Demo", &vmin, 256, 0);createTrackbar("Vmax", "CamShift Demo", &vmax, 256, 0);createTrackbar("Smin", "CamShift Demo", &smin, 256, 0);Mat frame, hsv, hue, mask, hist, histimg = Mat::zeros(200, 320, CV_8UC3), backproj;bool paused = false;for (;;){if (!paused){cap >> frame;if (frame.empty())break;}frame.copyTo(image);if (!paused){cvtColor(image, hsv, COLOR_BGR2HSV);if (trackObject){int _vmin = vmin, _vmax = vmax;inRange(hsv, Scalar(0, smin, MIN(_vmin, _vmax)),Scalar(180, 256, MAX(_vmin, _vmax)), mask);int ch[] = { 0, 0 };hue.create(hsv.size(), hsv.depth());mixChannels(&hsv, 1, &hue, 1, ch, 1);if (trackObject < 0){// Object has been selected by user, set up CAMShift search properties onceMat roi(hue, selection), maskroi(mask, selection);calcHist(&roi, 1, 0, maskroi, hist, 1, &hsize, &phranges);normalize(hist, hist, 0, 255, NORM_MINMAX);trackWindow = selection;trackObject = 1; // Don't set up again, unless user selects new ROIhistimg = Scalar::all(0);int binW = histimg.cols / hsize;Mat buf(1, hsize, CV_8UC3);for (int i = 0; i < hsize; i++)buf.at<Vec3b>(i) = Vec3b(saturate_cast<uchar>(i*180. / hsize), 255, 255);cvtColor(buf, buf, COLOR_HSV2BGR);for (int i = 0; i < hsize; i++){int val = saturate_cast<int>(hist.at<float>(i)*histimg.rows / 255);rectangle(histimg, Point(i*binW, histimg.rows),Point((i + 1)*binW, histimg.rows - val),Scalar(buf.at<Vec3b>(i)), -1, 8);}}// Perform CAMShiftcalcBackProject(&hue, 1, 0, hist, backproj, &phranges);backproj &= mask;RotatedRect trackBox = CamShift(backproj, trackWindow,TermCriteria(TermCriteria::EPS | TermCriteria::COUNT, 10, 1));if (trackWindow.area() <= 1){int cols = backproj.cols, rows = backproj.rows, r = (MIN(cols, rows) + 5) / 6;trackWindow = Rect(trackWindow.x - r, trackWindow.y - r,trackWindow.x + r, trackWindow.y + r) &Rect(0, 0, cols, rows);}if (backprojMode)cvtColor(backproj, image, COLOR_GRAY2BGR);ellipse(image, trackBox, Scalar(0, 0, 255), 3, LINE_AA);}}else if (trackObject < 0)paused = false;if (selectObject && selection.width > 0 && selection.height > 0){Mat roi(image, selection);bitwise_not(roi, roi);}imshow("CamShift Demo", image);imshow("Histogram", histimg);char c = (char)waitKey(10);if (c == 27)break;switch (c){case 'b':backprojMode = !backprojMode;break;case 'c':trackObject = 0;histimg = Scalar::all(0);break;case 'h':showHist = !showHist;if (!showHist)destroyWindow("Histogram");elsenamedWindow("Histogram", 1);break;case 'p':paused = !paused;break;default:;}}return 0;
}

三、效果图

彩色目标追踪

彩色目标追踪

直方图 

对应直方图

OpenCV彩色目标跟踪相关推荐

  1. opencv动态目标跟踪学习总结

    用opencv实现对视频中动态目标的追踪 第一步,是要建立一个编程环境,然后加载opencv的库路径等等.具体步骤在 http://www.opencv.org.cn/ 的"安装" ...

  2. Object Tracking using OpenCV (C++/Python)(使用OpenCV进行目标跟踪)

    本博客翻译搬运自https://www.learnopencv.com/object-tracking-using-opencv-cpp-python,用于初入目标跟踪的新手学习,转贴请注明! 使用O ...

  3. 笔记 基于OpenCV的目标跟踪软件与系统实现

    1.目标检测理论包括光流法.帧间差分法和背景差分法, 目标分割理论包括全局阈值法和局部阈值法, 目标跟踪的均值漂移法和卡尔曼滤波法. 2.基于opencv的目标跟踪软件设计于实现 在vc环境下,按照单 ...

  4. 基于Python和OpenCV的目标跟踪学习教程 Object Tracking using Python and OpenCV

    实现12种不同的算法来跟踪视频和网络摄像头中的对象! 你会学到: 使用Python和OpenCV跟踪视频和网络摄像头中的对象 理解跟踪算法的基本直觉 实现12种跟踪算法 了解对象检测和对象跟踪之间的区 ...

  5. Python图像处理,cv2模块,OpenCV实现目标跟踪

    前言 利用Python实现OpenCV目标跟踪.废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: cv2模块: 以及一些Python自带的模块. 环境搭建 安装 ...

  6. OpenCV视频目标跟踪及背景分割器

    目标跟踪 本文主要介绍cv2中的视频分析Camshift和Meanshift. 目标: 学习Meanshift算法和Camshift算法来寻找和追踪视频中的目标物体 Meanshift算法: mean ...

  7. OpenCV实现目标跟踪

    使用opencv3以上在opencv_contib中集成的跟踪算法,实现目标跟踪 在这里选择使用摄像头画面进行跟踪 python代码如下: import cv2 import sysprint cv2 ...

  8. android opencv kcf,目标跟踪的深度学习方法 与 opencv 实现 kcf 方法

    目标跟踪的深度学习方法 与 opencv 实现 kcf 方法 算法选型 10 2.1. 现有算法分类 10 2.2. 图像目标跟踪方法 11 1. 概述 1.1. 背景 行为识别的前提是需要对人体目标 ...

  9. 机器视觉 OpenCV—python目标跟踪(光流)

    文章目录 一.运动检测 1.1 检测思路 1.2 代码 二.运动方向预测 2.1 关键点(角点)追踪 goodFeaturesToTrack() 2.2 光流法 一.运动检测 1.1 检测思路 目标跟 ...

最新文章

  1. ubuntu 设置root启动
  2. JMeter入门,测试计划编写(http请求)
  3. php joomla,基于MySQL / PHP和Joomla的因特网管理信息系统设计
  4. TVP两周年:携手同行,让未来可见
  5. DMA流程简介--CPU/内存/网卡之间的交互
  6. otl oracle存储过程,OTL调用存储过程/函数及注意事项
  7. ClassNotFoundException
  8. c++ 遍历所有点且距离最短_图解:最短路径之迪杰斯特拉算法
  9. webpack 合并压缩_文章 - coolie PK webpack 之一:JS 文件的合并与压缩 - FED社区
  10. plc与计算机通信方式,PLC通信方式介绍
  11. 中柏平板bios对照表_BIOS详解及中英文对照表
  12. ubuntu修改u盘权限_Ubuntu下的U盘只读文件系统,该图标已锁定,表明无法对其进行修改...
  13. python 字体颜色改变
  14. 自媒体素材库有哪些?蚁小二带你找素材
  15. Photoshop脚本 批量生成各尺寸的iOS图标
  16. Java实现吃货联盟订餐系统
  17. 【学习日志】2022.09.02 (C++)strcmp和stricmp、strcmpi三者之间的区别、C语言判断文件后缀名、ZENO Audio Update、TEN MINUTES PHYSICS
  18. 《图形图像处理》课程项目设计任务书
  19. centos 7 升级 git 版本(通过安装 ius 源的方式)
  20. 冰糖心苹果营养价值 冰糖心苹果的功效与作用

热门文章

  1. Java - 泛型 ( Generic )
  2. oracle 闪回技术
  3. 图片列表模板 html代码,图片列表模板
  4. thinkphp框架环境部署
  5. MySQL的事务处理
  6. c语言累积乘,C语言编程累积2
  7. Spring在SSH中的角色和作用
  8. 全新的基于 Windows NT (2000/XP/2003) 的媒体解码包.
  9. JavaWeb——IOC
  10. ArcGIS API for JavaScript——给图层添加标注