opencv读取视频文件_opencv读取视频的过程是解码

opencv读取视频文件_opencv读取视频的过程是解码,第1张

opencv读取视频文件_opencv读取视频的过程解码 引言深度解析OpenCV中VideoCapture对象背后的视频编码与解码的第三方库支持与速度之谜。

支持的第三编解码库与类型我们都知道OpenCV中的VideoCapture视频读取是借助其它的第三方库来完成编码与解码的过程,当前支持的视频解码主要有:mkv / mpeg2mkv / h264mkv / h265 mkv / vp8 mp4 / mpeg2 mp4 / h264mp4 / h265avi / mpeg2avi / h264 avi / vp8视频编码主要有:mkv / mpeg2mkv / h264mkv / vp8mp4 / h264 avi / mpeg2avi / h264avi / vp8我们最常见的OpenCV中读取视频文件的函数VideoCapture参数解释如下:cv::VideoCapture::VideoCapture( const String & filename, int apiPreference = CAP_ANY)其中参数filename表示文件名称,大家经常忽略第二个参数默认值为CAP_ANY,意思是系统自动检测选择。

当读取摄像头或者IP视频流的时候:cv::VideoCapture::VideoCapture( int index, int apiPreference = CAP_ANY)其中index表示相机的ID标识。

当读取视频文件时候第二个参数的可以设置为:cv::CAP_FFMPEGcv::CAP_INTEL_MFX当读取摄像头或者视频流时候,第二个参数可以设置为cv::CAP_DSHOW // windows只支持cv::CAP_MSMFcv::CAP_V4L如何查询当前OpenCV版本支持哪些视频编码与解码的第三方后端库,可以通过下面的代码完成:std::vector<cv::VideoCaptureAPIs>vcs=cv::videoio_registry::getBackends();for(autoitem:vcs){std::cout<<"name:"<<cv::videoio_registry::getBackendName(item)<<std::endl;}运行结果如下:我的版本是OpenVINO2021.02+OpenCV4.5.1的联合编译版本。

所以支持GSTREAMER与INTEL_MFX两个后端库。

视频文件解码采用FFMPEG与英特尔MFX库时的对比演示代码如下://cv::VideoCapturecap("D:/test.h264",cv::CAP_INTEL_MFX);//cv::VideoCapturecap("D:/test.h264",cv::CAP_FFMPEG);//cv::VideoCapturecap("D:/images/video/play_football.mp4",cv::CAP_FFMPEG);cv::VideoCapturecap(0,cv::CAP_DSHOW);cv::Matframe;cv::TickMetertick;intfps=cap.get(cv::CAP_PROP_FPS);inth=cap.get(cv::CAP_PROP_FRAME_HEIGHT);intw=cap.get(cv::CAP_PROP_FRAME_WIDTH);std::cout<<"fps:"<<fps<<"heigh:"<<h<<"width:"<<w<<std::endl;//cv::VideoWriterwriter("D:/test.h264",cv::VideoWriter::fourcc('H','2','6','4'),fps,cv::Size(w,h),true);while(true){tick.start();boolret=cap.read(frame);tick.stop();if(!ret){break;}doubleres_fps=tick.getCounter()/tick.getTimeSec();std::cout<<tick.getCounter()<<"framesin"<<tick.getTimeSec()<<"sec~"<<res_fps<<"FPS"<<"(totaltime:"<<tick.getTimeSec()<<"sec)"<<std::endl;cv::imshow("input",frame);charc=cv::waitKey(1);//writer.write(frame);if(c==27){break;}}//writer.release();cap.release();return0;加速解码默认下载的OpenCV在Widnows下面只支持CAP_DSHOW这种方式实时视频流解码读取,这种方式我测试下来实时性能没有直接读取视频文件方式高效。

单纯的读取我的电脑自带摄像头(酷睿i7 CPU第八代)速度大致只有35FPS左右,而我读取视频文件通过FFMPEG支持,可以轻松达到每秒220FPS左右。

而且OpenCV中的FFMPEG是不支持硬件加速的版本,响应更好的响应视频流水线 *** 作就绝对不能这么读取,有什么好的办法?结合OpenCV有个技术线路可以提高视频流的解码速度,提升流水线作业效率。

方法:使用GSTREAMER支持方式相比FFMPEG第三方库,GSTREAMER支持多种后端,通过软件支持硬件加速的方式解码视频与流水线解码视频 *** 作,同时还支持异步 *** 作,这一波 *** 作之后,解码速度会比最原始的OpenCV自动检测得到的方法要快N多,官方实验给出的数据如下:实事证明的确可以加速很多!该方法只在ubuntu系统下验证过,widnows系统下还没有验证过,官方说 in theory, can run~~~~作为技术人员看到这句话你懂的,就是坑很多,你自己看着办!此外就是彻底放弃Windows的DSHOW,有钱买个加速卡,直接硬件解码加速,这样就无忧了。

为了让大家更好得理解与使用OpenVINO框架,我特别整理了OpenVINO计算机视觉加速的学习路径,图示如下:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/665970.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-18
下一篇 2022-04-18

发表评论

登录后才能评论

评论列表(0条)

保存