gpt4 book ai didi

c++ - 如何在 OpenCV 中使用 cv::createButton 原型(prototype)

转载 作者:太空狗 更新时间:2023-10-29 21:28:53 25 4
gpt4 key购买 nike

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

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

它说原型(prototype)是:

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”的意思。

有人可以帮帮我吗?

谢谢。

最佳答案

我们仍然不知道不工作对您意味着什么,但我会提供一些有关如何使用回调以及的信息用户数据是。

如签名所示,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;
}

关于c++ - 如何在 OpenCV 中使用 cv::createButton 原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6084511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com