当前位置: 代码迷 >> 综合 >> 比较opencv2、opencv3关于读取视频文件、摄像头的编程风格
  详细解决方案

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

热度:54   发布时间:2023-10-21 02:09:06.0

(开发环境: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();