Opencv CamShift+Kalman目标跟踪
- #include "stdio.h"
- #include "string.h"
- #include "iostream"
- #include "opencv/cv.h"
- #include "opencv/cxcore.h"
- #include "opencv/cvaux.h"
- #include "opencv/highgui.h"
- #include "opencv/ml.h"
- #include "opencv2/core/core.hpp"
- #include "opencv2/highgui/highgui.hpp"
- #include "opencv2/imgproc/imgproc.hpp"
- #include "opencv2/video/video.hpp"
- #include "opencv2/videostab/videostab.hpp"
- #include "opencv2/stitching/stitcher.hpp"
- #include "opencv2/contrib/contrib.hpp"
- #include "opencv2/objdetect/objdetect.hpp"
- #pragma comment(lib,"opencv_calib3d2410d.lib")
- #pragma comment(lib,"opencv_contrib2410d.lib")
- #pragma comment(lib,"opencv_core2410d.lib")
- #pragma comment(lib,"opencv_features2d2410d.lib")
- #pragma comment(lib,"opencv_highgui2410d.lib")
- #pragma comment(lib,"opencv_imgproc2410d.lib")
- #pragma comment(lib,"opencv_objdetect2410d.lib")
- #pragma comment(lib,"opencv_video2410d.lib")
- #pragma comment(lib,"opencv_flann2410d.lib")
- #pragma comment(lib,"opencv_gpu2410d.lib")
- #pragma comment(lib,"opencv_legacy2410d.lib")
- #pragma comment(lib,"opencv_ml2410d.lib")
- #pragma comment(lib,"opencv_nonfree2410d.lib")
- #pragma comment(lib,"opencv_ocl2410d.lib")
- #pragma comment(lib,"opencv_photo2410d.lib")
- #pragma comment(lib,"opencv_stitching2410d.lib")
- #pragma comment(lib,"opencv_superres2410d.lib")
- #pragma comment(lib,"opencv_ts2410d.lib")
- #pragma comment(lib,"opencv_stitching2410d.lib")
- IplImage *image = , *hsv = , *hue = , *mask = , *backproject = , *histimg = ;
- CvHistogram *hist = ;
- int select_object = ; //select_object = 0,還沒圈選物件 1,已圈選
- int track_object = ; //1代表開始tracking, 0代表無追縱物件, -1代表初始化 先建model
- CvPoint origin; //取得滑鼠座標所在位置
- CvRect selection; //取得選擇ROI的資訊
- CvRect track_window;
- CvConnectedComp track_comp;
- int hdims = ; //histo要分幾維
- float hranges_arr[] = { , }; //hue只有0~180而已
- float* hranges = hranges_arr;
- bool g_bIsFinished = true;
- // OpenCV 滑鼠觸發後的回呼函式
- void on_mouse(int event, int x, int y, int flags, void* param) //x-軸 往右為正 最左為0, y-軸 往下為正 最上為0
- {
- if (!image) //至少要有image才能點滑鼠指標 才能產生下面的ROI 不然跳出
- return;
- if (image->origin) //如果image->origin為1代表該圖以左下為原點 0則是以左上為原點
- y = image->height - y; //1則把y值倒置 從下往上是正值 變成左下為0 match原圖座標軸
- if (select_object) //一開始select_object為0 所以進不來 但是只要一押了滑鼠鍵 就進得來了 代表開始選roi
- {
- selection.x = MIN(x, origin.x); //滑鼠按下去後 左上角的值隨時在變 所以一直update 取最左的x
- selection.y = MIN(y, origin.y);
- selection.width = selection.x + CV_IABS(x - origin.x); //OFFSET加X Y的長度,不能超過整個視窗大小
- selection.height = selection.y + CV_IABS(y - origin.y); //CV_IAB取絕對值 代表 整個視窗佔整個window的位置
- selection.x = MAX(selection.x, ); //X Y OFFSET至少要大於0 如果滑鼠拖超過視窗外 則設為0
- selection.y = MAX(selection.y, );
- selection.width = MIN(selection.width, image->width); //如果寬或長大過視窗 則先取視窗長度
- selection.height = MIN(selection.height, image->height); //最大也不會超過視窗大小
- selection.width -= selection.x; //上面所取的視窗長度扣掉OFFSET 不怕滑鼠拖移到視窗外
- selection.height -= selection.y;
- }
- switch (event)
- {
- case CV_EVENT_LBUTTONDOWN:
- {
- origin = cvPoint(x, y);
- selection = cvRect(x, y, , ); //按鍵一押下去 初始化 先得到roi的初始點(但有可能是roi四個角的其中一個點)
- select_object = ; //一旦押了滑鼠鍵 就等於開始選物件
- break;
- }
- case CV_EVENT_LBUTTONUP:
- {
- select_object = ; //一旦放了滑鼠鍵 物件選完
- if (selection.width > && selection.height > )
- track_object = -; //有了roi了 可以開始進行tracking的工具了
- break;
- }
- }
- }
- //把原hue轉成RGB
- CvScalar hsv2rgb(float hue)
- {
- int rgb[], p, sector;
- static const int sector_data[][] =
- { { , , }, { , , }, { , , }, { , , }, { , , }, { , , } };
- hue *= 0.033333333333333333333333333333333f;
- sector = cvFloor(hue);
- p = cvRound( * (hue - sector));
- p ^= sector & ? : ;
- rgb[sector_data[sector][]] = ;
- rgb[sector_data[sector][]] = ;
- rgb[sector_data[sector][]] = p;
- return cvScalar(rgb[], rgb[], rgb[], );
- }
- // 開始播放影像
- void PlayVideo()
- {
- CvCapture* capture = ;
- //capture = cvCaptureFromAVI("1.avi");
- capture = cvCreateCameraCapture();
- if (!capture)
- {
- fprintf(stderr, "Could not initialize capturing...\n");
- return;
- }
- cvNamedWindow("Tracking Demo", );
- cvNamedWindow("Histogram", );
- cvNamedWindow("Back Project", );
- cvSetMouseCallback("Tracking Demo", (CvMouseCallback)on_mouse);
- for (;;)
- {
- IplImage* frame = ;
- int i, bin_w, c;
- frame = cvQueryFrame(capture);
- if (!frame)
- { // 影片播放結束
- g_bIsFinished = true;
- break;
- }
- if (!image)
- {
- image = cvCreateImage(cvGetSize(frame), , );
- image->origin = frame->origin; //如果不加這一行的話 下面copy動作完之後,image->origin會從尾巴開始算 整張影像會倒過來
- hsv = cvCreateImage(cvGetSize(frame), , );
- hue = cvCreateImage(cvGetSize(frame), , );
- mask = cvCreateImage(cvGetSize(frame), , );
- backproject = cvCreateImage(cvGetSize(frame), , );
- backproject->origin = frame->origin;
- hist = cvCreateHist(, &hdims, CV_HIST_ARRAY, &hranges, );
- histimg = cvCreateImage(cvGetSize(frame), , );
- cvZero(histimg);
- }
- cvCopy(frame, image, );
- cvCvtColor(image, hsv, CV_BGR2HSV);
- if (track_object)
- {
- cvInRangeS(hsv, cvScalar(, , , ), cvScalar(, , , ), mask);
- cvSplit(hsv, hue, , , );
- if (track_object < )
- {
- float max_val = .f;
- cvSetImageROI(hue, selection);
- cvSetImageROI(mask, selection);
- cvCalcHist(&hue, hist, , mask);
- cvGetMinMaxHistValue(hist, , &max_val, , );
- cvConvertScale(hist->bins, hist->bins, max_val ? . / max_val : ., );
- cvResetImageROI(hue);
- cvResetImageROI(mask);
- track_window = selection;
- track_object = ; //此值等於1代表model建好 可以追縱了
- //下面為 建立histogram image
- cvZero(histimg);
- bin_w = histimg->width / hdims;
- for (i = ; i < hdims; i++)
- {
- int val = cvRound(cvGetReal1D(hist->bins, i)*histimg->height / );
- CvScalar color = hsv2rgb(i*.f / hdims);
- cvRectangle(histimg, cvPoint(i*bin_w, histimg->height),
- cvPoint((i + )*bin_w, histimg->height - val),
- color, -, , );
- }
- }
- cvCalcBackProject(&hue, backproject, hist);
- cvAnd(backproject, mask, backproject, );
- cvMeanShift(backproject, track_window,
- cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, , ),
- &track_comp);
- track_window = track_comp.rect;
- CvScalar cc;
- cc = cvScalar(, , );
- cvRectangle(image, cvPoint(track_window.x, track_window.y),
- cvPoint(track_window.x + track_window.width, track_window.y + track_window.height),
- cc, , , );
- }
- if (select_object && selection.width > && selection.height > )
- {
- cvSetImageROI(image, selection);
- cvXorS(image, cvScalarAll(), image, );
- cvResetImageROI(image);
- }
- cvShowImage("Tracking Demo", image);
- cvShowImage("Histogram", histimg);
- cvShowImage("Back Project", backproject);
- c = cvWaitKey();
- if (c == ) // ESC鍵,跳出程式
- break;
- }
- cvReleaseCapture(&capture);
- cvDestroyWindow("Back Project");
- cvDestroyWindow("Histogram");
- cvDestroyWindow("Tracking Demo");
- }
- int main()
- {
- while (g_bIsFinished)
- {
- g_bIsFinished = false;
- PlayVideo();
- }
- return ;
- }
Opencv CamShift+Kalman目标跟踪的更多相关文章
- Python Opencv-contrib Camshift&kalman卡尔曼滤波&CSRT算法 目标跟踪实现
本次课题实现目标跟踪一共用到了三个算法,分别是Camshift.Kalman.CSRT,基于Python语言的Tkinter模块实现GUI与接口设计,项目一共包含三个文件: main.py: # co ...
- 目标跟踪之粒子滤波---Opencv实现粒子滤波算法
目标跟踪学习笔记_2(particle filter初探1) 目标跟踪学习笔记_3(particle filter初探2) 前面2篇博客已经提到当粒子数增加时会内存报错,后面又仔细查了下程序,是代码方 ...
- 目标跟踪之camshift---opencv中meanshift和camshift例子的应用
在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行op ...
- 目标跟踪--CamShift
转载请注明出处! !! http://blog.csdn.net/zhonghuan1992 目标跟踪--CamShift CamShift全称是ContinuouslyAdaptive Mean S ...
- Video Target Tracking Based on Online Learning—深度学习在目标跟踪中的应用
摘要 近年来,深度学习方法在物体跟踪领域有不少成功应用,并逐渐在性能上超越传统方法.本文先对现有基于深度学习的目标跟踪算法进行了分类梳理,后续会分篇对各个算法进行详细描述. 看上方给出的3张图片,它们 ...
- TLD目标跟踪算法
1. 简介 TLD目标跟踪算法是Tracking-Learning-Detection算法的简称.这个视频跟踪算法框架由英国萨里大学的一个捷克籍博士生Zdenek Kalal提出.TLD将传统的视频跟 ...
- 目标跟踪之Lukas-Kanade光流法
转载自:http://blog.csdn.net/u014568921/article/details/46638557 光流是图像亮度的运动信息描述.光流法计算最初是由Horn和Schunck于19 ...
- Video Target Tracking Based on Online Learning—TLD单目标跟踪算法详解
视频目标跟踪问题分析 视频跟踪技术的主要目的是从复杂多变的的背景环境中准确提取相关的目标特征,准确地识别出跟踪目标,并且对目标的位置和姿态等信息精确地定位,为后续目标物体行为分析提供足 ...
- 目标跟踪之Lukas-Kanade光流法(转)
光流是图像亮度的运动信息描述.光流法计算最初是由Horn和Schunck于1981年提出的,创造性地将二维速度场与灰度相联系,引入光流约束方程,得到光流计算的基本算法.光流计算基于物体移动的光学特性提 ...
随机推荐
- mysql主从复制 转
mysql服务器的主从配置,这样可以实现读写分离,也可以在主库挂掉后从备用库中恢复.需要两台机器,安装mysql,两台机器要在相通的局域网内,可以分布在不同的服务器上,也可以在一台服务器上启动多个服务 ...
- re正则表达式13_review of regex symbols
Review of Regex Symbols This chapter covered a lot of notation, so here’s a quick review of what you ...
- 9月8日HTML表单元素(form、文本、按钮、选择)
表单元素 一.form form代表表单,功能:用于申明表单,定义采集数据的范围,也就是<form>和</form>里面包含的数据将被提交到服务器或者电子邮件里.<for ...
- WEB开发基本知识
参考文献:http://www.cnblogs.com/xdp-gacl/p/3729033.html 一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示I ...
- 《CSS3实战》读书笔记 第2章 层叠样式表(CSS)
## 层叠样式表 本章将阐述CSS的基本规则. ### 解构CSS 所谓CSS,由选择器(selector)和声明块(declaration block)组成.再进一步细分,每个声明包括了属性和值. ...
- CodeForces 710A King Moves(水题-越界问题)
题目链接:http://codeforces.com/problemset/problem/710/A 题目大意:在一个棋盘中给出一个位置,判断该位置周围8个点还有几个点可以摆放棋子. AC代码解释解 ...
- 使用docker安装lamp
docker search -s 10 lamp #搜索被收藏或使用较多的LAMP镜像,小伙伴们都推荐使用tutum/lamp docker pull tutum/lamp #下载镜像 #使用默认方式 ...
- ectouch笔记
1.取消配送方式验证mobile\include\apps\default\controller\FlowController.class.php 第1109行 if (isset($is_real_ ...
- Ubuntu如何以root身份登陆-(基于14.04版本)
1.打开terminal,输入命令 $ sudo passwd root 键入密码, 重复确认, 2.然后再次在终端模式下进入root, $ sudo -s -H 键入密码 # vi /usr/sh ...
- 【9-6】Centos学习笔记
linux文件系统结构 常用技巧 快捷键启动终端 su命令,使用超级用户登陆 visudo :编辑用户权限 tar xf 文件名:解压文件 Vim编辑器 Tips yum包管理:Yum(全称为 Yel ...