C++Opencv实时读取摄像头视频保存指定帧图片

空格截图到指定文档

string writePath = "../temp/";
int main(int argc, char** argv){
 VideoCapture capture(0);
 string name;
 namedWindow("hello", CV_WINDOW_AUTOSIZE);
 int i=0;
 while (1) {
  Mat frame;
  capture >> frame;
  if (32 == waitKey(20)) {			//空格拍照
   name = writePath + "i"+".jpg";
   imwrite(name, frame);
   cout << name << endl;
   i++;
  }
  if (97 == waitKey(10)) {			//'a'退出
   break;
  }
  imshow("hello",frame);
  
 }
 //waitKey(0);
}

按时间间隔截图到指定文档

可以自己加一个条件来执行:

if(frameNUM % 10 == 0)
   {
	strcpy_s(cur_fn,"");
   sprintf_s(cur_fn,"%s%d%s",outDir,frameNUM,imgExt);
   cvSaveImage(cur_fn,pImg,NULL);
   }
#include <stdio.h>
#include<opencv2/opencv.hpp>
#include<iostream>
#include<direct.h>
#include<io.h>
#include<string>
 
using namespace std;
using namespace cv;
 
int recursive_mkdir(char* dir);//recursive:递归,mkdir:DOS命令,建立一个新的子目录,dir:是directory目录的缩写
int VideoToImage( CvCapture* capture,char* outdir,char* imgext,int nowFrameNum);//视频转化为图片序列,nowFrameNum为当前帧数
 
 int main(int argc, char** argv)
{
  
  char* outDir1="D:\\EZ\\Image\\";
	VideoCapture cap(0);
	cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920);//宽度
	cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);//高度
	
	CvCapture* capture = cvCaptureFromCAM(0);
	 

	if (!cap.isOpened()) // 检查打开是否成功
		return -1;
 
	double rate=cap.get(CV_CAP_PROP_FPS);//取得帧速率
	int delay=1000/rate;//根据帧速率计算帧之间的等待时间
	bool stop (false);
 
    Mat frame;//当前视频帧
	namedWindow("Extracted Frame");
	int nowFrameNum=0;
	while (!stop)
	{
		if (!cap.read(frame))
			break;
		waitKey(1000);// 延时30ms
		imshow("Extracted Frame",frame);
		nowFrameNum++; //统计帧数
		
		int images=VideoToImage(capture,outDir1,".jpg",nowFrameNum);
		}
	 return 0;
	
 }
	
 
 
//将视频转换为图片序列 返回由视频分解得到的图片总帧数 目前OpenCV只支持AVI格式 因此使用之前需要
  //将视频转化问AVI格式
 
  int  VideoToImage(CvCapture* capture,char* outDir,char* imgExt,int nowFrameNum)
 {
   CvCapture *cap= cvCaptureFromCAM(0);
   if (cap==NULL)
   {
    return 0;
   }
     //保存图片的文件夹路径一定要有,因为OpenCV不会自动创建文件夹
   //int _access(const char* Filename,int Access_Mode) 参数Filename 是访问文件所在的路径名,mode是访问判断模式
   //返回0 表示文件在当前路径已存在,返回-1表示该文件在当前路径不存在
   if (_access(outDir,0)==-1)
   {
      recursive_mkdir(outDir);
      std::cout<<"输出目录不存在,并已自主创建"<<std::endl;
   }
  char cur_fn[255];//保存当前帧所得图片的文件名   表示某张图片的绝对路径  
  IplImage* pImg=NULL;
  int frameNUM=0;
  
  //函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。
  while((pImg=cvQueryFrame(cap))!=NULL&&(frameNUM=nowFrameNum))//
  {               
   frameNUM++;
   nowFrameNum++;
   strcpy_s(cur_fn,"");//strcpy_s是系统的安全函数,strcpy_s是根据'\0'判断源字符串结束的,strcpy_s是以字节为单位的参数,它用来确认缓冲区大小
   sprintf_s(cur_fn,"%s%d%s",outDir,frameNUM,imgExt);//这里的设置适合形如 123.jpg 124.jpg的图片序列  sprintf_s将格式化字符串存到缓冲区
   cvSaveImage(cur_fn,pImg,NULL);
  }
  cvReleaseImage(&pImg);
  cvReleaseCapture(&cap);
  return frameNUM;
 }
  
  
 //该函数借鉴了网上资料,自动创建多级目录
 int recursive_mkdir( char *dir )
 {
  //分解路径名E:\\AA\\BB\\CC\\
  //
  std::string str = dir;
  int index = 0;
  int i = 0;
  while(1)
  {
   //size_type由string类类型和vector类类型定义的类型,用以保存任意string对象或vector对象的长度
   // find 函数 返回"\\" 在index 中的下标位置 
   std::string::size_type pos = str.find("\\",index);
   std::string str1;
   str1 = str.substr(0,pos);//str.substr(a,b)是从a开始截取b个字符。
   if( pos != -1 && i > 0 )
   {
    if (_access(str1.c_str(),0)==-1)  // c_str():生成一个const char*指针,指向以空字符终止的数组.这个数组的数据是临时的
    {
        _mkdir(str1.c_str());
    }
   }
   if( pos==-1 )
   {
    break;
   }
   i ++;
   index = pos+1;
  }
  return 0;
}
  • 3
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当然,下面是一个简单的示例代码,演示了如何使用C++OpenCV读取摄像头视频并进行人脸识别: ```cpp #include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp> #include <opencv2/objdetect.hpp> int main() { cv::VideoCapture cap(0); // 打开默认摄像头 if (!cap.isOpened()) // 检查摄像头是否成功打开 { std::cout << "无法打开摄像头!" << std::endl; return -1; } cv::CascadeClassifier face_cascade; // 创建人脸分类器 if (!face_cascade.load("haarcascade_frontalface_default.xml")) // 加载人脸分类器模型 { std::cout << "无法加载人脸分类器模型!" << std::endl; return -1; } cv::Mat frame; cv::namedWindow("人脸识别"); // 创建窗口 while (true) { cap >> frame; // 从摄像头读取 if (frame.empty()) // 检查是否为空 break; cv::Mat gray; cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY); // 将转换为灰度图像 std::vector<cv::Rect> faces; face_cascade.detectMultiScale(gray, faces, 1.1, 4); // 检测人脸 for (const auto &face : faces) { cv::rectangle(frame, face, cv::Scalar(0, 255, 0), 2); // 绘制人脸矩形框 } cv::imshow("人脸识别", frame); // 显示 if (cv::waitKey(1) == 'q') // 按下 'q' 键退出循环 break; } cap.release(); // 释放摄像头 cv::destroyAllWindows(); // 关闭窗口 return 0; } ``` 请确保在运行代码之前已经安装了OpenCV,并且将文件"haarcascade_frontalface_default.xml"放置在与代码文件相同的目录中。这个XML文件包含了用于人脸检测的分类器模型。 希望这个示例能帮到你!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值