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