Поиск
Показаны результаты для тегов 'gtk'.
-
GTK-2 и OpenCV-2, захват видео с камеры
pnp_mechanic опубликовал тема в Программирование
Возникла необходимость регистрировать событие с вебкамеры. Общая идея -отображать в части окна видео с камеры и на этом же окне кнопки для управления и настройки. Для этой затеи приспособил 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; }