OpenCV彩色目标跟踪
一、前言
根据鼠标框选区域的色度光谱来进行摄像头读入的视频目标的跟踪
主要采用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彩色目标跟踪相关推荐
- opencv动态目标跟踪学习总结
用opencv实现对视频中动态目标的追踪 第一步,是要建立一个编程环境,然后加载opencv的库路径等等.具体步骤在 http://www.opencv.org.cn/ 的"安装" ...
- Object Tracking using OpenCV (C++/Python)(使用OpenCV进行目标跟踪)
本博客翻译搬运自https://www.learnopencv.com/object-tracking-using-opencv-cpp-python,用于初入目标跟踪的新手学习,转贴请注明! 使用O ...
- 笔记 基于OpenCV的目标跟踪软件与系统实现
1.目标检测理论包括光流法.帧间差分法和背景差分法, 目标分割理论包括全局阈值法和局部阈值法, 目标跟踪的均值漂移法和卡尔曼滤波法. 2.基于opencv的目标跟踪软件设计于实现 在vc环境下,按照单 ...
- 基于Python和OpenCV的目标跟踪学习教程 Object Tracking using Python and OpenCV
实现12种不同的算法来跟踪视频和网络摄像头中的对象! 你会学到: 使用Python和OpenCV跟踪视频和网络摄像头中的对象 理解跟踪算法的基本直觉 实现12种跟踪算法 了解对象检测和对象跟踪之间的区 ...
- Python图像处理,cv2模块,OpenCV实现目标跟踪
前言 利用Python实现OpenCV目标跟踪.废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: cv2模块: 以及一些Python自带的模块. 环境搭建 安装 ...
- OpenCV视频目标跟踪及背景分割器
目标跟踪 本文主要介绍cv2中的视频分析Camshift和Meanshift. 目标: 学习Meanshift算法和Camshift算法来寻找和追踪视频中的目标物体 Meanshift算法: mean ...
- OpenCV实现目标跟踪
使用opencv3以上在opencv_contib中集成的跟踪算法,实现目标跟踪 在这里选择使用摄像头画面进行跟踪 python代码如下: import cv2 import sysprint cv2 ...
- android opencv kcf,目标跟踪的深度学习方法 与 opencv 实现 kcf 方法
目标跟踪的深度学习方法 与 opencv 实现 kcf 方法 算法选型 10 2.1. 现有算法分类 10 2.2. 图像目标跟踪方法 11 1. 概述 1.1. 背景 行为识别的前提是需要对人体目标 ...
- 机器视觉 OpenCV—python目标跟踪(光流)
文章目录 一.运动检测 1.1 检测思路 1.2 代码 二.运动方向预测 2.1 关键点(角点)追踪 goodFeaturesToTrack() 2.2 光流法 一.运动检测 1.1 检测思路 目标跟 ...
最新文章
- ubuntu 设置root启动
- JMeter入门,测试计划编写(http请求)
- php joomla,基于MySQL / PHP和Joomla的因特网管理信息系统设计
- TVP两周年:携手同行,让未来可见
- DMA流程简介--CPU/内存/网卡之间的交互
- otl oracle存储过程,OTL调用存储过程/函数及注意事项
- ClassNotFoundException
- c++ 遍历所有点且距离最短_图解:最短路径之迪杰斯特拉算法
- webpack 合并压缩_文章 - coolie PK webpack 之一:JS 文件的合并与压缩 - FED社区
- plc与计算机通信方式,PLC通信方式介绍
- 中柏平板bios对照表_BIOS详解及中英文对照表
- ubuntu修改u盘权限_Ubuntu下的U盘只读文件系统,该图标已锁定,表明无法对其进行修改...
- python 字体颜色改变
- 自媒体素材库有哪些?蚁小二带你找素材
- Photoshop脚本 批量生成各尺寸的iOS图标
- Java实现吃货联盟订餐系统
- 【学习日志】2022.09.02 (C++)strcmp和stricmp、strcmpi三者之间的区别、C语言判断文件后缀名、ZENO Audio Update、TEN MINUTES PHYSICS
- 《图形图像处理》课程项目设计任务书
- centos 7 升级 git 版本(通过安装 ius 源的方式)
- 冰糖心苹果营养价值 冰糖心苹果的功效与作用