OpenCV代码提取:Windows上通过DShow获取Camera视频
在OpenCV 3.1中獲取視頻的模塊在videoio(video input and output module)中,調用VideoCapture類接口,除了videoio模塊外還依賴core、highgui、imgproc、imgcodecs四個模塊,而OpenCV 2.4.13.6僅需要core、highgui、imgproc三個模塊。3.1中的videoio模塊其實是將2.4.13.6 highgui模塊中與視頻相關的code挪到了videoio中。
3.1中默認走的是IVideoCapture類流程,如果IVideoCapture創建失敗再試著走CvCapture類流程,而在2.4.13.6中就只能走CvCapture類流程。對外接口類VideoCapture的實現都在cap.cpp文件中。IVideoCapture的實現比CvCapture實現要復雜的多,因此這里以2.4.13.6中的code為參考進行code提取。
無論是3.1還是2.4.13.6,無論是IVideoCapture還是CvCapture,在Windows下它們默認的首選都是DShow即DirectShow,微軟提供的一套在Windows平臺上進行流媒體處理的開發包。除了DShow外,在Windows上還可以選擇VFW即Video for Windows,由微軟開發的使Windows能編解碼數字視頻的多媒體框架;也可以選擇MSMF即Microsoft Media Foundation,是微軟在Windows上推出的下一代多媒體開發庫。這里提取DShow code。
主要涉及到的opencv cpp文件包括:
(1). highgui/src/cap.cpp:此文件是對外接口類VideoCapture的實現。
(2). highgui/src/cap_dshow.cpp:此文件是DShow相關的代碼,主要包含三個類videoDevice、videoInput、CvCaptureCAM_DShow。CvCaptureCAM_DShow繼承自CvCapture類。
(3). core/src/array.cpp:僅需要此文件中的很少一部分,主要涉及IplImage的創建和釋放。
提取的所有相關code可在https://github.com/fengbingchun/OpenCV_Test/tree/master/src/fbc_cv 獲取到。
測試代碼如下:注:OpenCV原始代碼中并不支持輸入設備名獲取視頻,只能輸入索引值,這里也先僅支持索引值的方式
#include "fbc_cv_funset.hpp"
#include <videocapture.hpp>
#include <opencv2/opencv.hpp>int test_dshow()
{
#ifdef _MSC_VERint width = 640;int height = 480;int length = width * height * 3;fbc::VideoCapture capture(0);if (!capture.isOpened()) {fprintf(stderr, "fail to open capture\n");return -1;}capture.set(fbc::CV_CAP_PROP_FOURCC, fbc::CV_FOURCC('M', 'J', 'P', 'G'));capture.set(fbc::CV_CAP_PROP_FRAME_WIDTH, width);capture.set(fbc::CV_CAP_PROP_FRAME_HEIGHT, height);fbc::Mat_<unsigned char, 3> image(height, width);cv::Mat mat(height, width, CV_8UC3);const char* winname = "dshow video";cv::namedWindow(winname, 1);while (1) {capture >> image;mat.data = image.data;cv::imshow(winname, mat);if (cv::waitKey(30) >= 0)break;}return 0;
#elsefprintf(stderr, "Error: only support windows platform\n");return -1;
#endif
}
GitHub:https://github.com/fengbingchun/OpenCV_Test
總結
以上是生活随笔為你收集整理的OpenCV代码提取:Windows上通过DShow获取Camera视频的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员的自我修养--链接、装载与库笔记:
- 下一篇: 通过Windows DShow获取设备名