版权声明:本文为博主原创文章,未经博主允许不得转载。
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
bool g_bDrawing = false;
RNG g_rng(12345);
Point g_nCurrPoint;
Point g_nPrePoint = Point(0,0);
int g_nThick = 0, g_nBlue = 0, g_nGreen = 0, g_nRed = 255;
/*注意:不能在毁掉函数中写入未初始化的矩阵类,所以需要用时,需要写一个标志位,然后再在while(1)循环内使用*/
void onMouse(int event, int x, int y, int flag, void *param)
{
Mat &img = *(cv::Mat*)param;
switch (event)
{
//点击鼠标左键时
case CV_EVENT_LBUTTONDOWN:
{
g_bDrawing = true;
g_nPrePoint = Point(x, y);
}
break;
//松开鼠标左键时
case CV_EVENT_LBUTTONUP:
{
g_bDrawing = false;
}
break;
//移动鼠标的时候
case CV_EVENT_MOUSEMOVE:
{
if(g_bDrawing)
{
g_nCurrPoint = Point(x, y);
//将前一点与现在鼠标所在的点连接,色彩由scalar内参数调整,
line(img, g_nPrePoint, g_nCurrPoint, Scalar(g_nBlue, g_nGreen, g_nRed),g_nThick + 1, 4); //line函数
g_nPrePoint=g_nCurrPoint;
}
}
break;
}
}
int main()
{
Mat srcImage(600, 800, CV_8UC3);
Mat tempImage;
srcImage.copyTo(tempImage);
srcImage = Scalar::all(255);
namedWindow("【鼠标事件窗口】", 1);
setMouseCallback("【鼠标事件窗口】", onMouse, (void *)&srcImage);
//创建颜色控制窗口
// namedWindow("【滚动条窗口】", 1);
createTrackbar("thick", "【鼠标事件窗口】", &g_nThick, 10, 0);
createTrackbar("Red", "【鼠标事件窗口】", &g_nRed, 255, 0);
createTrackbar("Green", "【鼠标事件窗口】", &g_nGreen, 255, 0);
createTrackbar("Blue", "【鼠标事件窗口】", &g_nBlue, 255, 0);
后期想法:再创建显示颜色合成窗口,让人知道调试了什么颜色、、、、
// Mat imag2;
// Mat ImageROI(srcImage,cv::Rect(srcImage.cols-imag2.cols,srcImage.rows-imag2.rows));
// imag2.copyTo(srcImageROI);
char key;
while (1)
{
imshow("【鼠标事件窗口】", srcImage);
key = waitKey(1);
if (key == 27)
break;
if (key == 'r')
srcImage = Scalar::all(255);
if (key == 's')
imwrite("MouseDraw.jpg", srcImage);
}
return 0;
}