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 で実行されています

付属コード

#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

それはとても間違っています。cvWaitKeyQt を使用する場合は、独自のループを使用してはいけません。この関数は、テスト用または UI フレームワークがない場合に openCv に追加するだけです。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 に答える