目錄
一、源碼下載
二、源碼編譯
??????? 2.1 OpenCV源碼下載
??????? 2.2 cmake安裝(非必要)
????????2.3 opencv安裝依賴及支持模塊查看
??????? 2.4 安裝pkgconfig包
??????? 2.5 安裝opencv依賴包
??????? 2.6 真正安裝opencv包開始
??????? 2.7 opencv環(huán)境路徑配置
三、案例測試
??????? 3.1 案例設(shè)計(jì)
??????? 3.2 編譯測試
一、源碼下載
??????? opencv可以在官網(wǎng)(Courses - OpenCV)、github、gitee下載源碼編譯自己所需要的特定功能的庫,也可以在SourceForge獲得已經(jīng)編譯好的庫直接應(yīng)用。
??????? gitee鏡像:opencv: Open Source Computer Vision Library
??????? 建議用國內(nèi)鏡像:git clone git@gitee.com:mirrors/opencv.git
??????? cmake下載:Index of /files,自行下載需要的版本,不同的opencv版本編譯需要不同的cmake版本要求,建議2.8.12以上,這是opecv42的版本。
二、源碼編譯
??????? 2.1 OpenCV源碼下載
????????本文采用的是vmware15安裝了centos7的Linux系統(tǒng),預(yù)先安裝好了git工具。進(jìn)入系統(tǒng)內(nèi),打開命令工具,下載源碼:
git clone git@gitee.com:mirrors/opencv.git
git clone git@gitee.com:cubone/opencv_contrib.git
??????? 源碼下載完成后,進(jìn)入opencv目錄,打開CmakeLists.txt,可以看到不同opencv版本所需要的cmake版本要求:
#
# Configure CMake policies
#
if(POLICY CMP0026)
cmake_policy(SET CMP0026 NEW)
endif()
if(POLICY CMP0042)
cmake_policy(SET CMP0042 NEW) # CMake 3.0+ (2.8.12): MacOS "@rpath" in target's install name
endif()
if(POLICY CMP0046)
cmake_policy(SET CMP0046 NEW) # warn about non-existed dependencies
endif()
if(POLICY CMP0051)
cmake_policy(SET CMP0051 NEW)
endif()
if(POLICY CMP0054) # CMake 3.1: Only interpret if() arguments as variables or keywords when unquoted.
cmake_policy(SET CMP0054 NEW)
endif()
if(POLICY CMP0056)
cmake_policy(SET CMP0056 NEW) # try_compile(): link flags
endif()
if(POLICY CMP0066)
cmake_policy(SET CMP0066 NEW) # CMake 3.7: try_compile(): use per-config flags, like CMAKE_CXX_FLAGS_RELEASE
endif()
if(POLICY CMP0067)
cmake_policy(SET CMP0067 NEW) # CMake 3.8: try_compile(): honor language standard variables (like C++11)
endif()
if(POLICY CMP0068)
cmake_policy(SET CMP0068 NEW) # CMake 3.9+: `RPATH` settings on macOS do not affect `install_name`.
endif()
if(POLICY CMP0075)
cmake_policy(SET CMP0075 NEW) # CMake 3.12+: Include file check macros honor `CMAKE_REQUIRED_LIBRARIES`
endif()
if(POLICY CMP0077)
cmake_policy(SET CMP0077 NEW) # CMake 3.13+: option() honors normal variables.
endif()
??????? 因此如果需要某個(gè)opencv版本,需要自行下載相關(guān)版本支持。
??????? 2.2 cmake安裝(非必要)
????????本文安裝的是cmake-3.25.3版本:
wget https://cmake.org/files/v3.25/cmake-3.25.3.tar.gz --no-check-certificate
//root
//可以先刪除舊版本(非必要):yum remove -y cmake
cp cmake-3.25.3.tar.gz /usr/local/
tar zxvf cmake-3.25.3.tar.gz
mv cmake-3.25.3 cmake
cd cmake/
./configure
make && make install
??????? 然后修改profile,設(shè)置cmake路徑
gedit /etc/profile
//修改,例如在文末加入:
export PATH=$PATH:/usr/local/cmake/bin
//使其生效
source /etc/profile
//測試
cmake --version
//完成后刪除安裝包
rm -f /usr/local/cmake-3.25.3.tar.gz
????????2.3 opencv安裝依賴及支持模塊查看
??????? 創(chuàng)建編譯輸出目錄,然后通過cmake命令創(chuàng)建Makefile文件
//opencv所在父目錄
mkdir build_opencv
cd build_opencv
//按需要添加模塊支持
cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ../opencv
//輸出Makefile文件
//make help命令可以查看支持哪些模塊
例如:
The following are some of the valid targets for this Makefile:
... all (the default if no target is provided)
... clean
... depend
... edit_cache
... install
... install/local
... install/strip
... list_install_components
... package
... package_source
... rebuild_cache
... test
......
??????? 安裝時(shí)前仔細(xì)閱讀cmake命令的輸出信息,查看是否由缺失的包沒有支持到,例如:
??????? 在cmake命令輸出結(jié)論,仔細(xì)斟酌那些我們需要的功能及依賴是否支持到,例如圖形窗口方面需要gtk、vtk等支持的,又例如視頻需要FFMPEG支持,等等。相比起windows,opencv在linux下安裝主要就是明確需要哪些opencv模塊,這些模塊需要安裝哪些依賴包。
??????? 2.4 安裝pkgconfig包
??????? 前往Index of /releases去下載pkg-config包:
//指令安裝,本文安裝方式
yum -y install pkgconfig
//安裝完后,路徑/usr/lib64/pkgconfig,/usr/share/pkgconfig
//如果版本不合適,手動(dòng)下載安裝
wget https://pkgconfig.freedesktop.org/releases/pkg-config-0.29.2.tar.gz --no-check-certificate
//解壓
tar -zxvf pkg-config-0.29.2.tar.gz
//配置
cd pkg-config-0.29.2/
./configure --prefix=/usr/local/pkg-config --with-internal-glib
//編譯
make
//root 用于
make install
//安裝路徑在/usr/local/pkg-config
whereis pkgconfig
??????? 2.5 安裝opencv依賴包
??????? 安裝GTK等,centos7支持yum命令直接安裝
yum -y install epel-release
yum -y install gtk2 gtk2-devel gtk2-devel-docs
yum -y install libpng-devel
yum -y install jasper-devel
yum -y install openexr-devel
yum -y install libwebp-devel
yum -y install libjpeg-turbo-devel
yum -y install libtiff-devel
yum -y install tbb-devel eigen3-devel
yum -y install boost boost-thread boost-devel
yum -y install libgnomeui-devel
yum -y install libv4l-devel
yum -y install libdc1394-devel
yum -y install gstreamer-plugins-base-devel
yum -y install python-devel numpy
yum -y install gnome-devel gnome-devel-docs
#yum localinstall –nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
#yum localinstall –nogpgcheck https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-7.noarch.rpm
#rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
#yum -y install ffmpeg ffmpeg-devel
??????? 安裝好一些依賴包后,重新cmake一下,查看這些包是否被找到,下列cmake指令僅參考,請(qǐng)按自行系統(tǒng)環(huán)境及所需配置,相關(guān)宏請(qǐng)查看源碼的CMakeLists.txt文件確認(rèn):
cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_TBB=OFF \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D WITH_V4L=ON \
-D WITH_QT=ON \
-D WITH_OPENGL=ON \
-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules/ \
-D WITH_GTK=ON \
-D ENABLE_CXX11=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D WITH_CUDA=OFF \
-D BUILD_opencv_cudacodec=OFF \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D BUILD_EXAMPLES=OFF \
-D WITH_EIGEN=OFF \
-D WITH_VTK=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_opencv_python2=OFF \
../opencv
??????? 2.6 真正安裝opencv包開始
????????編譯整個(gè)opencv是一個(gè)費(fèi)時(shí)間的事,如果開發(fā)者只想使用某個(gè)模塊,可以按需編譯,例如:
[***@pyfree build_opencv]$ make -j2 opencv_core
[ 14%] Built target ittnotify
[100%] Built target opencv_core
[***@pyfree build_opencv]$
??????? 由于cmake時(shí)沒有指定編譯靜態(tài)庫,因此默認(rèn)編譯的是動(dòng)態(tài)庫。編譯完成后,就可以切換到root用戶下進(jìn)行安裝:
//默認(rèn)編譯
make
//安裝
su root
//密碼
make install
??????? PS,如果沒有相關(guān)依賴包,很多模塊opencv在cmake配置時(shí)就取消掉了,因此編譯出來的包有限,如果沒有您想要的包或庫,可能需要反復(fù)cmake和make、make install直接重復(fù),因此這個(gè)編譯包最好不要再安裝完成后進(jìn)刪除,需要等待版本安裝穩(wěn)定后再說。
??????? 2.7 opencv環(huán)境路徑配置
??????? 由于cmake時(shí)指定/usr/local安裝路徑,因此采用的默認(rèn)安裝路徑 :
OpenCV 默認(rèn)安裝路徑是/usr/local目錄下, 相關(guān)文件部署情況:
/usr/local/bin - executable files
/usr/local/lib - libraries (.so)
/usr/local/cmake/opencv4 - cmake package
/usr/local/include/opencv4 - headers
/usr/local/share/opencv4 - other files
//由于cmake配置時(shí),沒有做安裝目錄指定,采用默認(rèn)路徑,也沒有指定編譯靜態(tài)庫,默認(rèn)的是動(dòng)態(tài)庫編譯
???????? 對(duì)于opencv,我們開發(fā)者最主要的就是頭文件及庫路徑需要關(guān)注,本文的存放路徑及相關(guān)內(nèi)容信息如下:
//頭文件所在位置
[root@pyfree ***]# ls /usr/local/include/opencv4/opencv2/
calib3d features2d highgui.hpp objdetect stitching.hpp
calib3d.hpp features2d.hpp imgcodecs objdetect.hpp video
core flann imgcodecs.hpp opencv.hpp video.hpp
core.hpp flann.hpp imgproc opencv_modules.hpp videoio
cvconfig.h gapi imgproc.hpp photo videoio.hpp
dnn gapi.hpp ml photo.hpp
dnn.hpp highgui ml.hpp stitching
[root@pyfree ***]#
//動(dòng)態(tài)庫文件位置
[root@pyfree ***]# ls /usr/local/lib64 | grep libopencv
libopencv_calib3d.so
libopencv_calib3d.so.407
libopencv_calib3d.so.4.7.0
libopencv_core.so
libopencv_core.so.407
libopencv_core.so.4.7.0
libopencv_dnn.so
libopencv_dnn.so.407
libopencv_dnn.so.4.7.0
libopencv_features2d.so
libopencv_features2d.so.407
libopencv_features2d.so.4.7.0
libopencv_flann.so
libopencv_flann.so.407
libopencv_flann.so.4.7.0
libopencv_gapi.so
libopencv_gapi.so.407
libopencv_gapi.so.4.7.0
libopencv_highgui.so
libopencv_highgui.so.407
libopencv_highgui.so.4.7.0
libopencv_imgcodecs.so
libopencv_imgcodecs.so.407
libopencv_imgcodecs.so.4.7.0
libopencv_imgproc.so
libopencv_imgproc.so.407
libopencv_imgproc.so.4.7.0
libopencv_ml.so
libopencv_ml.so.407
libopencv_ml.so.4.7.0
libopencv_objdetect.so
libopencv_objdetect.so.407
libopencv_objdetect.so.4.7.0
libopencv_photo.so
libopencv_photo.so.407
libopencv_photo.so.4.7.0
libopencv_stitching.so
libopencv_stitching.so.407
libopencv_stitching.so.4.7.0
libopencv_videoio.so
libopencv_videoio.so.407
libopencv_videoio.so.4.7.0
libopencv_video.so
libopencv_video.so.407
libopencv_video.so.4.7.0
[root@pyfree ***]#
????????將動(dòng)態(tài)庫加入庫路徑:
//下面指令需要安裝pkgconfig包,以及opencv開啟-D OPENCV_GENERATE_PKGCONFIG=ON 支持
ln -sf /usr/local/lib64/pkgconfig/opencv4.pc /usr/share/pkgconfig/
ldconfig
//--1--,root
gedit /etc/profile
//修改PKG_CONFIG_PATH,需要已經(jīng)安裝pkgconfig包
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib64/pkgconfig:/usr/share/pkgconfig
//修改LD_LIBRARY_PATH,將opencv庫路徑加入,例如文末加入
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64:/usr/lib64:/lib64
//修改保存,關(guān)閉文件,運(yùn)行以下命令生效
source /etc/profile
//--2--,root
cd /etc/ld.so.conf.d/
vi opencv.conf
//或:gedit /etc/ld.so.conf.d/opencv.conf
//添加opencv動(dòng)態(tài)庫路徑在文件中,如/usr/local/lib64
//配置生效,運(yùn)行以下命令
ldconfig
??????? 有些版本安裝了gtk等包后,會(huì)產(chǎn)生依賴錯(cuò)誤,造成啟動(dòng)時(shí)logout錯(cuò)誤界面,這是需要ctrl+alt+F2 進(jìn)入命令模式,然后輸入root 賬號(hào)和密碼。
root
#輸入密碼
yum update
#...等待
輸入 y
??????? 更新后重啟,可能會(huì)產(chǎn)生一個(gè)新版本內(nèi)核,啟動(dòng)時(shí),最好選擇原來的內(nèi)核版本來登錄(就是我們?cè)瓉戆惭b了一系列opencv相關(guān)軟件包的版本)。
三、案例測試
??????? 3.1 案例設(shè)計(jì)
??????? 工程目錄如下:
#一個(gè)讀取圖片的測試項(xiàng)目
test
bin
1.png #png圖片
2.bmp #bmp圖片
src
main.cpp
Makefile_linux
??????? main.cpp
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
if( argc != 2)
{
cout <<" Usage: " << argv[0] << " ImageToLoadAndDisplay" << endl;
return -1;
}
Mat image;
image = imread(argv[1], IMREAD_COLOR); // Read the file
if( image.empty() ) // Check for invalid input
{
cout << "Could not open or find the image" << std::endl ;
return -1;
}
namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.
imshow( "Display window", image ); // Show our image inside it.
waitKey(0); // Wait for a keystroke in the window
return 0;
}
??????? Makefile_linux工程配置信息如下:
#/bin/sh
CX= g++
BIN := ./bin
TARGET := testlinux.exe
FLAGS := -std=c++11
SRCDIR := ./src
INCLUDEDIR := -I"/usr/local/include/opencv4"
DLLDIR := "/usr/local/lib64"
LIBDIR := -L $(DLLDIR) -lopencv_core -lopencv_highgui -lopencv_imgcodecs
#LIBDIR := $(DLLDIR)/libopencv_core.so $(DLLDIR)/libopencv_highgui.so $(DLLDIR)/libopencv_imgcodecs.so
source := $(wildcard $(SRCDIR)/*.cpp)
$(TARGET) :
$(CX) $(FLAGS) $(INCLUDEDIR) $(source) $(LIBDIR) -o $(BIN)/$(TARGET)
clean:
rm $(BIN)/$(TARGET)
??????? 3.2 編譯測試
????????運(yùn)行makfe -f Makefile_linux命令進(jìn)行編譯
[***@pyfree test]$ make -f Makefile_linux
g++ -std=c++11 -I"/usr/local/include/opencv4" ./src/main.cpp -L "/usr/local/lib64" -lopencv_core -lopencv_highgui -lopencv_imgcodecs -o ./bin/testlinux.exe
[***@pyfree test]$
??????? 編譯完成后會(huì)在bin目錄下輸出程序,運(yùn)行該程序:
?
cd bin
./testlinux.exe 1.png
文章來源:http://www.zghlxwxcb.cn/news/detail-460430.html
./testlinux.exe 2.bmp
文章來源地址http://www.zghlxwxcb.cn/news/detail-460430.html
到了這里,關(guān)于C/C++開發(fā),linux下OpenCV+gcc+cmake編譯環(huán)境搭建的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!