RoboMaster视觉教程OpenCV(三)任务
#include <iostream>
#include "opencv2/opencv.hpp"
#include <fstream>
using namespace std;
using namespace cv;
void saveImage(const cv::Mat& frame);//函数以及对象如何声明
std::string initImageWriter(const std::string& filename_prefix);
void saveImages(const cv::Mat& frame)
{
auto save_image = initImageWriter("./image/");
if (!frame.empty())
{
imwrite(save_image, frame);
}
else return;
}
std::string initImageWriter(const std::string& filename_prefix)
{
std::string save_image;
std::ifstream in(filename_prefix + "cnt.txt");
int cnt=0;
if (in.is_open())
{
in >> cnt;
in.close();
}
std::string file_name = filename_prefix + std::to_string(cnt) + ".png";
cnt++;
std::ofstream out(filename_prefix + "cnt.txt");
if (out.is_open())
{
out << cnt << std::endl;
out.close();
}
save_image = file_name;
return save_image;
}
unsigned long int i= 0;
int main(int argc, char** argv)
{
VideoCapture cap(0);
if(!cap.isOpened())
{
cerr << "Can not open a camera or file." << endl;//cerr not cout
return -1;
}
Mat frame;
while(1)
{
cap >> frame;
if(frame.empty())
break;
imshow("pictures", frame);
if(i%20==0)//隔20帧保存一帧,足够了
{
saveImages(frame);
}
if(waitKey(30)>= 0)
break;
i++;
}
return 0;
}
代码解析
保存视频和保存图片大同小异
图片保存间隔
如何实现每隔一个固定的帧数保存一帧呢。这里我们需要一个整型变量i,i对于从摄像头读到的每一帧进行计数。那么如果每20帧,保存一帧的话,显然i的值为20、40、60、80……的时候。应该进行保存操作。所以也就意味着i%20 == 0;
i的值应该是什么类型呢呢?如果是每隔20帧进行保存的话,可以使用无符号整型。一旦间隔的帧数比较长,比如说20000帧的话,可以unsigned long int。当它们溢出后,又可以从零开始继续自加。
读取文件的次数
在这里特别注意一下保存视频和保存图片读取视频的次数是不一样的。程序执行一次,只需要保存一次视频,命名一次,所以只需要一次对文件的操作。而不断保存图片,在一次程序中需要命名多次,执行多次文件操作,所以获取路径的初始化函数也需要在每一次保存图片时执行。
initImageWriter()
函数读取文件中的整型,并返回一个已经设置好的路径名filename。
saveImages()
使用imwrite()保存图片。
这里将auto save_image = initImageWriter("./image/");这句话挪到了saveImages()里面。(12行)
微信公众号
欢迎大家关注我的个人公众号,现阶段主要总结Robomaster相关的计算机视觉知识。
公众号名称:三丰杂货铺
转载:https://blog.csdn.net/weixin_42089190/article/details/105046500
查看评论