作為個(gè)人 Linux/Ubuntu 下C++ 開發(fā)博客系列第一篇,主要介紹使用,在集成開發(fā)環(huán)境Clion下,配置加載獨(dú)立編譯的opencv庫,并對(duì)相應(yīng)的圖片進(jìn)行處理。本文主要包含一下幾個(gè)步驟。
1.Ubuntu 下opencv的編譯安裝。
- opencv 下載
- opencv 編譯安裝
- opencv 編譯測(cè)試
2.Clion 內(nèi)CMakeLists.txt 配置加載opencv。
- CMakeLists.txt 配置opencv
- opencv Demo
1.Ubuntu 下opencv 的編譯安裝。
1.opencv 下載。
訪問到opencv 的 github 主頁,進(jìn)入release 頁面,選擇對(duì)應(yīng)版本的 opencv源碼,進(jìn)行下載。在本例中,作者下載使用的是opencv 3.4.0

2. opencv 編譯安裝
解壓出下載的源碼文件,在解壓出來的根目錄內(nèi)創(chuàng)建build目錄,用來保持cmake 的中間文件。

cd 到build目錄內(nèi),使用cmake 對(duì)opencv進(jìn)行編譯。
cmake -D CMAKE_BUILD_TYPE=RELEASE
-D CMAKE_INSTALL_PREFIX=/home/xxx/Downloads/tmps/tmp
-D WITH_GPHOTO2=OFF
-D WITH_GTK=OFF
-D WITH_CUDA=OFF
-D WITH_FFMPEG=OFF
-D WITH_LAPACK=OFF
-D ENABLE_CXX11=ON
..
命令行參數(shù)解釋:
- CMAKE_INSTALL_PREFIX: opencv的安裝路徑。后期make install 后opencv的最終安裝地址。
- WITH_GPHOTO2: 關(guān)閉gphotos
- WITH_GTK:關(guān)閉gtk
- WITH_CUDA: 關(guān)閉CUDA
.. - ENABLE_CXX11:開啟CXX11
通過開啟/關(guān)閉對(duì)應(yīng)的編譯依賴選項(xiàng),降低編譯復(fù)雜度/開啟對(duì)應(yīng)的功能。


make:

其中 “-j12” 參數(shù),12 是為了使用并行的CPU 核心數(shù)。和CPU核數(shù)相關(guān),可根據(jù)具體數(shù)量進(jìn)行調(diào)整。

make 完畢后,運(yùn)行make install 進(jìn)行安裝opencv。(若安裝地址在非當(dāng)前用戶權(quán)限 需要使用sudo make install 進(jìn)行安裝)。


隨后可以在編譯選項(xiàng)“-D CMAKE_INSTALL_PREFIX=/home/xxx/Downloads/tmps/tmp ” 所制定的目錄內(nèi)看到安裝好的opencv文件。

1. opencv 編譯測(cè)試
在用戶的 .zshrc/.bashrc 文件內(nèi)添加以下參數(shù),添加opencv到用戶環(huán)境中。
#add opencv 3.4.0
export PATH=/home/xxx/Downloads/tmps/tmp/bin:$PATH
export LD_LIBRARY_PATH=/home/xxx/Downloads/tmps/tmp/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/home/xxx/Downloads/tmps/tmp/lib/pkgconfig
以上路徑,要根據(jù)自己的安裝路徑進(jìn)行更改。
cd 到源碼路徑 “opencv-3.4.0/samples/cpp”內(nèi)。運(yùn)行以下指令編譯,嘗試編譯其中的人臉識(shí)別示例程序。
gcc `pkg-config --cflags opencv` -o facedetect facedetect.cpp `pkg-config --libs opencv` -lstdc++

在上面的cpp目錄內(nèi),輸入以下命令,可以看到opencv 檢測(cè)出來的人臉圖片。
./facedetect ../data/lena.jpg

到此,完成了在Ubuntu下 opencv的 源碼編譯和安裝。
2.Clion 內(nèi)CMakeLists.txt 配置加載opencv。
1. CMakeLists.txt 配置opencv
在clion 的cpp工程中,對(duì)CMakeLists.txt 添加以下代碼,加載opencv
# Where to find CMake modules and OpenCV
set(OpenCV_DIR "/home/xxx/Downloads/tmps/tmp/opencv-3.4.0/share/OpenCV")
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(learn_cpp ${SOURCE_FILES})
# add libs you need
set(OpenCV_LIBS opencv_core opencv_imgproc opencv_highgui opencv_imgcodecs)
# or add all
# include_directories(${OpenCV_INCLUDE_DIRS})
# linking
target_link_libraries(learn_cpp ${OpenCV_LIBS})
其中,在set(OpenCV_DIR "/home/xxx/Downloads/tmps/tmp/opencv-3.4.0/share/OpenCV") 用來指定opencv的安裝目錄,這個(gè)路徑并不是安裝的時(shí)候指定的CMAKE_INSTALL_PREFIX=/home/xxx/Downloads/tmps/tmp,而是更下一級(jí)的share/OpenCV 目錄。如果指定了安裝配置的路徑,那么就不能正確的導(dǎo)入模塊。
2. opencv Demo
在工程內(nèi)添加代碼,對(duì)圖片進(jìn)行下方和右方的填充。
效果如下:

部分填充源碼:
utils.cpp
#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int ImgPorcess(char *imgPath) {
cout << "ss" << endl;
Mat src, dst;
char *window_name = "copyMakeBorder Demo";
src = imread(imgPath);
if (!src.data) {
cerr << "Can't open the image!" << endl;
return EXIT_FAILURE;
}
namedWindow(window_name);
cout << src.rows << endl;
cout << src.cols << endl;
dst = src;
while (true) {
waitKey(500);
copyMakeBorder(src, dst, 0, 10, 0, 20, BORDER_CONSTANT, 0);
imshow(window_name, dst);
}
}
End