opencv无获取摄像头视频帧(YUV打开导致失败)
最近由于項目的原因,有一臺工控機在沒有打永恒之藍補丁之前,應用程序使用opencv 3.4.1打開攝像頭后顯示視頻內容都可以正常顯示,但當安裝完windows 7 x86永恒之藍補丁后(KB4012215,KB4012212),應用程序無法正常顯示攝像頭的視頻,表現為:OPENCV打開攝像頭成功,但獲取攝像頭視頻幀得到的數據為空,使用AMCAP2.exe進行測試攝像頭,使用MJPG格式可以正常瀏覽,但把視頻設置為YUV的格式后也無法預覽。
于是想到把OPENCV設置為MJPG方式打開攝像頭進行處理,卻同樣無法預覽,測試代碼如下:
經過多個版本的嘗試依然沒有解決問題,最終想到要不進行調試一步步進行跟進,就使用opencv3.0.0的debug版本進行調試(為什么使用opencv3.0.0,原因是由于這個版本比較老,原想這個問題會不會是新版本的問題,舊版本會不會沒有這個問題呢),在調試過程中,終端程序在打開攝像頭時發現輸出信息顯示" trying format YUV2…"等,后面就沒有見到有mjpg格式了,心想明明是設置了mjpg,為什么還是使用yuv方式打開,進行翻查opencv代碼,最終找到opencv在打開攝像頭時會進行每一種編碼方式嘗試打開,并且是按順序進行,當某一種方式打開成功后就不會再嘗試別的方式打開,opencv打開攝像頭的方式:
//-------------------------cap_dshow.cpp : int videoInput::start(int deviceID, videoDevice *VD) getMediaSubtypeAsString(mediaSubtypes[i], guidStr);---------char guidStr[8];// try specified format and sizegetMediaSubtypeAsString(VD->tryVideoType, guidStr);DebugPrintOut("SETUP: trying specified format %s @ %ix%i\n", guidStr, VD->tryWidth, VD->tryHeight);if( setSizeAndSubtype(VD, VD->tryWidth, VD->tryHeight, VD->tryVideoType) ){VD->setSize(VD->tryWidth, VD->tryHeight);VD->videoType = VD->tryVideoType;foundSize = true;} else {// try specified size with all formatsfor(int i = 0; i < VI_NUM_TYPES; i++){getMediaSubtypeAsString(mediaSubtypes[i], guidStr);DebugPrintOut("SETUP: trying format %s @ %ix%i\n", guidStr, VD->tryWidth, VD->tryHeight);if( setSizeAndSubtype(VD, VD->tryWidth, VD->tryHeight, mediaSubtypes[i]) ){VD->setSize(VD->tryWidth, VD->tryHeight);VD->videoType = mediaSubtypes[i];foundSize = true;break;}}} //-------------------------cap_dshow.cpp : videoInput::videoInput(){---------mediaSubtypes[0] = MEDIASUBTYPE_RGB24;mediaSubtypes[1] = MEDIASUBTYPE_RGB32;mediaSubtypes[2] = MEDIASUBTYPE_RGB555;mediaSubtypes[3] = MEDIASUBTYPE_RGB565;mediaSubtypes[4] = MEDIASUBTYPE_YUY2;mediaSubtypes[5] = MEDIASUBTYPE_YVYU;mediaSubtypes[6] = MEDIASUBTYPE_YUYV;mediaSubtypes[7] = MEDIASUBTYPE_IYUV;mediaSubtypes[8] = MEDIASUBTYPE_UYVY;mediaSubtypes[9] = MEDIASUBTYPE_YV12;mediaSubtypes[10] = MEDIASUBTYPE_YVU9;mediaSubtypes[11] = MEDIASUBTYPE_Y411;mediaSubtypes[12] = MEDIASUBTYPE_Y41P;mediaSubtypes[13] = MEDIASUBTYPE_Y211;mediaSubtypes[14] = MEDIASUBTYPE_AYUV;mediaSubtypes[15] = MEDIASUBTYPE_MJPG; // MGB 原位置當YUV打開成功后,使用的攝像頭的數據格式就會停止,因此就會使用yuv進行打開,但此時系統無法使用YUV讀取攝像頭數據,因而導致無法顯示視頻。
為了解決此問題,無法從windows 7 32位系統分析解決,因此使用修改opencv打開視頻格式的方式解決了此問題,把打開的視頻數據格式修改為以下順序:mediaSubtypes[15] = MEDIASUBTYPE_MJPG;----- >mediaSubtypes[4] = MEDIASUBTYPE_MJPG;:
總結:
1.opencv存在一定的問題,無法通過接口設置其打開視頻的格式
2.windows 7 32位更新永恒之藍補丁后導致無法預覽攝像頭數據(YUV格式),找了兩天都沒有找到原因,此問題在另一個系統的windows 7 32下又沒有問題(補丁更新的數量不一樣,除了永恒之藍補丁外,還更新了其他補丁),給我的感覺是由于永恒之藍補丁導致當前系統的directx無法兼容所致,由于時間比較緊急,打過電話給微軟,微軟卻說不是他們系統的問題,應該找一下設備應用程序開發商分析問題,工控機廠商也沒有辦法一時解決此問題。
總結
以上是生活随笔為你收集整理的opencv无获取摄像头视频帧(YUV打开导致失败)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 都有哪些查找和下载英文文献的方法?
- 下一篇: python毕业设计作品基于django