保存视频 opencv::VideoWriter

// 视频参数
m_videoInfo.fps = m_capture.get(cv::CAP_PROP_FPS);
m_videoInfo.width = m_capture.get(cv::CAP_PROP_FRAME_WIDTH);
m_videoInfo.height = m_capture.get(cv::CAP_PROP_FRAME_HEIGHT);
// 初始化VideoWriter
m_mapVideoWriter[_strVideoName] = cv::VideoWriter(_strVideoName,
				cv::VideoWriter::fourcc('X', 'V', 'I', 'D'),
				m_videoInfo.fps,
				cv::Size(m_videoInfo.width, m_videoInfo.height)
				);
// 写数据
for (auto videoWriter : m_mapVideoWriter)
{
	videoWriter.second << _mat;
}

视频保存结果
在这里插入图片描述

while(true)
{
	for (auto videoWriter : m_mapVideoWriter)
	{
		videoWriter.second << _mat;
		funtion();
	}
}

写数据的操作,运行如下,保存数据正常的前提,funtion()执行一次的时间不能过长(保存图片的频率要满足一定要求,120ms的保存会出错,其它没有测试)。上图video.mp4为正常保存的视频,15_9_36_model_zhiyin.mp4为错误保存的结果,打开会有下图错误。
在这里插入图片描述
VideoSaveFunTool文件夹创建,文件名称拼接类
VideoSaveFunTool.h

#pragma once
/*
	保存视频中,文件路径处理类
*/
#ifndef VIDEOSAVEFUNTOOL_H
#define VIDEOSAVEFUNTOOL_H
#include <ctime>
#include <string>
namespace UsbCamera
{
	class VideoSaveFunTool
	{
	public:
		VideoSaveFunTool();
		void  GetSaveVidePath(std::string& _strVideoDir);
	private:
		std::string GetVideoDir();
		bool CreateDir(std::string & _strDir);
		void UpdateTime();
		std::string m_fileDir;
		struct tm* m_pTime;	// 存储时间,用于保存视频文件
	};
}

#endif // !VIDEOSAVEFUNTOOL_H

VideoSaveFunTool.cpp

#include "VideoSaveFunTool.h"
#include "io.h"
#include <ctime>
#include <direct.h>
#include <iostream>
#include "tinyxml2.h"
namespace UsbCamera
{
#define PATH_DELIMITER '\\'
	void VideoSaveFunTool::UpdateTime()
	{
		time_t nowtime;
		time(&nowtime);
		//使用该函数就可得到当前系统时间,使用该函数需要将传入time_t类型变量nowtime的地址值。
		m_pTime = localtime(&nowtime);
		m_pTime->tm_year += 1900;
	}

	bool VideoSaveFunTool::CreateDir(std::string & _strDir)
	{
		std::string folder_builder;
		std::string sub;
		sub.reserve(_strDir.size());
		for (auto it = _strDir.begin(); it != _strDir.end(); ++it) {
			const char c = *it;
			sub.push_back(c);
			if (c == PATH_DELIMITER || it == _strDir.end() - 1) {
				folder_builder.append(sub);
				if (0 != ::_access(folder_builder.c_str(), 0)) {
					// this folder not exist
					if (0 != ::_mkdir(folder_builder.c_str())) {
						// create failed
						return false;
					}
				}
				sub.clear();
			}
		}
		return true;
	}

	std::string VideoSaveFunTool::GetVideoDir()
	{
		// 新建一个空文档
		tinyxml2::XMLDocument xmlDoc;

		// 读取指定的xml文件并判断读取是否成功
		tinyxml2::XMLError eResult = xmlDoc.LoadFile("config/VideoFileConfig.cas");
		if (eResult != tinyxml2::XML_SUCCESS)
		{
			printf("error code :%d\n", tinyxml2::XML_ERROR_FILE_NOT_FOUND);
			return "";
		}
		// 获得该文件的第一个节点(根节点)
		tinyxml2::XMLNode * pRoot = xmlDoc.FirstChildElement("VideoFileConfig");
		if (pRoot == nullptr)
		{
			printf("error code :%d\n", tinyxml2::XML_ERROR_FILE_READ_ERROR);
			return "";
		}
		else
		{
			tinyxml2::XMLElement * pVideoDirElement = pRoot->FirstChildElement("VideoDir");
			return pVideoDirElement->GetText();
		}
	}

	VideoSaveFunTool::VideoSaveFunTool()
	{
		m_fileDir = GetVideoDir();
		if (m_fileDir == "")
			m_fileDir = "D:\\Video";
	}

	void  VideoSaveFunTool::GetSaveVidePath(std::string& _strVideoDir)
	{
		struct tm time; // 时间
		std::string filePath; // 保存的路径
		// 更新时间
		UpdateTime();
		// 构建存储目录
		filePath = m_fileDir + "\\" + std::to_string(m_pTime->tm_year) + "\\" + std::to_string(m_pTime->tm_mon) + "\\"
			+ std::to_string(m_pTime->tm_mday);
		CreateDir(filePath);
		filePath = filePath + "\\" + std::to_string(m_pTime->tm_hour) + "_" + std::to_string(m_pTime->tm_min)
			+ "_" + std::to_string(m_pTime->tm_sec);
		_strVideoDir = filePath;
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值