ubuntu(linux)下安装openCV(ffmpeg导致的编译不通过的解决办法)
關(guān)于這個(gè)問(wèn)題,網(wǎng)上有很多現(xiàn)成的方法,但是很多方法也都存在問(wèn)題,所以自己總結(jié)一下,把自己的安裝過(guò)程記錄下來(lái),也方便以后查閱。
1.需要的包:
????GCC 4.4.x 或更高
????CMake 2.8.7 或更高
????Git
????GTK+2.x 或更高,包括頭(libgtk2.0-dev)
????pkg-config
????Python 2.6 或以后,Numpy 1.5或以后,和開(kāi)發(fā)包(python-dev,python-numpy)
????ffmpeg 或者libav開(kāi)發(fā)包:libavcodec-dev, libavformat-dev, libswscale-dev
????可選包:libtbb2 ,libtbb-dev
????可選包:libdc1394 2.x? ?
????可選包:libjpeg-dev, libpng-dev, libtiff-dev, libjasper-dev, libdc1394-22-dev
(如果需要的包沒(méi)有安裝的話,openCV是沒(méi)法使用的,所以還是按步驟老老實(shí)實(shí)一個(gè)一個(gè)安裝把)
然后準(zhǔn)備工作做完了,接下來(lái)就是開(kāi)始安裝了。
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.利用終端進(jìn)入你解壓的opencV的包
4.新建build文件夾并進(jìn)入這個(gè)文件夾
mkdir build cd build5.配置opencV, cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
6.進(jìn)行編譯(這個(gè)過(guò)程話費(fèi)的時(shí)間比較長(zhǎng),可能有十分鐘到半個(gè)小時(shí))
make 7.安裝opencV庫(kù)到系統(tǒng) sudo make install這些步驟完成之后,一般opencV就可以使用了。
然后測(cè)試一下。
新建一個(gè)HelloWorld.cpp的源程序(為了保證程序的運(yùn)行,提前把測(cè)試圖片發(fā)到這個(gè)程序的同一個(gè)目錄下)
#include<stdio.h> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp>using namespace cv;int main( int argc, char** argv ) {if( argc != 2 )//判斷參數(shù)是否是兩個(gè){printf( " No image data \n " );return -1;}char* imageName = argv[1];Mat image;image = imread( imageName, 1 );//讀入圖片if( !image.data)//判斷是否有數(shù)據(jù){printf( " No image data \n " );return -1;}namedWindow( imageName, CV_WINDOW_AUTOSIZE );imshow( imageName, image );//顯示圖片waitKey(0);return 0; }新建CMakeList.txt文件如下(里面的參數(shù)是我的文件的名字,如果你文件的名字不同,也需要做相應(yīng)的更改。) 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
編譯完成之后就運(yùn)行它(把圖片作為參數(shù)傳遞進(jìn)函數(shù)) ./helloworld pitcure.jpg如果各項(xiàng)步驟等執(zhí)行正確的話,運(yùn)行程序,就可以看到顯示的圖片了。
可能遇到的問(wèn)題:
(1):報(bào)錯(cuò)如下:
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
從上面可以看出,編譯失敗了,主要原因是因?yàn)閒fmpeg這個(gè)東西的問(wèn)題(查了不少東西,這個(gè)ffmpeg好象是為了顯示視頻用的,有些人建議如果只用opencv做圖片開(kāi)發(fā),可以把這個(gè)卸載了。但是我覺(jué)得這樣做不保險(xiǎn),以后很有可能要操作視頻,到時(shí)候又會(huì)報(bào)錯(cuò)。所以這個(gè)方法不可取)
最后找了一個(gè)確實(shí)可行的解決方法,該報(bào)錯(cuò)的原因是因?yàn)閛pencv源碼里本來(lái)有bug,需要對(duì)opencv的源碼進(jìn)行更改,附上鏈接:
點(diǎn)擊打開(kāi)鏈接
具體的操作是,如果你用的是opencv3.0.0版本,那么修改文件
opencv-3.0.0/modules/videoio/src/cap_ffmpeg_impl.hpp,
除了在#define定義的后面的那個(gè)以外,把剩下所有的AVCodecID用CV_CODEC_ID替換。
(2):報(bào)錯(cuò)如下:
/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;
這個(gè)包括是因?yàn)镃UDA的問(wèn)題,嘗試改一處源碼就可以了。
在graphcut.cpp文件中,將
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)
改為
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)
就可以了。
總結(jié)
以上是生活随笔為你收集整理的ubuntu(linux)下安装openCV(ffmpeg导致的编译不通过的解决办法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java中利用socket实现简单的服务
- 下一篇: caffe安装,编译(包括CUDA和cu