深度解读 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 (auto item : vcs) { std::cout << "name:" << cv::videoio_registry::getBackendName(item) << std::endl;}
运行结果如下:
本文插图
我的版本是OpenVINO2021.02+OpenCV4.5.1的联合编译版本 。 所以支持GSTREAMER与INTEL_MFX两个后端库 。 视频文件解码采用FFMPEG与英特尔MFX库时的对比演示代码如下:
// cv::VideoCapture cap("D:/test.h264", cv::CAP_INTEL_MFX);// cv::VideoCapture cap("D:/test.h264", cv::CAP_FFMPEG);// cv::VideoCapture cap("D:/images/video/play_football.mp4", cv::CAP_FFMPEG);cv::VideoCapture cap(0, cv::CAP_DSHOW);cv::Mat frame;cv::TickMeter tick;int fps = cap.get(cv::CAP_PROP_FPS);int h = cap.get(cv::CAP_PROP_FRAME_HEIGHT);int w = cap.get(cv::CAP_PROP_FRAME_WIDTH);std::cout << "fps:" << fps << " heigh:" << h << " width:" << w << std::endl;// cv::VideoWriter writer("D:/test.h264", cv::VideoWriter::fourcc('H', '2', '6', '4'), fps, cv::Size(w, h), true);while (true){ tick.start; bool ret = cap.read(frame); tick.stop; if (!ret) { break; } double res_fps = tick.getCounter / tick.getTimeSec; std::cout << tick.getCounter << " frames in " << tick.getTimeSec << " sec ~ " << res_fps << " FPS" << " (total time: " << tick.getTimeSec << " sec)" << std::endl; cv::imshow("input", frame); char c = cv::waitKey(1); // writer.write(frame); if (c == 27) { break; }}// writer.release;cap.release;return 0;
默认下载的OpenCV在Widnows下面只支持CAP_DSHOW这种方式实时视频流解码读取 , 这种方式我测试下来实时性能没有直接读取视频文件方式高效 。 单纯的读取我的电脑自带摄像头(酷睿i7CPU第八代)速度大致只有35FPS左右 , 而我读取视频文件通过FFMPEG支持 , 可以轻松达到每秒220FPS左右 。 而且OpenCV中的FFMPEG是不支持硬件加速的版本 , 响应更好的响应视频流水线操作就绝对不能这么读取 , 有什么好的办法?结合OpenCV有个技术线路可以提高视频流的解码速度 , 提升流水线作业效率 。
- 投影仪|联想t500投影仪怎么样?联想t500和t200区别哪个好?使用评测解读
- 欧洲|清华元宇宙深度报告!理论框架产业真相一文看懂,揭秘十大风险 | 智东西内参
- |深度!详解为何小米手机京东好评率垫底
- 深度学习|面对会议平板的“挤压”,投影机在商务市场的“反击”战或将打响?
- |飞往38万公里外的月球容易,下潜到1万米深度的海底难,为什么?
- 甲骨文|考古学家在仰韶遗址,发现古老的“陶文”,这种文字竟然可以解读
- 月偏食|二次离子质谱技术及对材料深度的分析检测应用
- 摄像头|OPPOK9 Pro全面解读:称之为中端旗舰,应该不过分吧!
- 王传福|阿里2021三季报分析及估值解读
- Windows11|Win 10真的有必要升级Windows 11吗?深度分析,过来人说出真心话