之前的日志“VS2005下配置OpenCV2.1 ” 里介绍了如何在VS2005里安装OpenCV2.1,下面这篇日志里就介绍了下如何使用CV来控制鼠标移动。代码和AutoCamShift例子里的差 不多,只是我进行了许多代码的删减以及我添加稍许注释,另外就是补充了::SetCursorPos(_x,_y)函数。
不太多说废话,C++代码如下:
001 |
#include "cv.h" |
002 |
#include "highgui.h" |
003 |
#include |
004 |
#include |
005 |
006 |
//基本的图像指针 |
007 |
IplImage *image = 0 |
008 |
, *hsv = 0 |
009 |
, *hue = 0 |
010 |
, *mask = 0 |
011 |
, *backproject = 0 |
012 |
, *histimg = 0; |
013 |
014 |
//用于直方图 |
015 |
CvHistogram *hist = 0; |
016 |
017 |
//用于判断 |
018 |
int select_object = 0; |
019 |
int track_object = 0; |
020 |
int cursor_object=0; |
021 |
022 |
//用于鼠标选择区域 |
023 |
CvPoint origin; |
024 |
CvRect selection; |
025 |
026 |
//CAMSHIFT算法用到 |
027 |
CvRect track_window; |
028 |
CvBox2D track_box; |
029 |
CvConnectedComp track_comp; |
030 |
031 |
// 划分HIST的个数,越高越精确 |
032 |
int hdims = 48; |
033 |
034 |
//设置HSV的范围(0-180) |
035 |
float hranges_arr[] = {0,180}; |
036 |
float * hranges = hranges_arr; |
037 |
038 |
void on_mouse( int event, int x, int y, int flags, void * param) |
039 |
{
|
040 |
if ( !image ) |
041 |
return ; |
042 |
043 |
if ( image->origin ) |
044 |
y = image->height - y; |
045 |
046 |
//左键按下时 select_object=1 |
047 |
//右键按下时 select_object=0 |
048 |
if ( select_object ) |
049 |
{
|
050 |
selection.x = MIN(x,origin.x); |
051 |
selection.y = MIN(y,origin.y); |
052 |
selection.width = selection.x + CV_IABS(x - origin.x); |
053 |
selection.height = selection.y + CV_IABS(y - origin.y); |
054 |
055 |
selection.x = MAX( selection.x, 0 ); |