解決C++ openCV無法讀取視頻但是可以讀取圖像的問題記錄
C++代碼中使用 cv::VideoCapture
讀取視頻文件時(shí),視頻文件路徑正確,依然無法讀取視頻。
我的發(fā)現(xiàn)并解決過程(簡(jiǎn)易版):
1. 確保圖片可以正常讀取
路徑正確!
有讀取權(quán)限!
讀取圖像可以成功!
2. 檢查 OpenCV 編譯配置
確保 OpenCV 支持 MP4 格式的視頻解碼。你可以檢查 OpenCV 編譯時(shí)是否啟用了 FFmpeg:bash cv::getBuildInformation()
查看是否包含 FFmpeg
,如果沒有,你可能需要重新編譯 OpenCV 支持 FFmpeg。
果然把上面的結(jié)果打印出來沒看到的FFmpeg相關(guān)的內(nèi)容,大概鎖定原因??赡苁菬o法讀取 MP4 文件的關(guān)鍵原因。在 OpenCV 中,MP4 文件的讀取通常依賴 FFmpeg 庫(kù)來進(jìn)行解碼。
3. 解決方法1:重新編譯 OpenCV,啟用 FFmpeg
需要重新編譯 OpenCV,并確保包含 FFmpeg 支持。編譯步驟大致如下:
- 下載 FFmpeg 源碼并進(jìn)行編譯,生成靜態(tài)或動(dòng)態(tài)庫(kù)。
- 重新編譯 OpenCV 時(shí),確保啟用了 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,的確有點(diǎn)麻煩。如果在Android平臺(tái)運(yùn)行,則可以使用 Android 的原生 API(如 MediaPlayer
或 MediaCodec
)來加載視頻,并將每一幀轉(zhuǎn)換為 OpenCV 可處理的格式(如 cv::Mat
)。
5. 解決方法3:使用圖片序列替代視頻(不推薦)
如果不需要處理原始視頻,可以使用之前提到的圖片序列方案,將視頻轉(zhuǎn)換為幀圖片,再通過 OpenCV 逐幀讀取。
6. 解決方法4:使用特定格式的視頻文件(推薦?。。。?/h2>
OpenCV 可以處理不依賴 FFmpeg 的視頻格式,例如:
- MJPEG (Motion JPEG):這是一個(gè)簡(jiǎn)單的編碼格式,基本上就是一組 JPEG 圖片組成的視頻流。(推薦直接用這個(gè),直接可以預(yù)覽,文件也小,方便遷移)
- RAW 格式:如果你能將視頻轉(zhuǎn)碼為
AVI
的 RAW 格式(沒有壓縮),那么 OpenCV 通常能夠直接讀取。(這個(gè)賊大,好不一定可以直接預(yù)覽,略不方便)
可以通過系統(tǒng)指令或者python腳本直接進(jìn)行視頻格式的轉(zhuǎn)換,這樣你的avi視頻就可以直接被opencv讀取了而且不依賴FFmpeg。
下面我直接給出了Python轉(zhuǎn)視頻格式的例子:
可以借助 ffmpeg-python
庫(kù)將 MP4 格式的視頻轉(zhuǎn)換為 MJPEG 或 RAW AVI 格式。ffmpeg-python
是 FFmpeg 的 Python 封裝,提供了簡(jiǎn)單的接口來調(diào)用 FFmpeg。
首先,需要安裝 ffmpeg-python
庫(kù):
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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
DSP中浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算--舉例及編程中的心得
本文主要講解DSP浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算舉例及編程中的心得 ,具有參考價(jià)值,需要的朋友可以參考一下。2016-06-06Linux下實(shí)現(xiàn)C++操作Mysql數(shù)據(jù)庫(kù)
由于工作需要抽出一周的時(shí)間來研究C/C++訪問各種數(shù)據(jù)庫(kù)的方法,并打算封裝一套數(shù)據(jù)庫(kù)操作類,現(xiàn)在奉上最簡(jiǎn)單的一部分:在Linux下訪問MySQL數(shù)據(jù)庫(kù)。2017-05-05C語言使用strcmp()函數(shù)比較兩個(gè)字符串的實(shí)現(xiàn)
這篇文章主要介紹了C語言使用strcmp()函數(shù)比較兩個(gè)字符串的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01C語言編程數(shù)據(jù)結(jié)構(gòu)線性表之順序表和鏈表原理分析
本篇文章是C語言編程篇主要為大家介紹了C語言編程中的數(shù)據(jù)結(jié)構(gòu)線性表,文中附含豐富的圖文示例代碼為大家詳解了線性表中的順序表和鏈表,有需要的朋友可以借鑒參考下2021-09-09Cocos2d-x UI開發(fā)之CCControlButton控件類實(shí)例
這篇文章主要介紹了Cocos2d-x UI開發(fā)之CCControlButton控件類實(shí)例,本文代碼中包含大量注釋來講解CCControlButton控件類的使用,需要的朋友可以參考下2014-09-09C++實(shí)現(xiàn)LeetCode(31.下一個(gè)排列)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(31.下一個(gè)排列),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07一篇文章讓你輕松理解C++中vector和list區(qū)別
對(duì)于學(xué)c語言的同學(xué)來說,vector和list這兩個(gè)東西經(jīng)常會(huì)搞錯(cuò),下面這篇文章主要給大家介紹了關(guān)于C++中vector和list區(qū)別的相關(guān)資料,需要的朋友可以參考下2022-01-01