opencv保存视频

这个是积木论第一条,因为超过10个字的,必然不是一个积木的功能了,而是好几个积木搭成的
积木论第二条:分得清积木和形状,积木是普遍的,形状是特殊的。一个是,读取txt 分得清积木和形状,积木是普遍的,形状是特殊的
第三条:搜寻积木先判断积木领域
1、往软件添加列表等,很显然是MFC领域积木,如果搜opencv添加列表,将毫无意义。2、保存视频,这个东西难道不在Mfc项目就保存不了了?它明显是一块opencv积木
难道我新建一个别的类型项目,哪怕是空项目,自己写个main函数,也照样可以保存视频,mfc只不过是把这个main函数里面的代码搬到了它的按钮里面而已
所以重要的是opencv
Opencv保存视频,仅一条语句,我现在百度搜给你看
截取视频和保存视频哪个更宏观,哪个更细致?
所以截取视频是特殊的
Opencv保存视频是普遍的
截取视频只不过是把很多帧图片中的某一些时刻开始存,某一些时刻结束存
保存视频,就是,开始存和结束。截取视频只不过多了一个条件,某一时刻
比如你设置一个变量为0,如果突然满足某一条件(比如,按下录制视频按钮),令这个变量等于1。然后那个某一时刻,就是监测这个变量变为1。 结束,也是这个道理
你看,这个是不是,仅仅在保存视频上,加了一点点特殊操作?
如果你连保存连续帧为视频都不会
凭什么直接去弄截取视频?
计算机是死的,你说的越通俗,越普遍,它能回馈你的就越多
普遍的东西是共用的,特殊的东西各不相同

复杂是因为那是人家的特殊性,并不一定和你的特殊性一样

第一步,保存视频这篇博客,采用第二种,发现保存下来视频,大小与原来差别很大opencv运行出现错误ffmpeg

openCV视频保存的一点小心得

思路如下:

第一步,采用在播放帧数的while循环体中直接截取视频,但是需要注意cvWriteFrame(writer, pFrame);中的writer得定义成全局变量,才能实现,你定义在while循环体内,体外都无法截取到视频文件到路径中,会出现视频文件未0kb或者6kb

	while (pFrame)
	{
		WaitForSingleObject(start_event, INFINITE);
		start_event.SetEvent();
		if (terminate_flg == -1)
		{
			terminate_flg = 0;  
			_endthreadex(0);
		};
		pThis->Display(pFrame, IDC_VIDEO);
	
		//截取视频
		if (1 == videoCut_flg)
		{
			//中间省略对frame进行处理的代码
			cvWriteFrame(writer, pFrame);
		}
		else if (2 == videoCut_flg)
		{	
			AfxMessageBox(_T("截取视频成功!"));
			cvReleaseVideoWriter(&writer);
			videoCut_flg = 0;//初始化
		}		
		Sleep(33);		
		pFrame = cvQueryFrame(pCapture );
	}
//定义写视频函数指针
CvVideoWriter* writer;

同时在"开始录制/结束录制"按钮,中添加如下响应函数:

//点击此处按钮,录制Picture控件中的视频
void C海上目标检测跟踪Dlg::OnBnClickedRecordvideo()
{
	// TODO:  在此添加控件通知处理程序代码

	//录制视频,起点与结束点的控制
	CString buttonText;
	m_VideoCut.GetWindowText(buttonText);
	//需要循环的判断这个按钮是什么状态,来控制结束的点
	if (buttonText.Compare(_T("开始录制")) == 0)
	{
		//获取时间戳 创建截取视频路径
		CTime currTime;
		currTime = CTime::GetCurrentTime();
		CString strTime;
		strTime.Format(_T("%.4d-%.2d-%.2d-%.2d-%.2d-%.2d"), currTime.GetYear(), currTime.GetMonth(), currTime.GetDay(), currTime.GetHour(), currTime.GetMinute(), currTime.GetSecond());
		CString strFolderPath_Video_Save;
		//实现下拉框选中图片格式,相应保存需要的图片格式
		strFolderPath_Video_Save = strFolderPath_Video + "\\" + strTime + _T(".") + _T("avi");

		int fps = (int)cvGetCaptureProperty(pCapture, CV_CAP_PROP_FPS); //帧率
		CvSize size = cvSize(
			(int)cvGetCaptureProperty(pCapture, CV_CAP_PROP_FRAME_WIDTH),
			(int)cvGetCaptureProperty(pCapture, CV_CAP_PROP_FRAME_HEIGHT));

		videoCut_flg = 1;

		writer = cvCreateVideoWriter(strFolderPath_Video_Save, CV_FOURCC('X', 'V', 'I', 'D'), fps, size, true);


		m_VideoCut.SetWindowTextA(_T("结束录制"));
	}
	else
	{
		videoCut_flg = 2;	
		//AfxMessageBox(_T("截取视频成功!"));
		m_VideoCut.SetWindowText(_T("开始录制"));
	}		
}

对哦,还有别忘记,定义全局变量

int videoCut_flg = 0;//录制视频标志

来控制while循环体中,什么时候开始截取,什么时候截取结束,非常重要




猜你喜欢

转载自blog.csdn.net/weixin_40807247/article/details/80013827