鼠标操作的消息映射方式:中介函数(SetMouseCallback)+回调函数。
鼠标操作:1)鼠标移动(EVENT_MOUSEMOVE)
2) 左键按下(EVENT_LMOUSEDOWN)
3) 左键拿起(EVENT_LMOUSEUP)
4) 右键按下(EVENT_RMOUSEDOWN)
5) 右键拿起(EVENT_RMOUSEUP)
如果出现这个错误:错误 1 error C2664: “void cv::setMouseCallback(const std::string &,cv::MouseCallback,void *)”: 无法将参数 2 从“void (__cdecl *)(int,int,int,void *)”转换为“cv::MouseCallback” E:\学习资料\VS2013程序\imageblur\imageblur\imagefusion.cpp 54 1 imageblur
注意观察有没有声明全局函数MouseCallback,以及MouseCallback声明的是否正确。
#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
using namespace cv;
using namespace std;
#define WINDOW_NAME "【程序窗口】"
// 全局函数声明
void on_MouseHandle(int event,int x,int y, int flags, void* param);
void DrawRectangle(cv::Mat& img, cv::Rect box);
//全局变量声明
Rect g_rectangle;
bool g_bDrawingBox = false;
RNG g_rng(12345);
// 主函数
int main(int argc, char** argv)
{
g_rectangle = Rect(-1,-1,0,0);
Mat srcImage(600, 800, CV_8UC3), tempImage; //定义了两个图像变量srcImage和tempImage
srcImage.copyTo(tempImage);
g_rectangle=Rect(-1, -1, 0, 0);
srcImage = Scalar::all(255); //设置元素的初始值,即srcImage 里面全为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;
}
return 0;
}
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)
{
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;
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;
}
}
void DrawRectangle(cv::Mat& img, cv::Rect box)
{
cv::rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255),
g_rng.uniform(0, 255), g_rng.uniform(0, 255)));
}