opencv视频读写和视频等间隔采样

今天学习了opencv的HighGUI的内容

总结了两个视频读写demo以备以后进行视频处理和识别用


demo1 视频的读取和写入

按顺序读取视频的每一帧。对于读取的每一帧图像,显示在窗口中,然后转化为灰度图像输出到指定的文件中。

运行期间可以按ESC键退出。

还可以用鼠标调整滚动条来动态改变视频的播放位置。滚动条的位置≈想要播放的帧在整个视频中的位置

比如将滚动条调整到如下图所示位置,直接将视频跳转到视频总长度一半的位置开始播放

滚动条的位置想要播放的帧在整个视频中的位置  这里之所以是“约等于”,是因为opencv采用的帧定位的函数默认使用的是关键帧的定位方式,导致视频跳转的位置并不准确。

具体可以参见SetCaptureProperty定位不准的原因

另外有个容易出错的地方,创建视频写入器的命令:CvVideoWriter* wrVideo1 = cvCreateVideoWriter(out1, CV_FOURCC('X','V','I','D'), fps1, size1,0);

最后有个参数是0,表示输出的视频文件是灰度的。如果不设置,默认的参数取值为1,代表输出的视频文件是彩色的。如果此时将图像转换成灰度图后输出。运行视频文件是系统会提示错误。

对于这一点的描述可以参见opencv彩色图像转灰度图像失败的原因


demo1的源代码如下:

#include <iostream>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>// 使用标准命名空间
using namespace std;// 初始化进度条的位置
int g_slider_position1 = 0;//初始化视频捕获器
CvCapture* g_capture1 = NULL;// 定义回调函数用于播放进度的控制 
void onTrackbarSlide1( int pos1 )
{cvSetCaptureProperty( g_capture1, CV_CAP_PROP_POS_FRAMES, pos1 );
}int main(int argc, char** argv )
{// 建立播放窗口cvNamedWindow( "Video Test 1", CV_WINDOW_AUTOSIZE );// 捕捉视频文件char video1[] = "yssh.avi";//创建指定视频文件的捕获器g_capture1 = cvCreateFileCapture( video1 );// 读取视频文件的总帧数并显示int frames1 = (int) cvGetCaptureProperty( g_capture1, CV_CAP_PROP_FRAME_COUNT );cout << "总帧数 = " << frames1 << endl;// 读取视频文件每秒显示帧数信息double fps1 = cvGetCaptureProperty( g_capture1, CV_CAP_PROP_FPS );cout << "fps1 = " << fps1 << endl;//读取视频文件每帧图像大小信息CvSize size1 = cvSize( (int)cvGetCaptureProperty(g_capture1, CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty(g_capture1, CV_CAP_PROP_FRAME_HEIGHT));// 建立进度条if( frames1 != 0 )cvCreateTrackbar( "Position", "Video Test 1", &g_slider_position1, frames1, onTrackbarSlide1);// 创建 VideoWriter char out1[] = "out1.avi";//CvVideoWriter* wrVideo1 = cvCreateVideoWriter(out1, CV_FOURCC('M','J','P','G'), fps1, size1,0);//创建视频写入器CvVideoWriter* wrVideo1 = cvCreateVideoWriter(out1, CV_FOURCC('X','V','I','D'), fps1, size1,0);// 记录视频的某一帧IplImage* frame1;//记录视频某一帧转换后的灰度图像IplImage* gray1 = cvCreateImage(size1, 8, 1);//读取并播放视频,直至播放结束/主动退出while( true  ){// 获取源文件的一帧画面frame1 = cvQueryFrame( g_capture1 );if( !frame1 ) break;//显示这一帧cvShowImage( "Video Test 1", frame1 );// 将当前帧转换为灰度图像cvCvtColor(frame1 ,gray1, CV_RGB2GRAY);// 保存:将当前帧(灰度图)写入到目标视频文件cvWriteFrame( wrVideo1, gray1 );// 若按下 ESC 键,则退出程序char c = cvWaitKey(33);if( c == 27 ) break;	}// 释放内存,关闭窗口cvReleaseCapture( &g_capture1 );cvReleaseVideoWriter( &wrVideo1 );cvDestroyWindow( "Video Test 1" );return 0;
}



demo2 视频等间隔采样

程序按顺序读取视频的每一帧,对于满足固定间隔的帧图像,显示并输入,不满足的直接跳过。

这个demo可以用于等间隔的从视频中抽取图像,以备以后进行视频处理和识别用


demo2的源代码如下:

#include <iostream>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>// 使用标准命名空间
using namespace std;//初始化视频捕获器
CvCapture* g_capture1 = NULL;int main(int argc, char** argv )
{// 建立播放窗口cvNamedWindow( "Video Test 1", CV_WINDOW_AUTOSIZE );// 捕捉视频文件char video1[] = "yssh.avi";//创建指定视频文件的捕获器g_capture1 = cvCreateFileCapture( video1 );// 读取视频文件的总帧数并显示int TotalFrames = (int) cvGetCaptureProperty( g_capture1, CV_CAP_PROP_FRAME_COUNT );cout << "总帧数 = " << TotalFrames << endl;// 读取视频文件每秒显示帧数信息double fps1 = cvGetCaptureProperty( g_capture1, CV_CAP_PROP_FPS );cout << "fps1 = " << fps1 << endl;//读取视频文件每帧图像大小信息CvSize size1 = cvSize( (int)cvGetCaptureProperty(g_capture1, CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty(g_capture1, CV_CAP_PROP_FRAME_HEIGHT));//CvVideoWriter* wrVideo1 = cvCreateVideoWriter(out1, CV_FOURCC('M','J','P','G'), fps1, size1,0);//创建视频写入器VideoWriterchar out1[] = "IntervalOutput.avi";CvVideoWriter* wrVideo1 = cvCreateVideoWriter(out1, CV_FOURCC('X','V','I','D'), fps1, size1,0);// 记录视频的某一帧IplImage* frame1;//记录视频某一帧转换后的灰度图像IplImage* gray1 = cvCreateImage(size1, 8, 1);int position=0;int interval=10;  //这里指定一个抽取视频间隔//读取并播放视频,直至播放结束/主动退出while( true  ){// 先获取源文件的一帧画面frame1 = cvQueryFrame( g_capture1 );if( !frame1 ) //视频读取完毕break; position=(int)cvGetCaptureProperty( g_capture1, CV_CAP_PROP_POS_FRAMES);if(position%interval!=0) continue;//显示这一帧cvShowImage( "Video Test 1", frame1 );// 将当前帧转换为灰度图像cvCvtColor(frame1 ,gray1, CV_RGB2GRAY);// 保存:将当前帧(灰度图)写入到目标视频文件cvWriteFrame( wrVideo1, gray1 );// 若按下 ESC 键,则退出程序char c = cvWaitKey(33);if( c == 27 ) break;	}// 释放内存,关闭窗口cvReleaseCapture( &g_capture1 );cvReleaseVideoWriter( &wrVideo1 );cvDestroyWindow( "Video Test 1" );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Socket通用TCP通信协议设计及实现(防止粘包,可移植,可靠)

Socket通用TCP通信协议设计及实现&#xff08;防止粘包&#xff0c;可移植&#xff0c;可靠&#xff09; 引文 我们接收Socket字节流数据一般都会定义一个数据包协议。我们每次开发一个软件的通信模块时&#xff0c;尽管具体的数据内容是不尽相同的&#xff0c;但是大体上的框…

浅谈 Adaboost 算法

注&#xff1a;本文全文引用自http://blog.csdn.net/carson2005/article/details/41444289 当然作者也是转载的&#xff0c;原文是http://blog.csdn.net/haidao2009/article/details/7514787 写的很好所以转载过来以便之后再次翻阅。 一 Boosting 算法的起源 boost 算法系列的起…

如何理解离散傅里叶变换(一)实数形式傅里叶变换

如何理解离散傅里叶变换&#xff08;一&#xff09; ——实数形式傅里叶变换 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 本文…

快速傅里叶变换(FFT)

快速傅里叶变换&#xff08;FFT&#xff09; ------------------------------------------------------------------------------------------------------------------- 作者&#xff1a;随煜而安 时间&#xff1a;2015/7/21 注&#xff1a;本文为作者原创文章&#xff0c…

风机桨叶故障诊断(一) 样本的获取

风机桨叶故障诊断&#xff08;一&#xff09; 样本的获取今天团队接了个新项目&#xff0c;做一个风机桨叶故障诊断系统。虽然马上就是准备考研的关键期了&#xff0c;可是一想到这是我学习了机器学习后遇到的第一个实际项目&#xff0c;我觉得参与进来&#xff0c;也帮导师分担…

风机桨叶故障诊断(二) 获取图像几何主方向

风机桨叶故障诊断&#xff08;二&#xff09; 获取图像几何主方向 昨天&#xff0c;我将视频资源按帧抽取并筛选得到了可以用来提取样本的图像库。今天还是进行项目的准备工作。当我们拿到一张图片&#xff0c;我们的软件要做的大致可以分为三个步骤&#xff1a;从原图中识别桨…

风机桨叶故障诊断(三) 识别桨叶——初步构建BP神经网络

风机桨叶故障诊断&#xff08;三&#xff09; 识别桨叶——初步构建BP神经网络 新的一天&#xff0c;希望有好的运气。今天开始着手系统的第一个模块&#xff0c;从一幅图像中寻找到桨叶所在的位置。第一直觉我们的识别任务属于难度比较大&#xff0c;干扰因素多的了&#xff…

风机桨叶故障诊断(五) 修改隐含层神经元个数的尝试

风机桨叶故障诊断&#xff08;五&#xff09; 修改隐含层神经元个数的尝试 我们已经为训练一个更为稳健的神经网络做好了样本的准备工作&#xff0c;那么我们开始下一步的工作吧&#xff01; 我们已经有了样本集&#xff0c;目前我筛选出来了247个正样本&#xff0c;652个负样本…

风机桨叶故障诊断(六) 利用自编码器进行特征学习

风机桨叶故障诊断&#xff08;六&#xff09; 利用自编码器进行特征学习 在之前的工作中&#xff0c;我已经初步构建了三层的BP神经网络&#xff0c;并已经从样本集的选取&#xff0c;模型的选择&#xff08;隐含层神经元个数&#xff09;&#xff0c;和输出层神经元阈值选择这…

风机桨叶故障诊断(七) 滑动窗与非极大值抑制NMS

风机桨叶故障诊断&#xff08;七&#xff09;滑动窗与非极大值一直NMS 到目前为止&#xff0c;我已经利用自编码神经网络提取特征后训练得到了BP神经网络&#xff08;参见&#xff1a;点击打开链接&#xff09;&#xff0c;且在测试样本集上表现不错。下面我们就要应用到实际中…

Distinctive Image Features from Scale-Invariant Keypoints-SIFT算法译文

本文全篇转载自如下博客&#xff0c;感谢博主的无私分享 http://www.cnblogs.com/cuteshongshong/archive/2012/05/25/2506374.html ------------------------------------------------------------------------------------------------------ 从尺度不变的关键点选择可区分的…

将图像绘制成3维立体散点图

matlab源代码&#xff1a; Iimread(F:\绝缘子识别\绝缘子红外test图片\test (50).jpg); Irgb2gray(I); [wd,len]size(I); interval10; %设置绘制散点图的间隔&#xff0c;全部绘出会很卡 x[]; y[]; z[]; numfloor((len-1)/interval)1;%计算在当前间隔下图像的每一行…

C#灰度图转伪彩色图

/// <summary>/// 伪彩色图像构造器/// </summary>public class PseudoColorImageBuilder{/// <summary>/// 铁红色带映射表/// 每一行代表一个彩色分类&#xff0c;存放顺序是RGB/// </summary>public static byte[,] ironTable new byte[128, 3] {{…