在自定义类中使用setMouseCallBack

TOP

  在opencv学习中教程中的鼠标回调函数的使用,都是在主函数中调用,但在自定义类中调用该函数时,会出现参数的类型与形参不匹配问题。最后在stackoverflow中找到了一些解决办法。

鼠标调用的函数为:

1 /** @brief Sets mouse handler for the specified window
2
3 @param winname Name of the window.
4 @param onMouse Callback function for mouse events. See OpenCV samples on how to specify and use the callback.
5 @param userdata The optional parameter passed to the callback.
6  */
7
8 CV_EXPORTS void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0);

ˇ参数1:winname即为在哪一个窗口调用该函数

ˇ参数2:onMouse是一个函数指针

ˇ参数3:用户传递的数据

其中第二个参数即为我们对鼠标实际操作的地方,在主函数调用的话正常定义调用就可以了,但是当在自定义类中定以回调函数时,便会报参数类型与形参类型不匹配,来看一下回调函数的原型:

1 /** @brief Callback function for mouse events. see cv::setMouseCallback
2 @param event one of the cv::MouseEventTypes constants.
3 @param x The x-coordinate of the mouse event.
4 @param y The y-coordinate of the mouse event.
5 @param flags one of the cv::MouseEventFlags constants.
6 @param userdata The optional parameter.
7  */
8
9 typedef void (*MouseCallback)(int event, int x, int y, int flags, void* userdata);

这里是一个宏定义,将一个函数指针定义宏名为MouseCallback,为了解决参数类型与形参(cv::MouseCallback)不匹配问题,在private中定义一个友元函数,当然也有使用全局变量的方法,但我更倾向于这种方法。

 1 class App
 2 {
 3 public:
 4   App();
 5   ~App();
 6   void setWin(const std::string& _winname);
 7   ...
 8 private:
 9   void on_mouse_internal(int ev, int x, int y);
10
11   std::string winname;
12
13   friend void on_mouse(int ev, int x, int y, int, void* obj);
14   ...
15 };
16 void on_mouse(int ev, int x, int y, int, void* obj)
17 {
18   App* app = static_cast<App*>(obj);
19   if (app)
20     app->on_mouse_internal(ev, x, y);
21 }
22
23 App::App()
24 {
25   ...
26 }
27
28 App::~App()
29 {
30   ...
31 }
32
33 void App::setWin(const std::string& _winname)
34 {
35   cv::namedWindow(_winname);
36   this->winname = _winname;
37   cv::setMouseCallback(winname, on_mouse, this);
38 }
39
40 void App::on_mouse_internal(int ev, int x, int y)
41 {
42   std::cout << "X:" << x << ";Y:" << y << std::endl;
43   // here you can specify class members
44 }
45 ...

当然这里友元函数要记得声明

ε=(´ο`*)))唉 学习之路永无止境

原文地址:https://www.cnblogs.com/shi-win-snoopy/p/12344509.html

时间: 2024-10-12 18:22:46

在自定义类中使用setMouseCallBack的相关文章

关于在App_Code文件夹自定义类中Session无法使用

由于前台页面需要调用App_Code中自定义类的函数,但在自定义类中找不到Session,解决方法如下: 新建一个类session,并自己定义函数GetSession(),引用命名空间 System.Web 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 6 public static class session 7 { 8 public static o

cocos2dx lua 绑定之二:手动绑定自定义类中的函数

cococs2dx 3.13.1 + vs2013 + win10 1.首先按照<cocos2dx lua 绑定之一:自动绑定自定义类>绑定Student类 2.在Student类中增加一个用于测试手动绑定的函数manual_call ①Student.h中增加函数 //手动绑定调用函数 void manual_call(); ②Student.cpp中增加函数实现 //和自动绑定相比,只增加了这个函数 void Student::manual_call() { std::cout <&

spring自定义类中@AutoWired标识的元素注入为null

最近在做项目的时候,发现程序运行的时候有一个nullpointer exception,一脸懵逼因为感觉程序没什么逻辑.后来发现是因为new出来的component不会自动注入它的元素. 现象:@Component修饰的自定义普通类中@Autowired属性为null 原因:如果是通过new实例化的对象,脱离了Spring的管理,所以获取不到Spring注解的属性值. 在新线程中也会存在注解获取不到Spring管理的Bean,也是因为new出来的线程,脱离了Spring容器 我在实际开发中遇到有

【从零之三(更)】自定义类中调用讯飞语音包错误解决办法

原文:http://blog.csdn.net/monkeyduck/article/details/24302655 在科大讯飞语音包的Mscdemo中它的方法都是写在Activity中的,这样其实并不是很好,因为Activity只是负责UI交互的,如果项目很简单自然可以,但是一旦比较复杂肯定要自己定义很多包很多类,但是写在Activity中的方法就不能被自己定义的类调用了,咋办尼,那就把方法写在自己的类里就行了.准备工作:把Msc.jar包和libmsc.so拷贝到自己工程的libs目录下,

自定义的类型放入STL的set中,需要重载自定义类中的“&lt;”符号(转)

在以前学习STL的时候,曾经学到过,如果要将自定义的类型放入到set中的话,就需要重载“<”符号,原因是set是一个有序的集合,集合会按照“<”比较的大小,默认按照从小到大的顺序排列.假设我现在设计如下类型: class MyType { public: int a, b, c; } 这是,为了让MyType类型可以顺利的放进set中,我必须重载“<”,这时问题来了,要如何重载呢?这个类型有三个数据成员,我能不能要求按照a的大小排列,如果a相等的话就随便按照b或者c的大小排列呢?如果近实

自定义类中定义两个方法,相互调用

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Test06 7 { 8 //class Class1 9 //{ 10 // public string Country() 11 // { 12 // string strCountry = "方法的示例!"; 13 // return strCountry; 14 /

(转).Net中自定义类作为Dictionary的key详解

在定义数据结构时,Dictionary提供了快速查找数据的功能,另外Dictionary< TKey, TValue >属于key-value键值对数据结构,提供了泛型的灵活性,是数据结构的一个利器,但是目前拥有的string,int,bool等基础数据类型并不能满足我们的需求,那么如何把自定义的数据类作为Dictionary的key呢? 本文对Dict的内部实现会有提出,但不详细讨论,以解决标题问题为主,如果有想详细了解Dictionary内部实现等更多细节,请转到官网: https://m

EXTJS--使用Ext.define自定义类

Javascript自定义类 var person = function(name,age){ this.Name = ""; this.Age = 26: this.Say = function(msg){ alert(this.Name + " Says : " + msg); } this.init = function(name,age){ this.Name = name; this.Age = age; } this.init(name, age); }

VC++ error C2248: &ldquo;CObject::CObject&rdquo;: 无法访问 private 成员(在&ldquo;CObject&rdquo;类中声明)

在使用诸如:CArray或是 CList等类时,经常会出现此错误 此错误的原因是由于自定义的类的数组项时 有一个操作如  Add()  在这个操作中,实际上需要一个 = 操作,但是这个 =操作在 自定义类中没有实现,于是,程序自动去它的parent 类 也就是 CObject 类去找,但是却找到个这个类的 = 是一个 private  于是就报了这个错误. 知道了原因解决方法自然就有了,那就是在自定义类中 重载操作符 =   重载后 这个错误就没有了. class COptRect : publ