轉載請注明出處:
http://www.cnblogs.com/darkknightzh/p/5638117.html
參考網址:
http://www.cnblogs.com/jeakon/archive/2013/05/08/3066469.html
http://my.oschina.net/u/1757926/blog/293976
1 預先安裝一些軟件:
sudo apt-get install build-essential cmake libgtk2.0-dev pkg-config python-dev python-numpy libavcodec-dev libavformat-dev libswscale-dev
2 去管網下載opencv壓縮包
3 解壓壓縮包到某文件夾(用windows習慣了,直接右鍵提取到此處。。。)
4 command中cd到該解壓縮的文件夾中,然后創建build文件夾 mkdir build
5 進入build目錄 cd build
6 編譯opencv源碼
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
====================================================
161107更新:
1). 更新了cuda8.0之后,opencv重新安裝時,提示:
Unsupported gpu architecture 'compute_11'
http://stackoverflow.com/questions/28010399/build-opencv-with-cuda-support指出,上面的命令換成
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler ..
便可以解決該問題。
http://www.th7.cn/system/lin/201702/203301.shtml
中指出,可以設置為自動識別:
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Auto ..
2). 上面可以過去,之后還是會有錯誤:
graphcuts.cpp error 'NppGraphCutState' has not been declared
按照https://kangkang113.wordpress.com/2016/09/02/deep-learning-framework-using-gtx1080ubuntu16-04/中的說明,需要修改源代碼,進入graphcuts.cpp(位置opencv-2.4.11/modules/gpu/src/graphcuts.cpp),然把45行改成
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION>=8000)
之后便可以編譯成功。
3). 編譯中會有很多warning,如:
/home/opencv-2.4.11/modules/core/include/opencv2/core/cuda_devptrs.hpp:147:17: warning: ‘template<class T> struct cv::gpu::DevMem2D_’ is deprecated [-Wdeprecated-declarations] typedef DevMem2D_<unsigned char> DevMem2Db; ^ /home/opencv-2.4.11/modules/core/include/opencv2/core/cuda_devptrs.hpp:138:61: note: declared here template <typename T> struct __CV_GPU_DEPR_BEFORE__ DevMem2D_ : public
暫時沒管這些wanring。
161107更新結束
170121更新:
今天裝了opencv2.4.13,上面2).中的地方已經修改了,因而不需要再修改了。
170121更新結束
====================================================
170620更新:
在安裝了anaconda,而且默認g++變成了anaconda中的g++之后,會提示:
/usr/bin/ld: /home/XXX/anaconda2/bin/../lib/gcc/x86_64-unknown-linux-gnu/5.4.0/crtbeginS.o:unrecognized relocation(0x2a) in section `.text' /usr/bin/ld: final link failed: Bad value collect2: error: ld returned 1 exit status
上面的錯誤見:http://www.cnblogs.com/darkknightzh/p/6950263.html
主要是anaconda的問題吧。。。此處使用cmake,因而需要將c++編譯器改成系統自帶的,使用CMAKE_C_COMPILER及CMAKE_CXX_COMPILER這兩個來設定cmake使用的c及c++編譯器(http://blog.csdn.net/10km/article/details/50444715),具體代碼如下(結合了161107中的更新):
cmake -D CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/g++-4.9 -D CMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc-4.9 -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Auto ..
使用上述命令后,編譯opencv成功了。折騰人啊。。。
170620更新結束
====================================================
7 安裝
sudo make install
測試:
1. 寫helloworld.cpp
#include <opencv2/opencv.hpp> using namespace cv; #include <stdio.h> int main( int argc, char** argv ) { if( argc != 2 )//判斷參數是否是兩個 { printf( " No image data \n " ); return -1; } char* imageName = argv[1]; Mat 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; }
2. 寫cmake的makefile,即CMakeLists.txt
cmake_minimum_required(VERSION 2.8) project(helloworld) add_executable(helloworld helloworld.cpp) find_package(OpenCV REQUIRED) target_link_libraries(helloworld ${OpenCV_LIBS})
=======================================================================================
170121更新:
剛才編譯opencv2.4.13,之后編譯該程序時,提示:
cannot find -lopencv_dep_cudart
https://github.com/opencv/opencv/issues/6542中指出,在cmake時,加上-D CUDA_USE_STATIC_CUDA_RUNTIME=OFF
(開始我以為是編譯opencv時候加上這句,結果編譯這個測試程序還是有問題。后來才意識到,是編譯這個測試程序時加上這句才對。)
另一種解決方法就是,如http://stackoverflow.com/questions/41608111/cannot-find-lib-libopencv-dep-cudart中指出的,在上面的CMakeLists.txt中find_package(OpenCV REQUIRED)之前加上:
set(CUDA_USE_STATIC_CUDA_RUNTIME OFF)
之后按照后續的繼續編譯,也可以成功。
http://code.opencv.org/issues/2166中指出,由於gpumat (.hpp, .cpp)在revision #6957已經被移到opencv_core中,因而編譯OpenCV with CUDA enabled時,即便工程不使用cuda,每個工程仍舊需要npp (npp32_42_9.dll, 50MB) 和 cudart (cudart32_42_9.dll) dll(這個應該是windows上面的,linux應該就是so了),
170121更新結束
=======================================================================================
3. 進入該文件夾,創建build,mkdir build
4. 之后:
cmake ..
make
得到可執行文件 helloworld
5. 拷貝一張圖像到該可執行文件文件夾中,輸入
./helloworld 11.jpg
顯示圖像,說明安裝成功
ps:
1. 之前未使用步驟1,結果編譯沒錯,運行后,提示
OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in cvNamedWindow, file /home/XXX/file/program/opencv2411/modules/highgui/src/window.cpp, line 483 terminate called after throwing an instance of 'cv::Exception'
執行步驟1並重新編譯了opencv之后,運行便顯示圖像了(感覺不需要所有的庫都裝上去,但是還是都裝了)。
2. 如果提示沒有安裝cmake的話,安裝一下cmake
3. 第6步中,/usr/local ..這樣用就行了。開始一直以為這個是自己設置的目錄,結果怎么編譯都提示沒有文件夾(對linux真心不熟)。。。
4. 如果使用NetBeans IDE的話,
不執行步驟1編譯沒錯,運行時會有如下錯誤:
編譯完之后,需要設置連接器中的庫:
庫目錄如下:
添加opencv的庫:
本來左側是沒有那一串的,點擊“添加PkgConfig庫”
出現如下界面,點擊“opencv”
最終庫里面如下(下圖中應該還有庫目錄的設置,首先截的是這個圖,所以沒有):
編譯后可成功運行。
並未像參考網址中那樣,設置libiary等,但是可能那樣以后會方便吧。