解決C++ openCV無法讀取視頻但是可以讀取圖像的問題記錄
C++代碼中使用 cv::VideoCapture 讀取視頻文件時,視頻文件路徑正確,依然無法讀取視頻。
我的發(fā)現(xiàn)并解決過程(簡易版):
1. 確保圖片可以正常讀取
路徑正確!
有讀取權(quán)限!
讀取圖像可以成功!
2. 檢查 OpenCV 編譯配置
確保 OpenCV 支持 MP4 格式的視頻解碼。你可以檢查 OpenCV 編譯時是否啟用了 FFmpeg:bash cv::getBuildInformation()
查看是否包含 FFmpeg,如果沒有,你可能需要重新編譯 OpenCV 支持 FFmpeg。
果然把上面的結(jié)果打印出來沒看到的FFmpeg相關(guān)的內(nèi)容,大概鎖定原因??赡苁菬o法讀取 MP4 文件的關(guān)鍵原因。在 OpenCV 中,MP4 文件的讀取通常依賴 FFmpeg 庫來進行解碼。
3. 解決方法1:重新編譯 OpenCV,啟用 FFmpeg
需要重新編譯 OpenCV,并確保包含 FFmpeg 支持。編譯步驟大致如下:
- 下載 FFmpeg 源碼并進行編譯,生成靜態(tài)或動態(tài)庫。
- 重新編譯 OpenCV 時,確保啟用了 FFmpeg 支持:
cmake -D CMAKE_BUILD_TYPE=Release \
-D CMAKE_TOOLCHAIN_FILE=<your_android_toolchain> \
-D WITH_FFMPEG=ON \
-D OPENCV_ENABLE_NONFREE=ON \
-D BUILD_opencv_videoio=ON \
-D BUILD_opencv_highgui=ON \
<other_flags> \
..確保 WITH_FFMPEG=ON,并且 BUILD_opencv_videoio=ON。
或在 CMakeLists.txt 中,指定 FFmpeg 的路徑:
cmake -DWITH_FFMPEG=ON -DFFMPEG_DIR=/path/to/ffmpeg ..
4. 解決方法2:檢查其他視頻 I/O 支持(不推薦)
如果不想重新編譯 OpenCV,的確有點麻煩。如果在Android平臺運行,則可以使用 Android 的原生 API(如 MediaPlayer 或 MediaCodec)來加載視頻,并將每一幀轉(zhuǎn)換為 OpenCV 可處理的格式(如 cv::Mat)。
5. 解決方法3:使用圖片序列替代視頻(不推薦)
如果不需要處理原始視頻,可以使用之前提到的圖片序列方案,將視頻轉(zhuǎn)換為幀圖片,再通過 OpenCV 逐幀讀取。
6. 解決方法4:使用特定格式的視頻文件(推薦!?。。?/h2>
OpenCV 可以處理不依賴 FFmpeg 的視頻格式,例如:
- MJPEG (Motion JPEG):這是一個簡單的編碼格式,基本上就是一組 JPEG 圖片組成的視頻流。(推薦直接用這個,直接可以預(yù)覽,文件也小,方便遷移)
- RAW 格式:如果你能將視頻轉(zhuǎn)碼為
AVI的 RAW 格式(沒有壓縮),那么 OpenCV 通常能夠直接讀取。(這個賊大,好不一定可以直接預(yù)覽,略不方便)
可以通過系統(tǒng)指令或者python腳本直接進行視頻格式的轉(zhuǎn)換,這樣你的avi視頻就可以直接被opencv讀取了而且不依賴FFmpeg。
下面我直接給出了Python轉(zhuǎn)視頻格式的例子:
可以借助 ffmpeg-python 庫將 MP4 格式的視頻轉(zhuǎn)換為 MJPEG 或 RAW AVI 格式。ffmpeg-python 是 FFmpeg 的 Python 封裝,提供了簡單的接口來調(diào)用 FFmpeg。
首先,需要安裝 ffmpeg-python 庫:
pip install ffmpeg-python
然后,可以使用以下 Python 代碼將 MP4 視頻轉(zhuǎn)換為 MJPEG 和 RAW AVI 格式:
轉(zhuǎn)換為 MJPEG 格式
import ffmpeg input_file = '/path/to/input.mp4' output_file_mjpeg = '/path/to/output_mjpeg.avi' ffmpeg.input(input_file).output(output_file_mjpeg, vcodec='mjpeg', qscale_v=2).run()
轉(zhuǎn)換為 RAW AVI 格式
import ffmpeg input_file = '/path/to/input.mp4' output_file_raw = '/path/to/output_raw.avi' ffmpeg.input(input_file).output(output_file_raw, vcodec='rawvideo', pix_fmt='yuv420p').run()
到此這篇關(guān)于解決C++ openCV無法讀取視頻但是可以讀取圖像的文章就介紹到這了,更多相關(guān)C++ openCV無法讀取視頻內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++利用stl set_difference對車輛進出區(qū)域進行判定
這篇文章主要介紹了set_difference,用于求兩個集合的差集,結(jié)果集合中包含所有屬于第一個集合但不屬于第二個集合的元素,需要的朋友可以參考下2017-03-03
C語言實現(xiàn)繪制LoveBeat愛心曲線的示例代碼
這篇文章主要為大家詳細介紹了如何溧陽C語言實現(xiàn)繪制LoveBeat愛心曲線,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2023-03-03
C語言數(shù)據(jù)結(jié)構(gòu)之動態(tài)分配實現(xiàn)串
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之動態(tài)分配實現(xiàn)串的相關(guān)資料,希望通過本文能幫助到大家,讓大家實現(xiàn)數(shù)據(jù)結(jié)構(gòu)中動態(tài)分配實現(xiàn)串的實例,需要的朋友可以參考下2017-10-10

