1. 程式人生 > >在Ubuntu系統中配置opencv2.4.10

在Ubuntu系統中配置opencv2.4.10

Ubuntu版本:Ubuntu 10.04.1 LTS

Opencv版本:opencv-2.4.10

Opencv官網:opencv.org

一、必要準備

1、從opencv.org下載你需要的opencv版本(本文下載的是2.4.10版本);

2、將其解壓並通過vmware tools拷貝至ubuntu系統的myworkspace目錄(根據各自喜好設定目錄);

3、安裝依賴包:

需要安裝如下的依賴包:

·        GCC4.4.x or later

·        CMake2.8.9 or higher

·        Git

·        GTK+2.xor higher, including headers (libgtk2.0-dev)

·        pkg-config

·        Python2.6 or later and Numpy 1.5 or later with developer packages (python-dev,python-numpy)

·        ffmpegor libav development packages: libavcodec-dev, libavformat-dev, libswscale-dev

·        [optional]libtbb2 libtbb-dev

·        [optional]libdc1394 2.x

·        [optional]libjpeg-dev, libpng-dev, libtiff-dev, libjasper-dev, libdc1394-22-dev

推薦cmake安裝高版本

Cmake高版本安裝方法:

#apt-get autoremove cmake #解除安裝之前的cmake(如果有安裝)

到cmake官網下載cmake原始碼

解壓

將解壓後的檔案拷貝至/usr/

# ln -s /usr/cmake-3.3.2/bin/* /usr/bin/

# cmake –version

cmake version 3.3.2

二、編譯opencv

1、 編譯opencv

(1)    

myworkspace# cd opencv-2.4.10

myworkspace# mkdir release  #不知為何要建立這個,本文編譯完後release裡面並沒任何東西

myworkspace# cd release

myworkspace# sudo cmake -DCMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local myworkspace/opencv-2.4.10

myworkspace# cd ../  #參考提供的是在release目錄下make,但是release目錄下並沒有makefile,故退回上級目錄

myworkspace# make

myworkspace# sudo make install

(2)   編譯會遇到的問題及解決方案

opencv-2.4.10/modules/core/src/system.cpp: In function '(staticinitializers for myworkspace/opencv-2.4.10/modules/core/src/system.cpp)': myworkspace/opencv-2.4.10/modules/core/src/system.cpp:280:10: error: inconsistent operandconstraints in an 'asm' make[3]: ***[modules/core/CMakeFiles/opencv_core.dir/src/system.cpp.o] Error 1

解決方案:

在modules/core/src/system.cpp檔案中

地278行新增"movl %%ebx,%1\n\t"

將第280行的:"=a"(cpuid_data[0]), "=b"(cpuid_data[1]),"=c"(cpuid_data[2]), "=d"(cpuid_data[3])

替換為:"=a"(cpuid_data[0]),"=r"(cpuid_data[1]), "=c"(cpuid_data[2]),"=d"(cpuid_data[3])

@@ -267,14 +267,17 @@ struct HWFeatures

          : "cc"

         );

         #else

+        // We need to preserve ebx since we are compiling PIC code.

+        // This means we cannot use "=b" for the 2nd output register.

asmvolatile

         (

"pushl %%ebx\n\t"

"movl $7,%%eax\n\t"

"movl $0,%%ecx\n\t"

"cpuid\n\t"

+         "movl %%ebx,%1\n\t"

"popl %%ebx\n\t"

-         : "=a"(cpuid_data[0]), "=b"(cpuid_data[1]), "=c"(cpuid_data[2]), "=d"(cpuid_data[3])

+         : "=a"(cpuid_data[0]), "=r"(cpuid_data[1]), "=c"(cpuid_data[2]), "=d"(cpuid_data[3])

          :

          : "cc"

         );

參考自:

                           ②

                           提示modules/highgui/src/ffmpeg_codecs.hpp或cap_ffmpeg_impl.hpp錯誤

解決方案:

這需要安裝ffmpeg。從網上下載ffmpeg原始碼,解壓到相應的目錄

#cd ffmpeg

# ./configure --enable-shared

這時可能會提示yasm nasm版本過舊

#sudo apt-get install yasm nasm #用這個命令解決

#make

#sudo make install

或者最直接的解決辦法:在cmake中新增引數-D WITH_FFMPEG=OFF

sudo cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_FFMPEG=OFF CMAKE_INSTALL_PREFIX=/usr/local myworkspace/opencv-2.4.10

參考自:

在編譯opencv 3.0 gold時,編譯到大約37%時,出現

../../lib/libopencv_core.so.3.0.0:undefined reference to `parallel_pthreads_set_threads_num(int)'
../../lib/libopencv_core.so.3.0.0: undefined reference to`parallel_pthreads_get_threads_num()'
../../lib/libopencv_core.so.3.0.0: undefined reference to`parallel_for_pthreads(cv::Range const&, cv::ParallelLoopBody const&,double)'
等好幾個錯誤,困擾了好久,經多次嘗試和不懈的堅持下,終於在github上找到了解決方法,現分享如下:

修改modules/core/src/parallel.cpp,新增7處刪除5處(+表示要新增,-表示要刪除)

132    namespace cv
133    {

134       ParallelLoopBody::~ParallelLoopBody() {}
135    +#if defined HAVE_PTHREADS&& HAVE_PTHREADS
136    +    voidparallel_for_pthreads(const cv::Range& range, constcv::ParallelLoopBody& body, double nstripes);
137    +    size_tparallel_pthreads_get_threads_num();
138    +    voidparallel_pthreads_set_threads_num(int num);
139    +#endif
140     }
141     
142    +
143    namespace
144    {
145    #ifdef CV_PARALLEL_FRAMEWORK
    .
    .
    .

307         }
308 
309    #elif definedHAVE_PTHREADS
   -        voidparallel_for_pthreads(const Range& range, const ParallelLoopBody& body,double nstripes);
310    +
311            parallel_for_pthreads(range,body, nstripes);
312 
313     #else
    .
    .
    .

367 
368    #elif definedHAVE_PTHREADS
369 
   -        size_tparallel_pthreads_get_threads_num();
    -
370         returnparallel_pthreads_get_threads_num();
371 
372    #else
.
.
.
428 
429    #elif definedHAVE_PTHREADS
430 
    -    voidparallel_pthreads_set_threads_num(int num);    
    -
431    parallel_pthreads_set_threads_num(threads);
432 

433   #endif

2、配置opencv引數

在/etc/ld.so.conf.d/opencv.conf檔案中加入一行:/usr/local/lib

如果沒有opencv.conf這個檔案,那就自己建立一個:

sudo vim /etc/ld.so.conf.d/opencv.conf

# sudo ldconfig

# sudo vim /etc/bash.bashrc

在檔案最後加入:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

三、測試opencv

#cp –R myworkspace/opencv-2.4.10/samples/c myworkspace

#cd myworkspace/c

# chmod +x build_all.sh

#./build_all.sh

# ./facedetect--cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml"--scale=1.5 lena.jpg

結果: