Opencv讀取攝像頭卡頓
開發環境:Win10系統,羅技HD1080p高清攝像頭,UE4_21,VS2017
開發原理:多線程中通過OpenCV對攝像頭進行高清採集(1920*1080),然後顯示到UMG中。
遇到問題:在2k採集模式下,畫面卡頓厲害。
猜想1:是不是卡在採集後的圖像cv::Mat往UTexture2D*填入時的問題,畢竟1920*1080個像素的拷貝。
實踐:減小採集分辨率(640*480),然後cv::resize到1920*1080,再拷貝到1920*1080的UTexture2D* 中
結果:視頻非常流暢,那麼可以斷言,跟圖像據拷貝到UTexture2D*中這一步,就沒關係了
猜想2:是不是攝像頭採集的問題。有大佬說了,很多攝像頭,在高分辨率的情況下都不到15幀,以MJPG格式解碼能達到30幀。
實踐:這一步當然去網上搜颳了。
原理篇參閱Jetson TX1開發筆記(六):V4L2+OpenCV3.1以MJPG格式讀取USB攝像頭圖像並實時顯示
https://blog.csdn.net/c406495762/article/details/72732135
大致意思是這樣的,該攝像頭的YUV2輸出格式只有一種640 x 480分辨率,而輸出格式爲MJPG有多種分辨率,如果想實現高清採集,需要通過MJPG格式進行採集。
那麼,怎麼設置採集模式呢?
毫無疑問,肯定在設置裏面。看看網上大佬是怎麼表演的吧。
Python opencv 調用攝像頭時設置以MJPG等編碼格式獲取視頻
https://blog.csdn.net/qq_38392644/article/details/85197264
(下面引用上篇博客,轉C++實現)
使用opencv讀取和設置攝像頭或視頻屬性代碼如下。
cv::VideoCapture cap;
cap.set(proID, value)
cap.get(proID)
其中,propId 的值爲 0 - 18,19個值並不是每個都可以進行修改,每個值對應的屬性以及功能如下如下:
參數 | 值 | 功能/意義 |
---|---|---|
CV_CAP_PROP_POS_MSEC | 0 | 視頻文件的當前位置(以毫秒爲單位)或視頻捕獲時間戳 |
CV_CAP_PROP_POS_FRAMES | 1 | 基於0的索引將被解碼/捕獲下一幀 |
CV_CAP_PROP_POS_AVI_RATIO | 2 | 視頻文件相對位置:0 - 電影的開始,電影的1 - 結束 |
CV_CAP_PROP_FRAME_WIDTH | 3 | 視頻裏每一幀的寬 |
CV_CAP_PROP_FRAME_HEIGHT | 4 | 視頻裏每一幀的高 |
CV_CAP_PROP_FPS | 5 | 視頻的幀速 |
CV_CAP_PROP_FOURCC | 6 | 4個字符表示的視頻編碼器格式 |
CV_CAP_PROP_FRAME_COUNT | 7 | 視頻的幀數 |
CV_CAP_PROP_FORMAT | 8 | byretrieve()返回的Mat對象的格式 |
CV_CAP_PROP_MODE | 9 | 指示當前捕獲模式的後端特定值 |
CV_CAP_PROP_BRIGHTNESS | 10 | 圖像的亮度(僅適用於相機) |
CV_CAP_PROP_CONTRAST | 11 | 圖像對比度(僅適用於相機) |
CV_CAP_PROP_SATURATION | 12 | 圖像的飽和度(僅適用於相機) |
CV_CAP_PROP_HUE | 13 | 圖像的色相(僅適用於相機) |
CV_CAP_PROP_GAIN | 14 | 圖像的增益(僅適用於相機) |
CV_CAP_PROP_EXPOSURE | 15 | 曝光(僅適用於相機) |
CV_CAP_PROP_CONVERT_RGB | 16 | 表示圖像是否應轉換爲RGB的布爾標誌 |
CV_CAP_PROP_WHITE_BALANCE | 17 | 目前不支持 |
CV_CAP_PROP_RECTIFICATION | 18 | 立體攝像機的整流標誌(注意:只有當前支持DC1394 v 2.x後端) |
//1.打開攝像機設備(默認第一個)
cv::VideoCapture cap= cv::VideoCapture(0);
//2.一定要先設置採集格式!!!
cap.set(CV_CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
//3.然後再設置高清採集分辨率
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
結果:流暢地一筆,自己去感受