opencv学习实例(一)---camshift 色块追踪(详细注释)

建议拷贝到本地看。借鉴了众多网站,才大概明白了这个程序的大概怎么运行的, 技术细节以及原理恕我无能为力.
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( )函数】--------------------------------------------
//
  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值