目的
直接调用已有采集SDK,将采集数据进行存储,可改变分辨率、色彩空间。
工具
Visual Studio、OpenCV、C++。
代码
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/videoio.hpp>
#include <sstream>
using namespace std;
using namespace cv;
int main()
{
cv::VideoCapture cameraCapture(0);
cameraCapture.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
cameraCapture.set(cv::CAP_PROP_FRAME_WIDTH, 1920);
cameraCapture.set(cv::CAP_PROP_FRAME_HEIGHT, 1080);
// 打开设备索引为0的默认摄像头,编码格式为MJPG,画面尺寸为(1920, 1080)
// MJPG将每一帧压缩为JPEG格式,在保持高质量图像的同时降低设备压力
if (!cameraCapture.isOpened())
{
std::cerr << "ERROR!! Unable to open camera\n";
return -1;
}
double fps = cameraCapture.get(cv::CAP_PROP_FPS);
if (fps == 0.0)
{
fps = 30.0;
}
// 若无法获取帧率,则将帧率设置为30,增加稳健性
cv::VideoWriter videoWriter;
std::string filename = "写入文件位置";
int fourcc = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');
bool isColor = true;
videoWriter.open(filename, fourcc, fps, Size(1920, 1080), isColor);
// 写入MJPG编码,AVI封装,30帧,1920x1080,彩色视频
if (!videoWriter.isOpened())
{
std::cerr << "ERROR!! Unable to open video file for writing\n";
return -1;
}
cv::Mat imageCaptured;
while (true)
{
cameraCapture >> imageCaptured;
if (imageCaptured.empty())
{
std::cerr << "ERROR!! Captured empty frame\n";
break;
}
// 硬件问题、帧丢失、帧率不匹配都会导致空帧的产生
cv::imshow("SDKCapture", imageCaptured);
videoWriter.write(imageCaptured);
if (cv::waitKey(1) >= 0)
{
break;
}
}
cameraCapture.release();
videoWriter.release();
cv::destroyAllWindows();
return 0;
}
原理
1、打开摄像头,设置编码格式和画面大小;
2、设置写入文件的编码格式和画面大小,本程序生成的是AVI格式视频文件;
3、显示摄像头采集到的画面,并写入指定的位置。