Ubuntu20.04下配置OpenCV2.4.13
-
- 一、安裝OpenCV及相關依賴
- 二、編譯安裝
-
- 1. cmake
-
- (3)設定OpenCV環境變量(很重要!無論采用哪種編譯方法都需要設定)
- 2. Command Line(運作測試)
環境如标題
參考文章:
https://blog.csdn.net/surgewong/article/details/39078251 【Ubuntu12安裝OpenCV2】
https://www.cnblogs.com/woshijpf/p/3840530.html 【linux下編譯OpenCV的方法】
https://stackoverflow.com/questions/45135/why-does-the-order-in-which-libraries-are-linked-sometimes-cause-errors-in-gcc/409470#409470 【gcc/g++編譯詳解】
你的點贊和評論對我真的很重要!!
一、安裝OpenCV及相關依賴
1.OpenCV安裝包,https://opencv.org/releases/page/3/
在該頁面找到2.4.13,下載下傳并解壓到目錄
2.build-essential 軟體包為編譯程式提供必需軟體包的清單資訊,如頭檔案與庫函數位置,并安裝gcc/g++/gdb/make 等基本程式設計工具
sudo apt-get install build-essential
3.以下依賴用于支援讀寫圖檔以及視訊
sudo apt-get install libgtk2.0-dev libavcodec-dev libavformat-dev libtiff4-dev libswscale-dev libjasper-dev
4.安裝cmake
sudo apt-get install cmake
5.安裝pkg-config,用于提供從源代碼中編譯軟體時查詢已安裝的庫時使用的統一接口
sudo apt-get install pkg-config
補充
你可能會遇到如下問題
-
安裝依賴時提示
參考文章:https://blog.csdn.net/Collin_D/article/details/109067301
unable to locate libjasper-dev
解決方案:更新倉庫源
sudo add-apt-repository "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe"
sudo apt update
sudo apt install libjasper1 libjasper-dev
-
出現以下錯誤
參考文章:https://stackoverflow.com/questions/46884682/error-in-building-opencv-with-ffmpeg
error: ‘CODEC_FLAG_GLOBAL_HEADER’ was not declared in this scope c->flags |= CODEC_FLAG_GLOBAL_HEADER;
……
解決方案:這是由于OpenCV的版本更新,預編譯常量命名變化而導緻的,是以需要你在OpenCV安裝目錄下找到cap_ffmpeg_impl.hpp,并在頭部添加如下代碼
#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020
二、編譯安裝
據參考文章3可知,運作OpenCV主要有兩種方法,CMake(一般用這個)和Command Line (可用于編譯樣例,檢測OpenCV安裝情況)。
1. cmake
(1)使用cmake來檢測編譯環境以及生成makefile以及其他project資訊
cd opencv_dir
mkdir build //一般為命名為build或release
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
//CMAKE_BUILD_TYPE=RELEASE保證産生的makefile檔案make生成的可執行檔案帶有調試資訊,供gdb和gdbserver使用
//CMAKE_INSTALL_PREFIX設定編譯路徑
(2)make編譯并安裝
make -j$(nproc) //單純make會很慢,$(nproc)指令表示能參與編譯的最大核心線程數
//也可以自定義線程數如,make -j16
sudo make install
(3)設定OpenCV環境變量(很重要!無論采用哪種編譯方法都需要設定)
設定pkg-config的OpenCV庫路徑
export PKG_CONFIG_PATH=/..../OpenCV-dir/build/unix-install
//或者 export PKG_CONFIG_LIBDIR=/..../OpenCV-dir/build/unix-install
//LIBDIR環境變量優先級更高,一般用PATH設定即可
//該路徑包含了opencv.pc檔案,其中包含了頭檔案位置、庫檔案位置等資訊
如果該目錄下沒有該檔案則需要手動建立并配置,方法如下
cd /usr/local/lib
sudo mkdir pkgconfig
cd pkgconfig
sudo touch opencv.pc
sudo vi opencv.pc //vi、vim、gedit都行,愛用哪個用哪個
添加如下資訊
# Package Information for pkg-config
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 2.4.13.6
Libs: -L${exec_prefix}/lib -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab -lrt -lpthread -lm -ldl
Cflags: -I${includedir_old} -I${includedir_new}
儲存并退出,導入環境變量
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
ps:導入環境變量的方法有很多,本文已經很長了,就不詳細介紹了,簡單提一下:
(1)直接導入庫路徑配置檔案,在/etc/ld.so.conf.d下添加opencv.conf,并寫入/usr/local/lib
(2)配置全局變量,在/etc/profile檔案末尾追加
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
然後更新環境變量
source /etc/profile
(3)配置使用者本地變量,在/etc/bash.bashrc檔案末尾追加
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
然後更新環境變量
source /etc/profile
最後,更新系統庫緩存
ldconfig
檢視opencv是否配置成功
pkg-config --cflags opencv
pkg-config --libs opencv
2. Command Line(運作測試)
切換到OpenCV-dir/samples/c/(或者cpp)
(1)簡單方案,編譯所有樣例
cd /.../opencv_dir/samples/c/
cd ./build_all.sh //編譯所有樣例
cd ./find_obj
即可看到下圖
(2)僅編譯某個樣例,使用如下的指令編譯運作即可:
gcc -ggdb xxx.c -o xxx `pkg-config --cflags --libs opencv` //若檔案為.c
g++ -ggdb xxx.cpp -o xxx `pkg-config --cflags --libs opencv` //若檔案為.cpp
./xxx
-o 生成對象檔案,其後緊跟要生成的對象檔案名;
–cflags 引入各種頭檔案位置;
–libs 引入動态連結庫;
另外,應當注意,gcc/g++采用比較嚴格的指令執行順序(從左向右)。在最近的發行版本中,都預設使用了–as-needed參數,強制要求程式的對象檔案必須出現在動态庫之前并且它并不會因為參數順序不對而報錯,是以隻有當-libs參數在xxx.cpp後時程式才能正常執行。
也就是說,以g++為例
g++ -ggdb `pkg-config --cflags --libs opencv` xxx.cpp -o xxx //錯誤
g++ -ggdb `pkg-config --cflags opencv` xxx.cpp -o xxx `pkg-config --libs opencv` //正确
g++ -ggdb xxx.cpp -o xxx `pkg-config --cflags --libs opencv` //正确