vs2015使用OpenCV录制视频的一些总结(一)

使用OpenCV通过摄像头录制视频的时候的几个要点:
1、使用到的头文件和项目工程的设置

//头文件(有一些可以不包含)
#include 
#include 
#include 
#include 
#include 

在vs中
1. c/c++ 下常规中附加包含目录 和 所有选项中的附加包含目录
这里写图片描述
2.链接器–>常规–>附加库目录
这里写图片描述
3. 链接器–>输入–>附加依赖项
这里写图片描述
debug版本和release版本添加的dll不一样,自己可以在你的OpenCV3.3.0\opencv\build\x64\vc14\bin下找你用的,还有3.3版本的OpenCV和3.3以下版本还不一样,用了几次感觉各种问题,建议使用最新版本
1、打开摄像头(一般0代表前摄像头,1代表后摄像头)
cv::VideoCapture videoCapture = cv::VideoCapture(0);
2、可以修改摄像头的分辨率和每秒的帧数,默认的分辨率好像是640*480,具体我也记不清了(下面会有一个示例代码,示例代码中有设置方法)
3、如果是直接显示在OpenCV,VideoCapture本身的窗口上的话,需要创建一个显示窗口,否则出来的可能是灰色的,反正不正常,创建也很简单
cv::namedWindow("Video");
4、如果要保存的话,还要设置保存路径(保存的文件最好是AVI的,MP4格式的OpenCV本身不支持,如果你要保存MP4格式的,那么需要用到FFmpeg里面的一些东西,具体没有研究)
5、创建文件的写入流,里面包含了保存的分辨率和每秒的帧数,我认为这些应该是直接在打开的时候当做文件的属性保存进去了,方便以后的读取和修改

cv::VideoWriter videoWriter;
//获得相机的宽和高,即分辨率
int w = static_cast<int>(videoCapture.get(CV_CAP_PROP_FRAME_WIDTH));
int h = static_cast<int>(videoCapture.get(CV_CAP_PROP_FRAME_HEIGHT));
cv::Size videoSize(w, h);
double dfs = videoCapture.get(CV_CAP_PROP_FPS);//获得帧率 
videoWriter.open(strFileName, CV_FOURCC('D', 'I', 'V', 'X'), dfs, videoSize);
if (!videoWriter.isOpened())
{
    MessageBoxA(NULL, "Save Failure", "Save", MB_OK);
    return;
}

5、视频的修改、显示和保存

videoCapture.read(frame);//从摄像头中读取当前这一帧
//通过putText函数可以对frame这一帧进行修改,strCurDate为你要放进去的内容,cv::Point为你要放入的位置,
//cv::FONT_ITALIC为内容的样式,里面有9中,你可以自己选择,感觉没有什么大的区别
//0.5这一块是字体大小,cv::Scalar为字体颜色,1代表内容中线条的粗细,cv::LINE_AA线的类型()(也可以在OpenCV中看putText本身的介绍)
cv::putText(frame, strCurDate, cv::Point(2, 20), cv::FONT_ITALIC, 0.5,cv::Scalar(10, 128, 250), 1, cv::LINE_AA);

//对帧的大小进行修改
int  frameHeight = m_capture.get(CV_CAP_PROP_FRAME_HEIGHT);
int  frameWidth = m_capture.get(CV_CAP_PROP_FRAME_WIDTH);
double fScale = 0.5;
m_dsize = cv::Size(frameWidth * fScale, frameHeight * fScale);
m_showframe = cv::Mat(m_dsize, CV_32S);
cv::resize(m_frame, m_showframe, m_dsize);//将m_frame改变为m_showframe

cv::imshow("Video", frame);//将当前帧显示在Video这个窗口上
//也可以显示在QT界面或者其他界面上(这里以QT为例)
//先将cv::mat改变为QImage然后在显示在QT控件上
m_image = QImage((uchar*)(m_showframe.data), m_showframe.cols, m_showframe.rows, QImage::Format_RGB888).rgbSwapped();
ui.label_VideoShow->setPixmap(QPixmap::fromImage(m_image));
videoWriter.write(frame);//将帧写入文件中,在这一块frame帧的大小必须和创建文件时候帧的大小一致,否则有可能写不进去,你也可以修改这一帧的大小

6、等待时长(必须有,否者图像也为灰色)

/* 等待时长,这里要自己设置自己的等待时长
 * 最好是弄一个自己的算法,否者出来的视频可能会丢帧
 * 如果cv::waitKey()等待时长为0的话,那么视频会无限等待,不刷新
 * */
cv::waitKey(1);

6、视频的关闭和缓存的释放(这里必须关闭,否者保存下的视频不能打开)

videoCapture.release();     /*摄像机关闭*/ 
videoWriter.release();      /*写入文件关闭*/
cv::destroyWindow("Video"); /*显示窗口销毁*/

http://download.csdn.net/download/bloke_come/10271078
示例工程,这里对waitKey延时做了一个均衡,经过测试发现可以保证视频的大小以及时长的正常

你可能感兴趣的:(C++)