Esion

zedboard下opencv+qt读取显示avi视频

0
阅读(4548)

1、前言

我的qt源码是4.8.1版本,opencv是2.4.9版本。qt中使用opencv,在ubuntu下使用qmake生成Makefile之前需要先对qmake.conf文件修改配置。进入qt的安装目录install下找到qmake.conf配置文件:

然后

gedit qmake.conf
在该配置文件中添加交叉编译好的opencv的头文件和库路径,如下:

INCLUDEPATH += /home/esion/zed/an-opencv/opencv-2.4.9/install/include \
               /home/esion/zed/an-opencv/opencv-2.4.9/install/include/opencv \
                /home/esion/zed/an-opencv/opencv-2.4.9/install/include/opencv2
LIBS += /home/esion/zed/an-opencv/opencv-2.4.9/install/lib/*.so
该文件的截图如下:



2、实现

使用opencv读取avi视频,然后转换成QImage转换成qt显示。整个工程在附件中。mainwindow.cpp文件如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "iostream"
#include <opencv2/core/core.hpp>

using namespace cv;
using namespace std;
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    video=cv::VideoCapture("test.AVI");
}

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

void MainWindow::on_pushButton_clicked()
{
    timer = new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(getframe()));timer->start(25);//按照每秒24帧计算,每过42ms执行一次getframe
}
int k=0;
void MainWindow::getframe()
{
    k++;cout<<k<<"get frame"<<endl;
    video>>src_frame; //从视频取帧
    if(!src_frame.data)timer->stop();//如果取不到数据,终止计时器
    qimg = QImage((const uchar*)src_frame.data,src_frame.cols,src_frame.rows, QImage::Format_RGB888); //简单地转换一下为Image对象,rgbSwapped是为了显示效果色彩好一些。
    //ui->label->clear();
    ui->label->setPixmap(QPixmap::fromImage(qimg));
}
其中on_pushButton_clicked()函数中的timer->start(25)可以设置定时器定时读取时间,即可以设置帧率的大小。

3、交叉编译

交叉编译工程只需要在终端下进入工程目录然后:

qmake -project
qmake
make
因为我给的工程中已经是编译好的,实现可以输入

make clean
删除编译好的文件,然会再输入上述三条命令。

附件:(test.AVI文件比较大,没上传,如果需要的话可以私信我)

sh_avi.rar