void setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata=)

winname

窗口名字

onMouse

指定窗口每次鼠标事件发生的时候,被调用的函数指针。函数的原型应为void Foo(int event, int x, int y, int flags, void* param)。

  • event: 变量EVENT_XXX,例如
    • EVNET_MOUSEMOVE: 鼠标移动消息
    • EVENT_LBUTTONDOWN: 鼠标左键按下消息
  • x, y: 鼠标指针在图像坐标系中的坐标值(不是窗口坐标系)
  • flags: EVENT_FLAG的组合
  • param: 用户定义的传到SetMouseCallback函数调用的参数

userdata

用户定义的传递到回调函数的参数

示例

用鼠标在画框中华矩形,MouseEvent.cxx:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp> #define WINDOW_NAME "Painting Window" // global function declaration
void on_MouseHandle( int event, int x, int y, int flags, void* param );
void DrawRectangle( cv::Mat& img, cv::Rect box );
void ShowHelpText(); // global variables
cv::Rect g_rectangle;
bool g_bDrawingBox = false; // draw or not
cv::RNG g_rng(); // main
int main( int argc, char** argv )
{
// initialize parameters
g_rectangle = cv::Rect( -, -, , );
cv::Mat srcImage( , , CV_8UC3 ), tempImage;
srcImage.copyTo( tempImage ); g_rectangle = cv::Rect( -, -, , );
srcImage = cv::Scalar::all(); // create window
cv::namedWindow(WINDOW_NAME); // set call back function
cvSetMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage); while()
{
srcImage.copyTo(tempImage); // show rectangle while the mouse moves
if (g_bDrawingBox)
DrawRectangle(tempImage, g_rectangle); cv::imshow(WINDOW_NAME, tempImage); if (cvWaitKey()==) {
cv::imwrite("result.jpg", tempImage);
break; // Press ECS to exit.
}
}
return ;
} // mouse call back function
void on_MouseHandle( int event, int x, int y, int flags, void* param )
{
cv::Mat& image = *(cv::Mat*) param;
switch (event) {
case cv::EVENT_MOUSEMOVE:
// if mouse moved and drawing flag is true, update the rectangle size
if (g_bDrawingBox) {
g_rectangle.width = x-g_rectangle.x;
g_rectangle.height = y-g_rectangle.y;
}
break;
case cv::EVENT_LBUTTONDOWN:
// if left button was clicked, prepare to draw rectangle
// (set the flag as true and mark the start position)
{
g_bDrawingBox = true;
g_rectangle = cv::Rect( x, y, , ); // mark the start point
}
break;
case cv::EVENT_LBUTTONUP:
{
g_bDrawingBox = false;
if (g_rectangle.width<) {
g_rectangle.x += g_rectangle.width;
g_rectangle.width *= -;
}
if (g_rectangle.height<) {
g_rectangle.y += g_rectangle.height;
g_rectangle.height *= -;
}
// draw
DrawRectangle(image, g_rectangle);
}
break;
}
} // user defined function to draw rectangle
void DrawRectangle( cv::Mat& img, cv::Rect box )
{
// random color
cv::rectangle(img, box.tl(), box.br(), cv::Scalar(g_rng.uniform(, ), g_rng.uniform(, ), g_rng.uniform(, )));
}

结果图

鼠标操作[OpenCV 笔记10]的更多相关文章

  1. 图像显示 imshow()[OpenCV 笔记5]

    void imshow(const string& winname InputArray mat); winname 窗口表识名称 mat 需要显示的图像.InputArray类型,声明如下 ...

  2. OpenCV基本架构[OpenCV 笔记0]

    最近正在系统学习OpenCV,将不定期发布笔记,主要按照毛星云的<OpenCV3编程入门>的顺序学习,会参考官方教程和文档.学习工具是Xcode+CMake,会对书中一部分内容更正,并加入 ...

  3. 访问图像中的像素[OpenCV 笔记16]

    再更一发好久没更过的OpenCV,不过其实写到这个部分对计算机视觉算法有所了解的应该可以做到用什么查什么了,所以后面可能会更的慢一点吧,既然开了新坑,还是机器学习更有研究价值吧... 图像在内存中的存 ...

  4. 查找并绘制轮廓[OpenCV 笔记XX]

    好久没有更新了,原谅自己放了个假最近又在赶进度,所以...更新的内容是很靠后的第八章,因为最近工作要用就先跳了,后面会更新笔记编号...加油加油! 在二值图像中寻找轮廓 void cv::findCo ...

  5. 颜色空间转换 cvtColor()[OpenCV 笔记13]

    void cvtColor(InputArray src, OutputArray dst, ) src: 输入图像 dst: 输出图像 code: 颜色空间转换标识符 OpenCV2的CV_前缀宏命 ...

  6. 图像储存容器Mat[OpenCV 笔记11]

    IplImage 与 Mat IplImage是OpenCV1中的图像存储结构体,基于C接口创建.在退出之前必须release,否则就会造成内存泄露.在一些只能使用C语言的嵌入式系统中,不得不使用. ...

  7. 实例:图像载入、显示、混合与输出[OpenCV 笔记8]

    是的是的,忍着尿意努力更新,就是为了更到wuli男神的部分,当然要把男神放在前面镇楼,欢迎下载配图,具体操作见code wuliEddie.jpg logo.png results.jpg LoadS ...

  8. 实例:图形绘制[OpenCV 笔记15]

    DrawShapes.cxx # include "DrawShapes_utils.h" #define WINDOW_NAME1 "Painting 1" ...

  9. Core模块其他常用知识点[OpenCV 笔记14]

    Matx 轻量级的Mat,必须在使用前规定好大小,比如一个2x3的float型的Matx,可以声明为Matx23f Vec Vec是Matx的一个派生类,是一个一维的Matx,跟vector很相似.在 ...

随机推荐

  1. PHP字符串替换函数strtr()

    strtr函数比str_replace函数的效率要高很多,strtr()的两种定义方式: strtr(string, from, to)和strtr(string, array)1.strtr区分大小 ...

  2. js定时显示广告代码

    这是一则定时显示广告的javascript代码,当然也可以定时显示某一区块内容,很实用. 代码如下: function strToDate(str, ext) { if (str == null || ...

  3. 【python自动化第八篇:网络编程】

    一.拾遗 动态导入模块 目的是为了在导入模块的过程中将模块以字符的格式导入. #!/usr/bin/env python # -*- coding:utf-8 -*- #Author:wanghui ...

  4. Play!framework 项目部署到Tomcat

    Play Framework有自带的服务器,也可部署到其他服务器上.这里讲解下如何将Play的项目部署到Tomcat. 1.准备war包 首先进入play目录: 比如我的: cd C:\play-1. ...

  5. wxPython 对话框关闭后进程无法退出的原因

    wxPython中不要用对话框作为主程序wx.Dialog,这会导致程序关闭后进程无法退出.一种可行的做法是用wx.Frame代替

  6. Java 加密 MD5

    版权声明:本文为博主原创文章,未经博主允许不得转载. [md5] md5是一种哈希算法,哈希算法是啥? ... 特点是不能解密. [代码] package com.uikoo9.util.encryp ...

  7. careercup-递归和动态规划 9.3

    9.3 在数组A[0...n-1]中,有所谓的魔术索引,满足条件A[i]=i.给定一个有序整数数组,元素值给不相同,编写一个方法,在数组A中找出一个魔术索引,若存在的话. 进阶: 如果数组元素有重复值 ...

  8. 标准I/O库之临时文件

    ISO C标准I/O库提供了两个函数以帮助创建临时文件. #include <stdio.h> char *tmpnam( char *ptr ); 返回值:指向唯一路径名的指针 FILE ...

  9. setvbuf

    函数名: setvbuf 用 法: int setvbuf(FILE *stream, char *buf, int type, unsigned size); type : 期望缓冲区的类型: _I ...

  10. HDU1010(bfs)

    #include <stdio.h>#include <iostream>#include <string.h>#include <stdlib.h>u ...