Estoy usando Opencv para un procesamiento de video en tiempo real.La GUI de QT se congela al capturar video desde la cámara web usando OpenCV
Como front-end estoy usando QT framework.
En mi GUI, tengo una ventana de imagen de entrada (asignada a una etiqueta) y una ventana de imagen de salida (asignada a otra etiqueta) y 3 botones. Una para iniciar la captura de video de entrada, la segunda para procesar el video (código no escrito aún) y la tercera para Salir.
Actualmente puedo transmitir mi video y mostrarlo en el Front-end. Pero esto bloquea mi GUI y no puedo salir.
Intenté usar QTimers (usando sugerencias de este y del foro de QT), pero mi GUI aún permanece bloqueada.
Agradecería que alguien me señale la dirección correcta.
A continuación se muestra el código:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp> // for cvtColor
#include <iostream>
#include <QTimer>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_buttonCaptureVideo_clicked();
void on_buttonExit_clicked();
public slots:
virtual void doNextFrame() {repaint();}
private:
Ui::MainWindow *ui;
CvCapture *capture; // OpenCV Video Capture Variable
IplImage *frame; // Variable to capture a frame of the input video
cv::Mat source_image; // Variable pointing to the same input frame
cv::Mat dest_image; // Variable to output a frame of the processed video
QTimer *imageTimer;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
cvReleaseImage(&frame);
cvReleaseCapture(&capture);
}
void MainWindow::on_buttonCaptureVideo_clicked()
{
// Set to 25 frames per second
const int imagePeriod = 1000/25; // ms
imageTimer = new QTimer(this);
imageTimer->setInterval(imagePeriod);
connect(imageTimer, SIGNAL(timeout()), this, SLOT(doNextFrame()));
// Use the default camera
capture = cvCreateCameraCapture(-1);
while(capture)
{
// Capture a frame
frame = cvQueryFrame(capture);
// Point to the same frame
source_image = frame;
// Resize Image
cv::resize(source_image, source_image, cv::Size(128,128) , 0, 0);
// Change to RGB format
cv::cvtColor(source_image,source_image,CV_BGR2RGB);
// Convert to QImage
QImage qimg = QImage((const unsigned char*) source_image.data, source_image.cols, source_image.rows, QImage::Format_RGB888); // convert to QImage
// Display on Input Label
ui->labelInputVideo->setPixmap(QPixmap::fromImage(qimg));
// Resize the label to fit the image
ui->labelInputVideo->resize(ui->labelInputVideo->pixmap()->size());
}
}
void MainWindow::on_buttonExit_clicked()
{
connect(ui->buttonExit, SIGNAL(clicked()), qApp, SLOT(closeAllWindows()));
}
¿Cuánto dura la evaluación de 'capture' en true? ¿Cuánto tiempo dura ese bucle while? – jdi
@jdi: Mientras el usuario desee transmitir el video de entrada, la captura debería ser verdadera. He recibido la GUI para que responda ahora usando QTimer, pero me doy cuenta de que si dejo activa la transmisión durante demasiado tiempo, recibo los mensajes "Camera dropped frame!", Así que supongo que con el tiempo tendré que moverme a QThreads. Gracias por su respuesta. – Sid
@Sid, ¿podría publicar el código funcionando, por favor? Gracias –