opencv开发笔记(六):鼠标操作回调函数的使用

// 鼠标操作回调函数.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<opencv2/opencv.hpp>
using namespace cv;
#define WINDOW_NAME "程序窗口"
//函数声明
void on_mouse(int event,int x,int y,int flags,void* param);
void drawrect(cv::Mat& img,cv::Rect box);
//全局变量
Rect g_rect;
bool g_bdr= false;
RNG g_rng(12345);
int main(int argc,char** argv)
{   //准备参数
g_rect = Rect(-1,-1,0,0);//左上角的横坐标、纵坐标、宽度、高度
Mat src(600, 800, CV_8UC3),teampimage;//定义并初始化矩阵(图像)srcImage,长宽分别为600*800;CV_8UC3表示存储类型,3表示通道数;
src.copyTo(teampimage);
g_rect = Rect(-1, -1, 0, 0);
src = Scalar::all(0);  //灰度值
//设置鼠标回调函数
cvNamedWindow(WINDOW_NAME);
setMouseCallback(WINDOW_NAME,on_mouse,(void*)&src); //第三个参数必须是void*类型的用户传的参数
//程序进行绘制
while (1) {
src.copyTo(teampimage);
if (g_bdr) {
drawrect(teampimage, g_rect);    //绘制标识符为真则进行绘制
}
imshow(WINDOW_NAME, teampimage);
if (waitKey(10) == 27)break;
}
    return 0;
}
//鼠标回调函数
void on_mouse(int event, int x, int y, int flags, void* param){
Mat &image = *(cv::Mat*)param;
switch (event)
{
case EVENT_MOUSEMOVE:
{
if (g_bdr) {
g_rect.width = x - g_rect.x;
g_rect.height = y - g_rect.y;
}
}
break;
case EVENT_LBUTTONDOWN:
{
g_bdr = true;
g_rect = Rect(x, y, 0, 0);
}
break;
case EVENT_LBUTTONUP:
{
g_bdr = false;
if (g_rect.width < 0)
{
g_rect.x += g_rect.width;
g_rect.width *= -1;
}
if (g_rect.height < 0)
{
g_rect.y += g_rect.height;
g_rect.height *= -1;
}
drawrect(image,g_rect);
}
break;
default:
break;
}
}
//矩形绘制函数
void drawrect(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)));

}


最后调试程序的结果如下图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值