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 build5.配置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导致的编译不通过的解决办法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中利用socket实现简单的服务
- 下一篇: caffe安装,编译(包括CUDA和cu