在qlabel上显示openCv视频的奇怪麻烦
我在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();
}
这是错误的。 当你使用Qt时,你不应该使用cvWaitKey
并拥有自己的循环。 这个函数只是在openCv中进行测试或者没有ui freamework的时候。 当你使用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);
}
链接地址: http://www.djcxy.com/p/83779.html