比较opencv2、opencv3关于读取视频文件、摄像头的编程风格

本文介绍了在Ubuntu 16.04环境下,使用opencv2和opencv3在读取视频文件和摄像头时的编程风格差异。主要区别在于opencv2使用IplImage指针,而opencv3采用Mat矩阵。opencv2通过cvCreateCameraCapture和cvCreateFileCapture分别处理摄像头和文件,而opencv3统一用open函数。此外,opencv2的cvQueryFrame获取帧,cvNamedWindow和cvShowImage显示图像,cvWaitKey控制帧率,最后用cvReleaseCapture释放资源。opencv3则使用VideoCapture变量,waitKey控制帧率,释放资源时可选release()。

(开发环境:ubuntu 16.04+opencv3.1.0+qt5)

入门opencv首先了解下读取视频文件、摄像头的编程风格

opencv2、opencv3对此最基本到区别莫过于操作图像矩阵的不同:

opencv2采用到是IplImage指针;opencv3采用的是Mat矩阵。

先上代码:

opencv2风格:

#include <QCoreApplication>
#include <cv.hpp>
#include <highgui.h>
#include <video.hpp>

using namespace cv;

int main(int argc, char *argv[])
{
    cvNamedWindow("mp4");
    
    /*CvCapture结构体,保存图像信息,cvCreateCameraCapture(-1)读入摄像头视频,
     *                           cvCreateFileCapture("路径")读入视频文件*/
    CvCapture * capture=cvCreateCameraCapture(-1);
    
    IplImage* frame;
    
    while(1)
    {
        /*cvQueryFrame(),读入CvCapture结构体指针,将下一帧加载到内存*/
        frame=cvQueryFrame(capture);
        if(!frame)
            break;

        /*cvShowImage()在窗口中显示*/
        cvShowImage("mp4",frame);
        /*cvWaitKey()触发按键、控制帧率*/
        char c =cvWaitKey(33);
        if(c==27)
            break;
    }
    /*cvReleaseCapture()释放结构体指针*/
    cvReleaseCapture(&capture);
}
opencv3风格:

#include <QCoreApplication>
#include <cv.hpp>
#include <highgui.h>
#include <video.hpp>

using namespace cv;

int main(int argc, char *argv[])
{
    /*VideoCapture结构体,保存图像信息,open()参数为int index(0为默认摄像头),读入摄像头视频,
     *                           open()参数为路径,读入视频文件*/
    VideoCapture capture;
    capture.open(0);
    Mat frame;

    double rate = capture.get(CV_CAP_PROP_FPS); //获取视频文件的帧率
    int delay = cvRound(1000.000 / rate);       //延时参数

    while(1)
    {
        /*采用>>的方式读入视频*/
        capture >> frame;
        if(frame.empty())
            break;

        /*imshow()在窗口中显示*/
        imshow("读取摄像头",frame);
        /*WaitKey()控制帧率*/
        waitKey(delay);
    }
}

区别:

1、保存图像信息的结构体:

opencv2:CvCapture,操作清一色指针。

opencv3:VideoCapture,操作清一色变量。

2、打开到函数:

opencv2:cvCreateCameraCapture(-1)读入摄像头视频,

                       cvCreateFileCapture("路径")读入视频文件。

opencv3:open一个函数搞定,文件和摄像头是不同的重载函数。

3、IplImage指针、Mat变量

4、读取视频流的形式:

opencv2:cvQueryFrame(capture)

opencv3:<<,经过重载到operate函数。

5、图像显示:

opencv2:在main一开头声明窗口:cvNamedWindow,后面用cvShowImage函数显示

opencv3:imshow全部搞定,美滋滋。当然,cvNamedWindow也有它到代替品:namedWindow();

6、控制帧率

opencv2:cvWaitKey

opencv3:waitKey

7、释放保存图像信息到结构体

opencv2:cvReleaseCapture()函数

opencv3:作为一个变量,显然是由系统释放到,完全不需要管。不过严谨起见,也可以加上一行capture.release();



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值