一、相关代码
#include <opencv2/opencv.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
int d = 0;
char str[300] = { 0 };
VideoCapture capture;
capture.open(0);
//判断相机是否打开
if (!capture.isOpened())
{
cout << "open camera failed" << endl;
return -1;
}
while (true)
{
Mat camera_frame;
capture >> camera_frame; //读取图像帧至camera_frame
// 第二种获取方式
//capture.read(camera_frame);
if (!camera_frame.empty())
{
imshow("picture", camera_frame);
}
// 按“s”键保存图片至指定路径
int k = waitKey(2);
if (k == 's')
{
// 路径斜杠要注意,容易出错
sprintf_s(str,300, "D:\\360MoveData\\Users\\ZNC\\Desktop\\op\\%d.jpg", ++d);
imwrite(str, camera_frame);
}
// 按q键退出程序
if (k == 'q')
{
break;
}
}
// 销毁显示窗口,不添加按q会报错
cv::destroyAllWindows();
}
二、相关知识
(1)sprintf_s()函数
sprintf_s是sprintf的安全版本,指定缓冲区长度来避免sprintf()存在的溢出风险,区别在sprintf_s第二个参数,可以控制缓冲区大小 。
sprintf/sprintf_s指的是字符串格式化命令,其功能是把格式化的数据写入指定字符串中。
sprintf 是个变参函数。使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性。
头文件
stdio.h
原型
int sprintf_s(char *buffer,size_t sizeOfBuffer,const char *format,
[argument] ...);
参数列表
buffer:char型指针,指向将要写入的字符串的缓冲区。
sizeOfBuffer:缓冲区大小。
format:格式化字符串。
[argument]...:可选参数,可以是任何类型的数据
相关参考:
(1)opencv学习---VideoCapture 类基础知识_hairuiJY的博客-CSDN博客_cv::videocapture