OpenCV鼠标事件
1、简介
鼠标事件使用传统的回调函数机制来完成。我们事先写好一个回调程序,在OpenCV发生任何鼠标事件时,都会调用这个程序。
2、鼠标事件回调函数原型
-
void mouse_callback(
-
int event,
-
int x,
-
int y,
-
int flags,
-
void* parmas);
event: 鼠标事件类型
- x: 鼠标事件发生时的x坐标。这里的坐标是图像上的像素坐标
- y: 鼠标事件发生时的y坐标。
- flags: 标志位,每一个位表示不同的条件,具体条件如下
- params: 用于传递额外的信息给鼠标事件
3、鼠标注册函数
-
void cv::setMouseCallback(
-
const string& windowName,
-
cv::MouseCallback on_mouse,
-
void* param = NULL
-
);
- windowName: 回调函数作用的窗口名称
- on_mouse: 要注册的回调函数
- param: 给回调函数传递的参数
4、简单绘图例子
-
#include <QCoreApplication>
-
#include "opencv2/opencv.hpp"
-
-
void my_mouse_callback(int event, int x, int y, int flags, void* param); //自己定义的鼠标事件回调函数
-
-
cv::Rect box;
-
bool drawing_box = false;
-
-
void draw_box(cv::Mat& img, cv::Rect box)
-
{
-
cv::rectangle(img, box.tl(), box.br(), cv::Scalar(0x00, 0x00, 0xFF));//BGR画红色的框
-
}
-
-
int main(int argc, char *argv[])
-
{
-
QCoreApplication a(argc, argv);
-
-
box = cv::Rect(-1, -1, 0, 0);
-
cv::Mat img(200, 200, CV_8UC3), temp;
-
img.copyTo(temp); //使用copyTo复制一个img类
-
-
img = cv::Scalar::all(0); //给img所有像素初始化为黑色
-
cv::namedWindow("DBox_test"); //创建一个显示窗口
-
-
//注册自己的鼠标回调
-
cv::setMouseCallback("DBox_test", my_mouse_callback, (void*)&img);
-
-
for (;;) {
-
img.copyTo(temp);
-
if(drawing_box)
-
draw_box(temp, box);
-
cv::imshow("DBox_test", temp);
-
-
if(cv::waitKey(15) == 27)
-
break;
-
}
-
return a.exec();
-
}
-
-
void my_mouse_callback(int event, int x, int y, int flags, void* param)
-
{
-
cv::Mat& image = *(cv::Mat*)param;
-
-
switch (event) {
-
case cv::EVENT_MOUSEMOVE:
-
//在绘画状态中,鼠标移动时,记录当前xy轴,绘制矩形
-
if(drawing_box) {
-
box.width = x - box.x;
-
box.height = y - box.y;
-
}
-
break;
-
case cv::EVENT_LBUTTONDOWN:
-
drawing_box = true; //鼠标左键按下,开始绘制
-
box = cv::Rect(x, y, 0, 0); //记录鼠标左键按下时的x,y轴,作为矩形起点
-
break;
-
case cv::EVENT_LBUTTONUP:
-
drawing_box = false; //鼠标左键松开,绘制完成
-
if(box.width < 0) {
-
box.x = box.width; //鼠标向左边运行,x轴负增长,所以这里取反
-
box.width *= -1;
-
}
-
if(box.height < 0) {
-
box.y = box.height; //鼠标向上方运行,y轴负增长,取反
-
box.height *= -1;
-
}
-
draw_box(image, box);
-
break;
-
}
-
}
-
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C 语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhhackkc
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13