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