如何在OpenCV中使用cv::createButton原型



我想了解如何使用OpenCV文档中定义的cv::createButton:

http://opencv.jp/opencv-2svn_org/cpp/highgui_qt_new_functions.html#cv-createbutton

它说原型是:

createButton(const string& button_name CV_DEFAULT(NULL), ButtonCallback on_change CV_DEFAULT(NULL), void* userdata CV_DEFAULT(NULL), int button_type CV_DEFAULT(CV_PUSH_BUTTON), int initial_button_state CV_DEFAULT(0)

但我不知道如何定义函数 ButtonCallback 以捕获按钮事件。

我愿意:

cvCreateButton("button6", callbackButton2, pointer, CV_PUSH_BUTTON, 0);

声明按钮和

void callbackButton2(int state, void *pointer){
    printf("ok");
}

但它不起作用。

我不知道第三个参数"void* userdata"的含义。

请问有人可以帮我吗?

谢谢。

我们仍然不知道什么不起作用对你意味着什么,但我会提供一些关于如何使用回调什么是userdata的信息。

正如签名所暗示的那样,void* userdata 是一个可用于向回调发送/接收数据的参数。这纯粹是可选的,所以如果你对它没有任何用处,只需通过NULL .

在下面的示例中,我将使用 userdata 从回调中检索数据。您可能已经注意到,回调从 OpenCV 接收state信息。我有兴趣存储此值并将其提供给main().

为此,我定义了一个自定义数据类型,并在 main() 上声明了这种类型的变量。自定义类型有一个int成员来存储我们的回调收到的state,还有一个互斥锁,我们将使用它来保护自定义类型不被 2 个线程(回调和main())同时读取/写入。

#include <iostream>
#include <cv.h>
#include <highgui.h>
#include <pthread.h>
#include <string.h>
using namespace cv;
typedef struct custom_data
{
    int state;
    pthread_mutex_t mtx;
} custom_data_t;

void my_button_cb(int state, void* userdata)
{
    std::cout << "@my_button_cb" << std::endl;   
    // convert userdata to the right type
    custom_data_t* ptr = (custom_data_t*)userdata;
    if (!ptr)
    {
        std::cout << "@my_button_cb userdata is empty" << std::endl;
        return;
    }
    // lock mutex to protect data from being modified by the
    // main() thread
    pthread_mutex_lock(&ptr->mtx);
    ptr->state = state;
    // unlock mutex
    pthread_mutex_unlock(&ptr->mtx);
}    
int main()
{
    // declare and initialize our userdata
    custom_data_t my_data = { 0 };
    createButton("dummy_button", my_button_cb, &my_data, CV_PUSH_BUTTON, 0);
    // For testing purposes, go ahead and click the button to activate
    // our callback.
    // waiting for key press <enter> on the console to continue the execution
    getchar(); 
    // At this point the button exists, and our callback was called 
    // (if you clicked the button). In a real application, the button is 
    // probably going to be pressed again, and again, so we need to protect 
    // our data from being modified while we are accessing it. 
    pthread_mutex_lock(&my_data.mtx);
    std::cout << "The state retrieved by the callback is: " << my_data.state << std::endl;
    // unlock mutex    
    pthread_mutex_unlock(&my_data.mtx);
    return 0;
}

不起作用的原因是因为cvCreateButton实现有一个错误,导致按钮点击被忽略:

https://code.ros.org/trac/opencv/ticket/786

这现在在 trunk 中已修复,因此如果您使用 trunk,单击按钮现在应该可以正常工作。它最终应该会进入官方版本。

相关内容

  • 没有找到相关文章

最新更新