话不多说,直接甩代码。
以下代码实现的功能如下:
1、通过鼠标左键的按下和松开,在黑色的窗口中绘制矩形。
2、按esc退出,并将绘制的图片导出保存。
3、主要使用 鼠标回调函数setMouseCallback(.....)。
#include <opencv2/opencv.hpp>
using namespace cv;
//-----------------------【全局变量声明部分】-------------------------
Rect m_rect;
bool m_drawBox = false;
RNG m_rng(12345);
String windowName = "鼠标拖动绘制矩形";
//-----------------------【全局函数声明部分】-------------------------
void on_mouseHandle(int event,int x,int y,int flag, void *param);
void DrawRect(Mat &img,Rect box);
//-----------------------【main函数部分】-----------------------------
int main(int argc,char* argv[]){
m_rect = Rect(-1,-1,0,0);
Mat srcImg(600,800,CV_8UC3),tempImg;
srcImg.copyTo(tempImg);
srcImg = Scalar::all(0);
namedWindow(windowName);
/*--------------------【setMouseCallback说明】--------------------
函数void setMouseCallback(conststring& winname,//窗口的名字
MouseCallback onMouse,//指定窗口里每次鼠标时间发生的时候,被调用的函数指针
void* userdata=0);//用户定义的传递到回调函数的参数,有默认值0
onMouse函数的原型应该为voidFoo(int event, int x, int y, int flags, void* param);
其中event是 CV_EVENT_*变量之一,
x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系),
flags是CV_EVENT_FLAG的组合,
param是用户定义的传递到cvSetMouseCallback函数调用的参数。
-------------------------------------------------------------------*/
setMouseCallback(windowName,on_mouseHandle,(void *)&srcImg);
while(1){
srcImg.copyTo(tempImg);
if(m_drawBox) DrawRect(tempImg,m_rect);
imshow(windowName,srcImg);
if(waitKey(10) == 27 ) {
imwrite("1.png",srcImg);
break;
}
}
return 0;
}
//-----------------------【on_mouseHandle函数】---------------------------
void on_mouseHandle(int event,int x,int y,int flag, void *param){
//先将param强制转化成一个mat类型的指针,然后引用指针指向的值(即image是*param的一个别名)
Mat &image = *(Mat*) param;
//Mat *image = (Mat*) param;//与上述语句功能等价
switch (event)
{
case EVENT_MOUSEMOVE:
{
if(m_drawBox){
m_rect.width = x - m_rect.x;
m_rect.height = x - m_rect.y;
}
}
break;
case EVENT_LBUTTONDOWN:
{
m_drawBox = true;
m_rect = Rect(x,y,0,0);
}
break;
case EVENT_LBUTTONUP:
{
m_drawBox = false;
if(m_rect.width < 0){
m_rect.x += m_rect.width;
m_rect.width *= -1;
}
if(m_rect.height < 0){
m_rect.y += m_rect.height;
m_rect.height *= -1;
}
DrawRect(image,m_rect);
m_rect = Rect(-1,-1,0,0);
}
default:
break;
}
}
//-----------------------【DrawRect函数】---------------------------
void DrawRect(Mat &img,Rect box){
rectangle(img,box.tl(),box.br(),
Scalar(m_rng.uniform(0,255),m_rng.uniform(0,255),m_rng.uniform(0,255)));
}