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