0

我无法在 Qlabel 上显示 opencv 视频。

我是使用 opencv 和 qt 的新手,这周我试图使用 qt 按钮事件进行一个小练习,以显示从 opencv 到我的小部件的 qlabel 的视频捕获。但奇怪的是,当我运行下面附加的代码时,程序说“程序意外完成”。请帮助我,因为对我来说似乎没有任何问题。感谢您的时间和哥斯达黎加的问候。

PS 当我只是尝试在没有任何 gui 的情况下运行 openCv 代码时,我的意思是只使用 buttonClicked 事件和 cvShowImage("Video", frame); 中的代码。要显示视频,程序运行良好,但会删除一个错误和几个这样的警告。

HIGHGUI 错误:V4L/V4L2:VIDIOC_S_CROP
libpng 警告:使用 libpng-1.2.49 构建的应用程序但使用 1.5.12 运行
libpng 警告:使用 libpng-1.2.49 构建的应用程序但使用 1.5.12 运行
libpng 警告:使用 libpng- 构建的应用程序1.2.49 但运行时出现 1.5.12
libpng 警告:使用 libpng-1.2.49 构建的应用程序但运行时出现 1.5.12
libpng 警告:使用 libpng-1.2.49 构建的应用程序但运行时出现 1.5.12
libpng 警告:使用 libpng 构建的应用程序-1.2.49 但运行时出现 1.5.12
libpng 警告:应用程序使用 libpng-1.2.49 构建但运行时出现 1.5.12
libpng 警告:应用程序使用 libpng-1.2.49 构建但运行时使用 1.5.12
libpng 警告:使用 libpng-1.2.49 构建的应用程序但使用 1.5.12 运行
libpng 警告:使用 libpng-1.2.49 构建的应用程序但使用 1.5.12 运行

附代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <cv.h>
#include <highgui.h>
using namespace std;
using namespace cv;

IplImage* imgTracking=0;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{

    ui->setupUi(this);    
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    CvCapture *cap; cap = cvCaptureFromCAM(1);
    IplImage *frame; frame = cvQueryFrame(cap);
    bool play = true;
    while(frame && play){
        cvWaitKey(10); IplImage *img = cvCloneImage(frame);
        if (img->origin) {
            cvFlip(img);
            img->origin= 0;
        }
        QImage qimg;
        qimg = IplImage2QImage(img);
        //cvShowImage("Video", frame);
        ui->labVideo->setPixmap(QPixmap::fromImage(qimg));
        cvReleaseImage(&img);
        frame = cvQueryFrame(cap);
    }
    cvReleaseCapture(&cap);
}

QImage MainWindow::IplImage2QImage(const IplImage *iplImage)
{
    int height = iplImage->height;
    int width = iplImage->width;

    const uchar *qImageBuffer =(const uchar*)iplImage->imageData;
    QImage img(qImageBuffer, width, height, QImage::Format_RGB888);

    return img.rgbSwapped();
}

4

1 回答 1

0

大错特错。当您使用 Qt 时,您不应该使用cvWaitKey并拥有自己的循环。此功能只是在 openCv 中添加用于测试或当您没有 ui 框架时。当你使用 Qt 时,你有 UI 框架,openCV 应该只用于图像处理(这是这个库的目的)!

用 QTimer 替换这个循环,让 QEventLoop 完成它的工作。 CvCapture *cap必须是类的领域。

void MainWindow::on_timerTimeout()
{
    IplImage *frame = cvQueryFrame(cap);
    if (!frame) {
       stopPlay();
       return;
    }
    IplImage *img = cvCloneImage(frame);
    if (img->origin) {
        cvFlip(img);
        img->origin= 0;
    }
    QImage qimg = IplImage2QImage(img);
    ui->labVideo->setPixmap(QPixmap::fromImage(qimg)); // possible replace with signal emit newFrame(QPixmap::fromImage(qimg));
    cvReleaseImage(&img);
}

void MainWindow::stopPlay() {
    timer->stop();
    cvReleaseCapture(&cap);
}

void MainWindow::on_pushButton_clicked() {
    timer->start();
    cap = cvCaptureFromCAM(1);
}
于 2013-11-08T09:59:04.157 回答