HighGUI图形用户界面初步:鼠标 *** 作,示例程序(鼠标交互)
OpenCV中的鼠标 *** 作和滑动条的消息映射方式很类似,都是通过一个中介函数配合一个回调函数来实现的。创建和指定滑动条回调函数的函数为createTrackbar,而指定鼠标 *** 作消息回调函数的函数为SetMouseCallback。下面一起来了解一下它。
SetMousecallback函数的作用是为指定的窗口设置鼠标回调函数,原型如下。
C++ : void setMousecallback (conststring& winname,MouseCallback onMouse,void* userdata=0 )
第一个参数,const string&类型的winname,窗口的名字。
第二个参数,MouseCallback类型的onMouse,指定窗口里每次鼠标时间发生的时候,被调用的函数指针。
第三个参数,void*类型的userdata,用户定义的传递到回调函数的参数,有默认值0。
示例程序:了解函数的用法以及如何在opencv中使用鼠标进行交互
代码如下:
#include#include //opencv highgui 头文件 #include //opencv 图像处理头文件 #include #include #include using namespace cv; #define WINDOW_NAME "[程序窗口]" //为窗口标题定义的宏 //全局函数声明 void on_MouseHandle(int event,int x,int y,int flags,void* param); void DrawRectangle(cv::Mat& img, cv::Rect box); //void showHelpText(); //全局变量的声明 Rect g_rectangle; bool g_bDrawingBox = false; //是否进行绘剖 RNG g_rng(12345); int main(int argc,char** argv) { cv::utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);//控制台不在输出日志文件 //准备参数 g_rectangle = Rect(-1, -1, 0, 0); Mat srcImage(600, 800, CV_8UC3), tempImage; srcImage.copyTo(tempImage); g_rectangle = Rect(-1, -1, 0, 0); srcImage = Scalar::all(0); //设置鼠标 *** 作回调函数 namedWindow(WINDOW_NAME); setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage); //程序主循环,当进行绘制的标识符为真时,进行绘制 while (1) { srcImage.copyTo(tempImage); //复制源图到临时变量 if (g_bDrawingBox) DrawRectangle(tempImage, g_rectangle); //当进行绘制的标识符为真,则进行绘制 imshow(WINDOW_NAME, tempImage); if (waitKey(10) == 27) break; //按下ESC键,程序退出 } return 0; } //on_MouseHandle函数 //描述:鼠标回调函数,根据不同的鼠标事件进行不同的 *** 作 void on_MouseHandle(int event,int x,int y,int flags,void* param) { Mat& image = *(cv:: Mat*) param; switch (event) { //鼠标移动消息 case EVENT_MOUSEMOVE: { if (g_bDrawingBox)//如果是否进行绘制的标识符为真,则记录下长和宽到RECT型变量中 { g_rectangle.width = x - g_rectangle.x; g_rectangle.height = y - g_rectangle.y; } } break; //左键按下消息 case EVENT_LBUTTONDOWN: { g_bDrawingBox = true; g_rectangle = Rect(x, y, 0, 0);//记录起始点 } break; //左键抬起消息 case EVENT_LBUTTONUP: { g_bDrawingBox = false; //置标识符为false//对宽和高小于0的处理 if (g_rectangle.width < 0) { g_rectangle.x += g_rectangle.width; g_rectangle.width *= -1; } if (g_rectangle.height < 0){ g_rectangle.y += g_rectangle.height; g_rectangle.height *= -1; } //调用函数进行绘制 DrawRectangle(image,g_rectangle); } break; } } //DrawRectangle()函数 //自定义的矩形绘制函数 void DrawRectangle(cv::Mat & img, cv::Rect box) { rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//随机颜色 }
运行截图:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)