本系列的目的是详解demo代码,快速学习OpenCV相关操作
打开摄像机或打开文件
//打开摄像机或打开文件
//同一个对象可以从摄像机或文件加载视频
#include <opencv2/opencv.hpp>
#include <iostream>
int main( int argc, char** argv ) {
cv::namedWindow( "Example2_10", cv::WINDOW_AUTOSIZE );
cv::VideoCapture cap;
if (argc==1) {
//参数为打开的摄像机编号
//由于argc参数未1,argv没有参数输入,所以打开默认摄像头
cap.open(0);
} else {
//如果输入文件名 则和之前播放视频文件程序一样
cap.open(argv[1]);
}
//检测是否有东西可以播放
if( !cap.isOpened() ) {
//输出错误信息
std::cerr << "Couldn't open capture." << std::endl;
return -1;
}
//剩下的程序同从磁盘播放视频文件程序
cv::Mat frame;
//无限循环,与while(1)具有相同效果,在以前的编译器优化中for效率更高
for(;;) {
//逐帧读取
cap >> frame;
//帧中没有图像退出循环
if( frame.empty() ) break;
//显示读取的帧
cv::imshow( "Example3", frame );
//当前帧被显示,等待33ms
//这里设置33ms是简单假设每秒30帧,可以等待任意时间长度
//如果用户触发按键(ASCII码>=0),则退出循环,否则33ms后继续执行循环
if( cv::waitKey(33) >= 0 ) break;
}
return 0;
}
写入AVI文件
//写入AVI文件
//打开视频文件读取并转换为对数极座标(log-polar)格式写入新文件
//利用cv::VideoWriter写入文件
#include <opencv2/opencv.hpp>
#include <iostream>
int main( int argc, char* argv[] ) {
cv::namedWindow( "Example2_11", cv::WINDOW_AUTOSIZE );
cv::namedWindow( "Log_Polar", cv::WINDOW_AUTOSIZE );
// ( Note: could capture from a camera by giving a camera id as an int.)
cv::VideoCapture capture( argv[1] );
//读取视频相关信息
double fps = capture.get( cv::CAP_PROP_FPS );
cv::Size size(
(int)capture.get( cv::CAP_PROP_FRAME_WIDTH ),
(int)capture.get( cv::CAP_PROP_FRAME_HEIGHT )
);
//利用cv::VideoWriter写入AVI文件
cv::VideoWriter writer;
//第一个是新文件的文件名
//第二个是视频编解码器,用它来压缩视频流,选择MJPG编解码器,通过使用宏CV_FOURCC()来指明OpenCV的这个选择,接受四个字符作为参数
//第三个参数为帧率
//第四个参数为图像大小
writer.open( argv[2], CV_FOURCC('M','J','P','G'), fps, size );
cv::Mat logpolar_frame, bgr_frame;
for(;;) {
capture >> bgr_frame;
//gbr中帧为空退出
if( bgr_frame.empty() ) break; // end if done
cv::imshow( "Example2_11", bgr_frame );
//对图像进行对数极座标转换
cv::logPolar(
//输入彩色帧
bgr_frame,
//输出对数极座标帧
logpolar_frame,
//对数极座标变换的中心点
cv::Point2f( bgr_frame.cols/2, bgr_frame.rows/2 ),
//尺度参数量级
40,
//用“0”填充异常值outliers
cv::WARP_FILL_OUTLIERS
);
cv::imshow( "Log_Polar", logpolar_frame );
//写入新文件中
writer << logpolar_frame;
char c = cv::waitKey(10);
if( c == 27 ) break; // allow the user to break out
}
capture.release();
}