pnp_mechanic 2 27 октября, 2020 Опубликовано 27 октября, 2020 (изменено) · Жалоба Возникла необходимость регистрировать событие с вебкамеры. Общая идея -отображать в части окна видео с камеры и на этом же окне кнопки для управления и настройки. Для этой затеи приспособил Orange PI с Armbian 5.9, захват видео с камеры успешно работает до момента нажатия кнопки "butt_1". Причём далее программа на кнопку реагирует, а видео останавливается. Подозреваю, что нет необходимого условия для отрисовки части окна. Это не смотря на то, что каждый раз выполняется "gtk_widget_queue_draw(area);" Может что не так в программе...? /* makefile CXX ?= g++ CXXFLAGS += -c -Wall $(shell pkg-config --cflags opencv --libs gtk+-2.0) LDFLAGS += $(shell pkg-config --libs --static opencv --libs gtk+-2.0) all: prog_ex prog_ex: main.o; $(CXX) $< -o $@ $(LDFLAGS) %.o: %.cpp; $(CXX) $< -o $@ $(CXXFLAGS) clean: ; rm -f main.o prog_ex */ #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/highgui.hpp" #include "opencv2/videoio.hpp" #include "highgui.h" #include <linux/videodev2.h> #include <sys/ioctl.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> #include <gtk/gtk.h> #include <gdk/gdk.h> #include <cairo.h> #include <stdio.h> #include <stdbool.h> #include <iostream> using namespace cv; using namespace std; GtkWidget *window; GdkPixbuf* pix; GtkWidget *area; CvCapture* cam_capture; IplImage* frame; VideoCapture capture; //кнопоки и ... GtkWidget *vbox_1; //контейнер GtkWidget *hbox_1; GtkWidget *video_box; GtkWidget *btn1,*btn2; //кнопки static void destroy(GtkWidget *widget, gpointer data) { gtk_main_quit(); } //событие по кнопке static void clic_butt_1(GtkWidget *widget, gpointer data) { g_print("\n\r key pres"); } //событие по кнопке exit static void clic_butt_2(GtkWidget *widget, gpointer data) { gtk_main_quit(); } //Работает до тех пор пока не нажата "btn1" !!! static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data) { g_print("N_1"); frame = cvQueryFrame(cam_capture); if(!frame) { g_print("Err_1"); return TRUE;} pix = gdk_pixbuf_new_from_data((guchar*) frame->imageData, GDK_COLORSPACE_RGB,FALSE, frame->depth, frame->width-350, frame->height -150, (frame->widthStep), NULL, NULL); gdk_draw_pixbuf(widget->window,widget->style->fg_gc[GTK_WIDGET_STATE (widget)], pix, 0, 0, 0, 0, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); // -> X gtk_widget_queue_draw(area); return FALSE ; } //================================================= int main(int argc, char *argv[]) { g_print("\n\rTest prog capture video of webcam"); cam_capture = cvCreateCameraCapture(0); gtk_init(&argc, &argv); //Окно window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Test Open_CV"); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); GdkGeometry windowProperties; windowProperties.min_width = 800; windowProperties.min_height = 600; gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &windowProperties, GDK_HINT_MIN_SIZE); gtk_window_set_resizable(GTK_WINDOW(window), FALSE); g_signal_connect(window, "destroy", G_CALLBACK(destroy), NULL); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL); //виджет area = gtk_drawing_area_new(); gtk_drawing_area_size(GTK_DRAWING_AREA(area), 300, 300); //BOX контейнер vbox_1 = gtk_vbox_new(GTK_ORIENTATION_HORIZONTAL,5); hbox_1 = gtk_vbox_new(GTK_ORIENTATION_HORIZONTAL,5); video_box = gtk_vbox_new(GTK_ORIENTATION_HORIZONTAL,5); //создать кнопки btn1 = gtk_button_new_with_label (" Test_key "); btn2 = gtk_button_new_with_label (" Close "); gtk_button_set_relief(GTK_BUTTON(btn1), GTK_RELIEF_NORMAL); //Кнопки в контейнер gtk_box_pack_end (GTK_BOX (hbox_1),btn1, FALSE, FALSE, 0); gtk_box_pack_end (GTK_BOX (hbox_1),btn2, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX (video_box),area, FALSE, TRUE, 0); //Контейнер кнопок -> в контейнер номер 1 gtk_box_pack_end (GTK_BOX (vbox_1),hbox_1, FALSE, TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox_1),video_box, FALSE, TRUE, 0); //Контейнер с контейнером на окно gtk_container_add (GTK_CONTAINER (window), vbox_1); //на окно //СОбытия кнопок "pressed","released","clicked" g_signal_connect (G_OBJECT(btn1), "clicked", G_CALLBACK (clic_butt_1),NULL); g_signal_connect (G_OBJECT(btn2), "clicked", G_CALLBACK (clic_butt_2),NULL); //событие - "видео с камеры" - работает пока кнопка не нажата!!?? почему так g_signal_connect(G_OBJECT(area), "expose_event", G_CALLBACK(expose_event), NULL); gtk_widget_show_all(window); gtk_main(); return 0; } Изменено 27 октября, 2020 пользователем pnp_mechanic Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Droid 77 0 29 ноября, 2020 Опубликовано 29 ноября, 2020 · Жалоба 27.10.2020 в 15:00, pnp_mechanic сказал: g_signal_connect (G_OBJECT(btn1), "clicked", G_CALLBACK (clic_butt_1),NULL); Что ожидается от кода в данном случае? Видео-поток активен и пытаетесь его вызвать повторно? Вначале необходимо вызвать деструктор активного потока, а уж затем вызывать повторное создание.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pnp_mechanic 2 29 ноября, 2020 Опубликовано 29 ноября, 2020 · Жалоба Спасибо за ваше внимание . Сейчас уже разобрался, забыл совсем настроить камеру. cvSetCaptureProperty(cam_capture, CV_CAP_PROP_FRAME_WIDTH, 640); cvSetCaptureProperty(cam_capture, CV_CAP_PROP_FRAME_HEIGHT, 480); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Droid 77 0 30 ноября, 2020 Опубликовано 30 ноября, 2020 (изменено) · Жалоба Задаете фиксированные параметры разрешения камеры для фрейма. Как это влияет на событие кнопки? Изменено 30 ноября, 2020 пользователем Droid 77 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться