#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目标跟踪的更多相关文章

  1. Python Opencv-contrib Camshift&kalman卡尔曼滤波&CSRT算法 目标跟踪实现

    本次课题实现目标跟踪一共用到了三个算法,分别是Camshift.Kalman.CSRT,基于Python语言的Tkinter模块实现GUI与接口设计,项目一共包含三个文件: main.py: # co ...

  2. 目标跟踪之粒子滤波---Opencv实现粒子滤波算法

    目标跟踪学习笔记_2(particle filter初探1) 目标跟踪学习笔记_3(particle filter初探2) 前面2篇博客已经提到当粒子数增加时会内存报错,后面又仔细查了下程序,是代码方 ...

  3. 目标跟踪之camshift---opencv中meanshift和camshift例子的应用

    在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行op ...

  4. 目标跟踪--CamShift

    转载请注明出处! !! http://blog.csdn.net/zhonghuan1992 目标跟踪--CamShift CamShift全称是ContinuouslyAdaptive Mean S ...

  5. Video Target Tracking Based on Online Learning—深度学习在目标跟踪中的应用

    摘要 近年来,深度学习方法在物体跟踪领域有不少成功应用,并逐渐在性能上超越传统方法.本文先对现有基于深度学习的目标跟踪算法进行了分类梳理,后续会分篇对各个算法进行详细描述. 看上方给出的3张图片,它们 ...

  6. TLD目标跟踪算法

    1. 简介 TLD目标跟踪算法是Tracking-Learning-Detection算法的简称.这个视频跟踪算法框架由英国萨里大学的一个捷克籍博士生Zdenek Kalal提出.TLD将传统的视频跟 ...

  7. 目标跟踪之Lukas-Kanade光流法

    转载自:http://blog.csdn.net/u014568921/article/details/46638557 光流是图像亮度的运动信息描述.光流法计算最初是由Horn和Schunck于19 ...

  8. Video Target Tracking Based on Online Learning—TLD单目标跟踪算法详解

    视频目标跟踪问题分析         视频跟踪技术的主要目的是从复杂多变的的背景环境中准确提取相关的目标特征,准确地识别出跟踪目标,并且对目标的位置和姿态等信息精确地定位,为后续目标物体行为分析提供足 ...

  9. 目标跟踪之Lukas-Kanade光流法(转)

    光流是图像亮度的运动信息描述.光流法计算最初是由Horn和Schunck于1981年提出的,创造性地将二维速度场与灰度相联系,引入光流约束方程,得到光流计算的基本算法.光流计算基于物体移动的光学特性提 ...

随机推荐

  1. MySQL------MySQL与SQLServer数据类型的转换

    MySQL SQLServer

  2. 4个mysql客户端工具的比较

    mysql是我以前学习和练习所使用的数据,现在在工作中也在使用,之前公司里用oracle,我在做自己的东西的时候觉得用oracle太不方便,于是就找了mysql(当时也考虑过sqlserver,觉得还 ...

  3. 20145212 实验三《敏捷开发与XP实践》

    20145212 实验三<敏捷开发与XP实践> 实验内容 使用git上传代码 与20145223同学一组,使用git相互更改代码 同组实验报告链接:http://www.cnblogs.c ...

  4. 一种nodejs的MVC框架

    mvc会针对请求进行分发,分发一般有controller(针对模块),action(针对模块中的方法),args(请求的参数). 1.先对http请求的url进行设置,解析url中的各种参数: //c ...

  5. web页面的加载顺序

    1.页面顺序 一个典型的web页面由于三个部分组成:html.css和JS.执行的顺序是: 在构造完HTML的dom结构时.触发DOMContentLoaded事件. 整个执行过程安装html的顺序来 ...

  6. jquery 停止animate动画,并且回复最初状态

    // 热门推荐悬浮效果 $("#recom_con li img").mouseenter(function(){ $(this).stop(true, true); $w = p ...

  7. ecshop 订单-》订单状态

    /** * 取得状态列表 * @param string $type 类型:all | order | shipping | payment */ function get_status_list($ ...

  8. ecshop循环foreach,iteration,key,index

    转载: 最近刚接触ecshop不久,感觉是非常的强大,做商城网站,整个流程都差不多搞好了,就是支付流程要自己完善完善,不过也有不足,文章功能还不够好. 通过几天的应用,总结出了ec模版中foreach ...

  9. eshop截取字符串长度 和去掉省略号

    <!-- {if $goods.goods_brief} --> {$goods.goods_brief|truncate:17}<!-- {/if} --> 去掉省略号: 找 ...

  10. 字体投影(test-shadow)与框架投影(box-shadow)

    字体投影:text-shadow: 1px 1px 1px #ccc; 框架投影:box-shadow: 10px 10px 25px #ccc;