在 qlabel 上显示 openCv 视频的奇怪问题
Posted
技术标签:
【中文标题】在 qlabel 上显示 openCv 视频的奇怪问题【英文标题】:weird trouble displaying openCv video on qlabel 【发布时间】:2013-11-08 01:21:18 【问题描述】:我在 Qlabel 上显示 opencv 视频时遇到问题。
我是使用 opencv 和 qt 的新手,这周我试图使用 qt 按钮事件进行一个小练习,以显示从 opencv 到我的小部件的 qlabel 的视频捕获。但奇怪的是,当我运行下面附加的代码时,程序说“程序意外完成”。请帮助我,因为对我来说似乎没有任何问题。感谢您的时间和哥斯达黎加的问候。
附:当我只是尝试在没有任何 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();
【问题讨论】:
你应该在调试器中运行你的程序。而且您的 IplImage2QImage 方法对所有图像都 not 正常工作(请参阅“步长”)。而且,你应该使用 OpenCV 的 C++ API。 就像 ypnos 说的:你的 IplImage2QImage 方法不正确。这种方法必须适用于从具有一个通道的简单 uint8 灰度到完整 RGBA 图像的各种图像。 Web 和 SO 上有几个示例。 【参考方案1】:真是大错特错。当你使用 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);
【讨论】:
我做了一个 QTimer 来控制循环,但仍然失败,“程序意外完成。” 使用调试器运行它,当它失败时,您应该能够看到日志和调用堆栈(将此信息添加到问题中)。以上是关于在 qlabel 上显示 openCv 视频的奇怪问题的主要内容,如果未能解决你的问题,请参考以下文章
QLabelCV——专门给OpenCV做的PyQt QLabel控件