opencv2.4.9 实现摄像头实时拍摄并保存每一帧图片到指定文件夹

此脚本为opencv2.4.9环境下的,其他版本有可能报错

#if 0
#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:\\Besktop\\faimage\\";
	VideoCapture cap(0);
	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(30);// 延时30ms
		imshow("Extracted Frame", frame);
		nowFrameNum++; //统计帧数

		char 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)
{
    //
	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;
}
#endif // 0

打开摄像头并显示每一帧但不保存

#if 0
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
// OpenCV includes

using namespace cv;

int main(int argc, const char** argv)
{
	// 1.创建视频采集对象;
	VideoCapture cap;

	// 2.打开默认相机;
	cap.open(0);

	// 3.判断相机是否打开成功;
	if (!cap.isOpened())
		return -1;

	// 4.显示窗口命名;
	namedWindow("Video", 1);
	for (;;)
	{
		// 获取新的一帧;
		Mat frame;
		cap >> frame;
		if (frame.empty())
			return 0;

		// 显示新的帧;
		imshow("Video", frame);

		// 按键退出显示;
		if (waitKey(30) >= 0) break;
	}

	// 5.释放视频采集对象;
	cap.release();

	return 0;
}
#endif // 0

提取关键帧的简单程序

#if 0
#include<opencv2/highgui/highgui.hpp>
#include<windows.h>
#include<stdio.h>

int main()
{
	CvCapture* capture = cvCreateCameraCapture(0);
	cvNamedWindow("camera", CV_WINDOW_AUTOSIZE);
	IplImage* image;
	char file_name[15];
	int i;
	while (1)
	{
		for (i = 0; i < 1; i++)//i的值表示保存多少帧图片
		{
			image = cvQueryFrame(capture);
			if (!image)
				break;
			cvShowImage("camera", image);
			char c = cvWaitKey(1);
			if (c == 27)
			{
				cvReleaseCapture(&capture);
				cvDestroyWindow("hh");
				exit(0);
			}//按esc退出
			c = cvWaitKey(40);//使帧与帧之间创建一个短暂的暂停,让图像输入慢一点
			sprintf(file_name, "D:\\Besktop\\Image\\%04d.jpg", i);//d盘根目录下生成
			cvSaveImage(file_name, image);
		}
	}
}
#endif // 0

猜你喜欢

转载自blog.csdn.net/qq_65356682/article/details/130137888
今日推荐