日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

ubuntu(linux)下安装openCV(ffmpeg导致的编译不通过的解决办法)

發布時間:2025/3/21 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ubuntu(linux)下安装openCV(ffmpeg导致的编译不通过的解决办法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于這個問題,網上有很多現成的方法,但是很多方法也都存在問題,所以自己總結一下,把自己的安裝過程記錄下來,也方便以后查閱。

1.需要的包:

????GCC 4.4.x 或更高

????CMake 2.8.7 或更高

????Git

????GTK+2.x 或更高,包括頭(libgtk2.0-dev)

????pkg-config

????Python 2.6 或以后,Numpy 1.5或以后,和開發包(python-dev,python-numpy)

????ffmpeg 或者libav開發包:libavcodec-dev, libavformat-dev, libswscale-dev

????可選包:libtbb2 ,libtbb-dev

????可選包:libdc1394 2.x? ?

????可選包:libjpeg-dev, libpng-dev, libtiff-dev, libjasper-dev, libdc1394-22-dev

(如果需要的包沒有安裝的話,openCV是沒法使用的,所以還是按步驟老老實實一個一個安裝把)

然后準備工作做完了,接下來就是開始安裝了。

1.

sudo apt-get install build-essential <pre class="brush:shell;toolbar: true; auto-links: false;"><code class="hljs q">sudo?apt-<span class="hljs-built_in">get</span>?install?cmake?git?libgtk2.0-<span class="hljs-built_in">dev</span>?pkg-config?libavcodec-<span class="hljs-built_in">dev</span>?libavformat-<span class="hljs-built_in">dev</span>?libswscale-<span class="hljs-built_in">dev</span></code>

2.下載opencV壓縮包,并解壓到你需要的位置

3.利用終端進入你解壓的opencV的包

4.新建build文件夾并進入這個文件夾

mkdir build cd build
5.配置opencV,

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

6.進行編譯(這個過程話費的時間比較長,可能有十分鐘到半個小時)

make 7.安裝opencV庫到系統

sudo make install

這些步驟完成之后,一般opencV就可以使用了。

然后測試一下。

新建一個HelloWorld.cpp的源程序(為了保證程序的運行,提前把測試圖片發到這個程序的同一個目錄下)

#include<stdio.h> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp>using namespace cv;int main( int argc, char** argv ) {if( argc != 2 )//判斷參數是否是兩個{printf( " No image data \n " );return -1;}char* imageName = argv[1];Mat image;image = imread( imageName, 1 );//讀入圖片if( !image.data)//判斷是否有數據{printf( " No image data \n " );return -1;}namedWindow( imageName, CV_WINDOW_AUTOSIZE );imshow( imageName, image );//顯示圖片waitKey(0);return 0; }
新建CMakeList.txt文件如下(里面的參數是我的文件的名字,如果你文件的名字不同,也需要做相應的更改。)

cmake_minimum_required(VERSION 2.8) project(helloworld) add_executable(helloworld HelloWorld.cpp) find_package(OpenCV REQUIRED) target_link_libraries(helloworld ${OpenCV_LIBS} 然后就可以編譯 mkdir build cd build cmkae .. make
編譯完成之后就運行它(把圖片作為參數傳遞進函數)

./helloworld pitcure.jpg如果各項步驟等執行正確的話,運行程序,就可以看到顯示的圖片了。



可能遇到的問題:

(1):報錯如下:

In file included from /home/cuizhiyan/code/opencv-3.0.0/modules/videoio/src/cap_ffmpeg.cpp:45:0:
/home/cuizhiyan/code/opencv-3.0.0/modules/videoio/src/cap_ffmpeg_impl.hpp:1174:0: warning: "CV_CODEC_ID" redefined
?#define ? ?CV_CODEC_ID c_id = c->codec_id;
?^
/home/cuizhiyan/code/opencv-3.0.0/modules/videoio/src/cap_ffmpeg_impl.hpp:162:0: note: this is the location of the previous definition
?# ?define CV_CODEC_ID AVCodecID
?^
In file included from /home/cuizhiyan/code/opencv-3.0.0/modules/videoio/src/cap_ffmpeg.cpp:45:0:
/home/cuizhiyan/code/opencv-3.0.0/modules/videoio/src/cap_ffmpeg_impl.hpp:1556:0: warning: "static" redefined
?#define static inline bool cv_ff_codec_tag_list_match(const AVCodecTag *const *
?^
/home/cuizhiyan/code/opencv-3.0.0/modules/videoio/src/cap_ffmpeg_impl.hpp:1546:0: note: this is the location of the previous definition
?#define static inline bool cv_ff_codec_tag_match(const AVCodecTag *tags, enum C
?^
In file included from /home/cuizhiyan/code/opencv-3.0.0/modules/videoio/src/cap_ffmpeg.cpp:45:0:
/home/cuizhiyan/code/opencv-3.0.0/modules/videoio/src/cap_ffmpeg_impl.hpp: In function ‘AVStream* icv_add_video_stream_FFMPEG(AVFormatContext*, AVCodecID, int, int, int, double, int)’:
/home/cuizhiyan/code/opencv-3.0.0/modules/videoio/src/cap_ffmpeg_impl.hpp:1177:19: error: ‘c_id’ was not declared in this scope
? ? ?c->codec_id = c_id;
? ? ? ? ? ? ? ? ? ?^
In file included from /home/cuizhiyan/code/opencv-3.0.0/modules/videoio/src/cap_ffmpeg.cpp:45:0:
/home/cuizhiyan/code/opencv-3.0.0/modules/videoio/src/cap_ffmpeg_impl.hpp: At global scope:
/home/cuizhiyan/code/opencv-3.0.0/modules/videoio/src/cap_ffmpeg_impl.hpp:1547:1: error: expected unqualified-id before ‘{’ token
?{
?^
In file included from /home/cuizhiyan/code/opencv-3.0.0/modules/videoio/src/cap_ffmpeg.cpp:45:0:
/home/cuizhiyan/code/opencv-3.0.0/modules/videoio/src/cap_ffmpeg_impl.hpp:1023:21: warning: ‘const char* icvFFMPEGErrStr(int)’ defined but not used [-Wunused-function]
?static const char * icvFFMPEGErrStr(int err)
? ? ? ? ? ? ? ? ? ? ?^
/home/cuizhiyan/code/opencv-3.0.0/modules/videoio/src/cap_ffmpeg_impl.hpp:1104:18: warning: ‘AVFrame* icv_alloc_picture_FFMPEG(int, int, int, bool)’ defined but not used [-Wunused-function]
?static AVFrame * icv_alloc_picture_FFMPEG(int pix_fmt, int width, int height, b
? ? ? ? ? ? ? ? ? ^
/home/cuizhiyan/code/opencv-3.0.0/modules/videoio/src/cap_ffmpeg_impl.hpp:1130:18: warning: ‘AVStream* icv_add_video_stream_FFMPEG(AVFormatContext*, AVCodecID, int, int, int, double, int)’ defined but not used [-Wunused-function]
?static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc,
? ? ? ? ? ? ? ? ? ^
modules/videoio/CMakeFiles/opencv_videoio.dir/build.make:182: recipe for target 'modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_ffmpeg.cpp.o' failed
make[2]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_ffmpeg.cpp.o] Error 1
CMakeFiles/Makefile2:6727: recipe for target 'modules/videoio/CMakeFiles/opencv_videoio.dir/all' failed
make[1]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/all] Error 2
Makefile:149: recipe for target 'all' failed
make: *** [all] Error 2



從上面可以看出,編譯失敗了,主要原因是因為ffmpeg這個東西的問題(查了不少東西,這個ffmpeg好象是為了顯示視頻用的,有些人建議如果只用opencv做圖片開發,可以把這個卸載了。但是我覺得這樣做不保險,以后很有可能要操作視頻,到時候又會報錯。所以這個方法不可取)

最后找了一個確實可行的解決方法,該報錯的原因是因為opencv源碼里本來有bug,需要對opencv的源碼進行更改,附上鏈接:

點擊打開鏈接

具體的操作是,如果你用的是opencv3.0.0版本,那么修改文件

opencv-3.0.0/modules/videoio/src/cap_ffmpeg_impl.hpp,

除了在#define定義的后面的那個以外,把剩下所有的AVCodecID用CV_CODEC_ID替換。


(2):報錯如下:

/home/usrname/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:120:54: error: ‘NppiGraphcutState’ has not been declared

typedef NppStatus (*init_func_t)(NppiSize oSize, NppiGraphcutState** ppStat

^/home/usrname/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:135:18: error: ‘NppiGraphcutState’ does not name a type

operator NppiGraphcutState*() ^/home/usrname/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:141:9:

error: ‘NppiGraphcutState’ does not name a type NppiGraphcutState* pState;



這個包括是因為CUDA的問題,嘗試改一處源碼就可以了。

在graphcut.cpp文件中,將

#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)

改為

#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)

就可以了。


總結

以上是生活随笔為你收集整理的ubuntu(linux)下安装openCV(ffmpeg导致的编译不通过的解决办法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。