Jump to content

    
Sign in to follow this  
pnp_mechanic

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

Recommended Posts

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

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

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

 

Edited by pnp_mechanic

Share this post


Link to post
Share on other sites
27.10.2020 в 15:00, pnp_mechanic сказал:

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

 

Share this post


Link to post
Share on other sites

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

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

Edited by Droid 77

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this