Argon 2 Жалоба Опубликовано March 15, 2013 Доброго времени суток! Если использовать видео полученное из веб камеры, то все отлично. А вто как быть если видео находится в файле *.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)); } } Компилируется, но, в работе, после выбора файла ничего не отображается на экране.... что не так делаю? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 15, 2013 Может надо дать сигнал на перерисовку компонента? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Argon 2 Жалоба Опубликовано March 15, 2013 а разве setPixmap не являеется автоматическим обновление элемента? Ведь в процессе вывода потока с вебкамеры, дополнительно ничего обновлять не нужно.... Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 15, 2013 Нашел свой древний код: #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] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Argon 2 Жалоба Опубликовано March 15, 2013 Спасибо Но я пересмотрел структуру 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)); } это только для показа первого кадра. теперь для воспроизведения только осталось таймер написать Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SmileGobo 2 Жалоба Опубликовано March 20, 2013 Мне кажется, что смешение стилей С в программе на С++ не лучшая идея. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 20, 2013 Так и есть, только этому нельзя научить, тем более не нужно это навязывать, к этому каждый приходит сам, естественным путем 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах