opencv可以通过鼠标来执行一些操作,主要用到setMouseCallback这个函数,函数的具体形式如下:
void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)
winname:窗口的名字
onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针。 这个函数的原型应该为void on_Mouse(int event, int x, int y, int flags, void* param);
userdate:传给回调函数的参数,也可以理解为setMousecallback函数的ID,可将用户的src传到这里
回调函数onMouse定义如下:
void on_Mouse(int event, int x, int y, int flags, void* param);
event是 CV_EVENT_*变量之一
x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系)
flags是CV_EVENT_FLAG的组合,代表鼠标的拖拽事件或者键盘鼠标的联合事件
param是用户定义的传递到setMouseCallback函数调用的参数,也可以理解为on_Mouse函数的ID。
Event:
#define CV_EVENT_MOUSEMOVE 0 //滑动
#define CV_EVENT_LBUTTONDOWN 1 //左键点击
#define CV_EVENT_RBUTTONDOWN 2 //右键点击
#define CV_EVENT_MBUTTONDOWN 3 //中键点击
#define CV_EVENT_LBUTTONUP 4 //左键放开
#define CV_EVENT_RBUTTONUP 5 //右键放开
#define CV_EVENT_MBUTTONUP 6 //中键放开
#define CV_EVENT_LBUTTONDBLCLK 7 //左键双击
#define CV_EVENT_RBUTTONDBLCLK 8 //右键双击
#define CV_EVENT_MBUTTONDBLCLK 9 //中键双击
具体编程如下:
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>
#include<cmath>
#include<iostream>
#include<vector>
using namespace std;
using namespace cv;
Mat src;//可以不用这个全局变量,而使用void*传入,只是在函数里面要将void*转换为Mat
void MouseEvent(int event, int x, int y, int flags, void* data)
{
char charText[30];
Mat temp;
temp = src.clone();
Vec3b p = temp.at<Vec3b>(y, x); //坐标系不同
//格式化输出,charText为R=,G=,B=
sprintf(charText, "R=%d, G=%d, B=%d", p[2], p[1], p[0]);
//将charText输出到temp图像上,后面的参数都是定义输出的位置,字体,字号,颜色等
putText(temp,charText,Point(8,20),FONT_HERSHEY_COMPLEX,2,CV_RGB(255,200,178));
imwrite("E:\\研究生\\学习材料\\学习书籍\\OpenCV图像处理编程实例-源码-20160801\\《OpenCV图像处理编程实例-源码-20160801\\images\\flowerRGB.jpg",temp);
}
int main()
{
src = imread("E:\\研究生\\学习材料\\学习书籍\\OpenCV图像处理编程实例-源码-20160801\\《OpenCV图像处理编程实例-源码-20160801\\images\\flower4.jpg");
if (src.empty())
return -1;
namedWindow("src");
setMouseCallback("src",MouseEvent);
imshow("src",src);
waitKey(0);
}