Совместное использование opencv и gtk + 2

поэтому в настоящее время я пытаюсь добиться следующего: создать графический интерфейс для пользователя, в котором пользователь может видеть прямую трансляцию веб-камеры, а также две кнопки слева от прямой трансляции для запуска и остановки записи. все это должно работать на малиновом пи.

Я использую камеру Basler, поэтому я не могу использовать объект видеозахвата, но с помощью пилона SDK (SDK для камер Basler) мне удалось получить изображение и преобразовать его в opencv :: mat.

Однако я застрял на двух моментах:

Во-первых, я вообще не знаю, как отобразить opencv :: mat в виджете GTK.

Вторая проблема заключается в том, что я не знаю, как получить прямой эфир. Я пытался использовать функцию g_timeout_add, но затем пользовательский интерфейс перестает отвечать на запросы. он вызывает функцию в фоновом режиме, но так как я вызываю ее каждые 100 мс, кажется, что она застряла в функции навсегда, и поэтому я не могу нажимать какие-либо кнопки.

Я включил некоторые из моего кода ниже.

#include <gtk/gtk.h>

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/video/video.hpp>

#include <pylon/PylonIncludes.h>

using namespace Pylon;
using namespace cv;
using namespace std;

void callback(GtkWidget *widget, gpointer labelstatus) {}

gint delete_event(GtkWidget *widget, GdkEvent  *event) {
gtk_main_quit ();
}

static gboolean livefeed_func(gpointer data) {

Pylon::PylonAutoInitTerm autoInitTerm;
CInstantCamera camera(CTlFactory::GetInstance().CreateFirstDevice());
camera.Open();
GenApi::INodeMap& nodemap = camera.GetNodeMap();
.
. Some other pylon related stuff
.
CImageFormatConverter formatConverter;
formatConverter.OutputPixelFormat= PixelType_BGR8packed;
CPylonImage pylonImage;

Mat openCvImage;
cv::Size frameSize = Size((int)width->GetValue(), (int)height->GetValue());
.
. Some other pylon related stuff
.
formatConverter.Convert(pylonImage, ptrGrabResult);
openCvImage = cv::Mat(ptrGrabResult->GetHeight(), ptrGrabResult->GetWidth(), CV_8UC3, (uint8_t *) pylonImage.GetBuffer());
imwrite("tmp_name.jpg", openCvImage);
}

int main(int argc, char *argv[]) {

//GTK

GtkWidget *window;
GtkWidget *table;
GtkWidget *labelstatus;
GtkWidget *labellog;
GtkWidget *buttonexit;
GtkWidget *buttonstart;
GtkWidget *buttonstop;
GtkWidget *livefeed;

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Table");
gtk_container_set_border_width (GTK_CONTAINER (window), 20);

gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (delete_event), NULL);

table = gtk_table_new (6, 6, TRUE);
gtk_container_add (GTK_CONTAINER (window), table);

labelstatus = gtk_label_new ("Status: Idle");
gtk_table_attach_defaults (GTK_TABLE(table), labelstatus, 0, 2, 0, 1);
gtk_widget_show (labelstatus);

buttonstart = gtk_button_new_with_label ("Start");
gtk_signal_connect (GTK_OBJECT (buttonstart), "clicked", GTK_SIGNAL_FUNC (callback), (gpointer) labelstatus);
gtk_table_attach_defaults (GTK_TABLE(table), buttonstart, 0, 1, 1, 2);
gtk_widget_show (buttonstart);

buttonstop = gtk_button_new_with_label ("Stop");
gtk_signal_connect (GTK_OBJECT (buttonstop), "clicked", GTK_SIGNAL_FUNC (callback), NULL);
gtk_table_attach_defaults (GTK_TABLE(table), buttonstop, 1, 2, 1, 2);
gtk_widget_show (buttonstop);

labellog = gtk_label_new ("11:31:54: Started Recording\n11:36:54: Stopped Recording");
gtk_table_attach_defaults (GTK_TABLE(table), labellog, 0, 2, 2, 3);
gtk_widget_show (labellog);

buttonexit = gtk_button_new_with_label ("Quit");
gtk_signal_connect (GTK_OBJECT (buttonexit), "clicked",GTK_SIGNAL_FUNC (delete_event), NULL);
gtk_table_attach_defaults (GTK_TABLE(table), buttonexit, 0, 2, 3, 4);
gtk_widget_show (buttonexit);

livefeed = gtk_drawing_area_new();
gtk_table_attach_defaults (GTK_TABLE(table), livefeed, 2, 5, 0, 4);
gtk_widget_show (livefeed);

gtk_widget_show (table);
gtk_widget_show (window);

g_timeout_add(100, livefeed_func, livefeed);

gtk_main ();

}

поэтому, если я запускаю этот код, он отобразит окно gtk, а затем будет не отвечать и писать изображения, пока я не отменю процесс.

Итак, подведем итог:

  1. Есть ли способ выполнить фоновые задачи в GTK без UI перестает отвечать на запросы

  2. Как я могу отобразить OpenCV :: Mat в окне / виджете GTK?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]