Перейти к содержанию
    

GTK-2 и OpenCV-2, захват видео с камеры

Возникла необходимость регистрировать событие с вебкамеры.

Общая идея -отображать в части окна видео с камеры и на этом же окне кнопки для управления и настройки.

Для этой затеи приспособил 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;      
}

 

Изменено пользователем pnp_mechanic

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27.10.2020 в 15:00, pnp_mechanic сказал:

g_signal_connect (G_OBJECT(btn1), "clicked", G_CALLBACK (clic_butt_1),NULL);

Что ожидается от кода в данном случае?

Видео-поток активен и пытаетесь его вызвать повторно?

Вначале необходимо вызвать деструктор активного потока, а уж затем вызывать повторное создание..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ваше внимание .

Сейчас уже разобрался, забыл совсем настроить камеру.

    cvSetCaptureProperty(cam_capture, CV_CAP_PROP_FRAME_WIDTH, 640);  
    cvSetCaptureProperty(cam_capture, CV_CAP_PROP_FRAME_HEIGHT, 480);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задаете фиксированные параметры разрешения камеры для фрейма.

Как это влияет на событие кнопки?

Изменено пользователем Droid 77

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...