建议拷贝到本地看。借鉴了众多网站,才大概明白了这个程序的大概怎么运行的, 技术细节以及原理恕我无能为力.
ps: 我所知道的都写在注释里了,新的问题,问我我也极大概率不知道,抱歉。
/* 程序描述:来自OpenCV安装目录下Samples文件夹中的官方示例程序-彩色目标跟踪操作
增加了"非常"详细的注释。----97年的顽石
------------------------------------------------------------------------------------------------*/
/*---------------------------------【头文件、命名空间包含部分】----------------------------------
描述:包含程序所使用的头文件和命名空间
-------------------------------------------------------------------------------------------------*/
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
/*
highgui为跨平台的gui/IO组件,支持平台包括windows,linux,mac,IOS,android,
可支持图像/视频/摄像头的读取显示以及转码。
*/
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
//ctype.h是C标准函数库中的头文件,定义了一批C语言字符分类函数--百度百科
#include <ctype.h>
using namespace cv;
using namespace std;
//-----------------------------------【全局变量声明】-----------------------------------------
// 描述:声明全局变量
//-------------------------------------------------------------------------------------------------
Mat image;
bool backprojMode = false; //表示是否要进入反向投影模式,ture表示准备进入反向投影模式
bool selectObject = false; //代表是否在选要跟踪的初始目标,true表示正在用鼠标选择
int trackObject = 0; //代表跟踪目标数目?
bool showHist = true; //是否显示直方图
Point origin; //用于保存鼠标选择第一次单击时点的位置
Rect selection; //用于保存鼠标选择的矩形框
int vmin = 10, vmax = 256, smin = 30;
//--------------------------------【onMouse( )回调函数】------------------------------------
// 描述:鼠标操作回调
//-------------------------------------------------------------------------------------------------
static void onMouse( int event, int x, int y, int, void* )
{
/*
然后鼠标在移动触发if (selectObject) 这一行.
这时候新的坐标点的x,y值都会传过来,
不管是从哪个方向往哪个方向画都可以得到矩形
(因为他是取绝对值的,从左下往。。。,等等等都行)
http://blog.csdn.net/ddqqfree123/article/details/52173359
*/
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 CV_EVENT_LBUTTONDOWN: 这一行
case CV_EVENT_LBUTTONDOWN:
origin = Point(x,y);
selection = Rect(x,y,0,0);
selectObject = true;
break;
//左键鼠标抬起这个事件 传到函数里,触发 case CV_EVENT_LBUTTONUP:这一行
case CV_EVENT_LBUTTONUP:
selectObject = false;
if( selection.width > 0 && selection.height > 0 )
//跟踪目标数量为什么要设置为-1? 后面有if(trackObject <0)就画出直方图
trackObject = -1;
break;
}
}
//--------------------------------【help( )函数】----------------------------------------------
// 描述:输出帮助信息
//-------------------------------------------------------------------------------------------------
static void ShowHelpText()
{
cout << "\n\n\t此Demo显示了基于均值漂移的追踪(tracking)技术\n"
"\t请用鼠标框选一个有颜色的物体,对它进行追踪操作\n";
cout << "\n\n\t操作说明: \n"
"\t\t用鼠标框选对象来初始化跟踪\n"
"\t\tESC - 退出程序\n"
"\t\tc - 停止追踪\n"
"\t\tb - 开/关-投影视图\n"
"\t\th - 显示/隐藏-对象直方图\n"
"\t\tp - 暂停视频\n";
}
const char* keys =
{ "{1| | 0 | camera number}"
};
//-----------------------------------【main( )函数】--------------------------------------------
//