Перейти к содержимому
Compvision.ru
Argon

Qt + opencv вывод видео

Recommended Posts

Доброго времени суток!

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

А вто как быть если видео находится в файле *.avi?

пробую так, это для отображения первого кадра на экране, запуск будет происходить из иного места:

void MouseDetected::on_btnLoadFromFile_clicked()

{

    QString qVideofileName = QFileDialog::getOpenFileName(this,

             tr("Выберите видео файл"), "",

             tr("Video file (*.avi);;All Files (*)"));

    if(qVideofileName.isEmpty() == false)

    {

        ui->txtFileOpen->setText(qVideofileName);

        CvCapture* capture = cvCreateFileCapture(qVideofileName.toStdString().c_str());

        frame = cvQueryFrame(capture);

        QImage gimgOriginal((uchar*)frame->dataOrder ,frame->width, frame->height, frame->widthStep, QImage::Format_RGB888);

        ui->IplOutputImage->setPixmap(QPixmap::fromImage(gimgOriginal));

    }

}

Компилируется, но, в работе, после выбора файла ничего не отображается на экране.... что не так делаю?

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


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

Может надо дать сигнал на перерисовку компонента?

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


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

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

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


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

Нашел свой древний код:

#include "simpleqtapp.h"
#include "opencv2/core/core.hpp"
#include "opencv2/core/gpumat.hpp"
#include "opencv2/core/opengl_interop.hpp"
#include "opencv2/gpu/gpu.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace std;
using namespace cv;
#include <QLabel>
#include <QFileDialog>
QImage Mat2QImage(const cv::Mat3b &src)
{
QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
for (int y = 0; y < src.rows; ++y)
{
const cv::Vec3b *srcrow = src[y];
QRgb *destrow = (QRgb*)dest.scanLine(y);
for (int x = 0; x < src.cols; ++x)
{
destrow[x] = qRgba(srcrow[x][2], srcrow[x][1], srcrow[x][0], 255);
}
}
return dest;
}

QImage Mat2QImage(const cv::Mat_<double> &src)
{
double scale = 255.0;
QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
for (int y = 0; y < src.rows; ++y)
{
const double *srcrow = src[y];
QRgb *destrow = (QRgb*)dest.scanLine(y);
for (int x = 0; x < src.cols; ++x)
{
unsigned int color = srcrow[x] * scale;
destrow[x] = qRgba(color, color, color, 255);
}
}
return dest;
}

SimpleQTApp::SimpleQTApp(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
setupUi(this);
QObject::connect(quitButton, SIGNAL(clicked()), this, SLOT(OnBtnClk()));
}

SimpleQTApp::~SimpleQTApp()
{

}
void SimpleQTApp::OnBtnClk(void)
{
QString fileName = QFileDialog::getOpenFileName(this, QString::fromWCharArray(L"Открыть файл"));

if (fileName != "")
{
Mat img=imread(fileName.toStdString(),1);
QImage i=Mat2QImage((Mat3b)img);
QPixmap pm = QPixmap::fromImage(i);
MyLabel->setScaledContents(true);
MyLabel->setPixmap(pm);
}
}
[/code]

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


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

Спасибо

Но я пересмотрел структуру QImage и IplImage и пришел к такому результату:

намного проще:

QString qVideofileName = QFileDialog::getOpenFileName(this,

             tr("Выберите видео файл"), "",

             tr("Video file (*.avi);;All Files (*)"));

    if(qVideofileName.isEmpty() == false)

    {

        ui->txtFileOpen->setText(qVideofileName);

        CvCapture* capture = cvCreateFileCapture(qVideofileName.toStdString().c_str());      

        frame = cvQueryFrame(capture);

        QImage gimgOriginal((uchar*)frame->imageData,frame->width, frame->height, QImage::Format_RGB888);

        ui->IplOutputImage->setPixmap(QPixmap::fromImage(gimgOriginal));

    }

это только для показа первого кадра.

теперь для воспроизведения только осталось таймер написать :)

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


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

Мне кажется, что смешение стилей С в программе на С++ не лучшая идея.

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


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

Так и есть, только этому нельзя научить, тем более не нужно это навязывать, к этому каждый приходит сам, естественным путем :)

  • Like 1

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


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

Создайте учётную запись или войдите для комментирования

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

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×