macOS Sierra10.12.6下安裝OpenCV3.3.0
前一段時間,本來已經安裝好的OpenCV,由於沒有安裝它的contrib modules,所以折騰了一下,重新安裝。借著新鮮勁兒,我想把這次的安裝過程記錄下來,作為非計算機專業的小白,可以通過這個過程理解一下應用程序開發的一些過程。
概述
CMake教程是當今流行的跨平台開源軟體構建工具。在C++領域,眾多優秀的軟體例如KDE、ReactOS等,還有開源的開發工具包例如ITK、OpenCV、VTK等都是通過使用CMake這款強大的構建工具完成的。CMake能夠通過CMakeLists.txt說明如何組織我們所寫的源代碼文檔,它獨立於操作系統和平台,也就是說,在工程當中,恰當的C++/C代碼+CMakeLists.txt就能夠發布出去,讓不同平台的編譯器完成對源代碼的編譯,調試器調試代碼。KitWare CMake說明和CMake官網教程裡面有詳細的說明,可以作為工具類字典查找關鍵點,解決我們在使用時遇到的問題。
第三方庫
我們在編寫自己的業務代碼時,往往是要藉助於第三方庫調用其中的方法達成我們的目的。這就產生了一個問題:如何通過CMake調用?一般來講,應用軟體調用第三方庫函數有兩種方式:
- 靜態庫
- 動態鏈接庫
下面的鏈接解釋了動態鏈接庫和靜態庫是如何被我們的應用軟體所調用。靜態庫與動態庫的最大區別就是靜態庫在代碼的編譯鏈接階段由編譯器直接將其包含的代碼鏈接成可執行的二進位文件,當我們拷貝該文件執行時,是不需要同時拷貝靜態庫的;動態鏈接庫是可執行的二進位文件在運行期間,動態地對鏈接庫裡面的內容進行引用,達到使用其函數的目的。所以,可想而知,通過靜態庫鏈接而成的文件比較大;動態庫的程序文件較小,當我們想提高程序的性能時,可以通過只修改動態庫而不需要重新編譯代碼完成軟體的優化,只是:程序在運行期間需要耗費一定時間去引用動態庫的內容。我的電腦上安裝OpenCV時,採用的就是生成動態鏈接庫的方式。
StaticLibs and SharedLibs
安裝OpenCV
安裝準備:
- Xcode
- CMake 最好是CMake GUI
- OpenCV-3.3.0 Source code
建議:如果希望使用OpenCV提供的額外方法(contrib modules),例如人臉識別,cvv可視化的調試方法等,下載contrib源碼和成熟演算法源碼。
步驟1:創建OpenCV_Source_Dir,將下載好的源碼解壓縮放入,圖中我將OpenCV_contrib源碼放在了/src/contrib目錄下。同級創建/build目錄,用於存放安裝好的庫。只要記得放在哪裡就行,下一步會用到。
步驟2:使用CMake GUI。只是建議,如果對CMake很熟練,就無所謂了,用終端即可。
藍色瀏覽到/src,紅色瀏覽到/build目錄。
步驟三:configure.
點擊左下角的Configure按鈕,出現下圖,選擇Unix Makefiles generator,點選Use default native compilers。確定。
藍色BUILD_SHARED_LIBS變數被勾選,表示即將構建出來的OpenCV庫是shared libs,紅色區域內的變數是第一次點擊configure之後需要使用者注意的,看是否正確,如果想修改,可以按照自己的意願修改。
添加OPENCV_EXTRA_MODULES_PATH 變數指定路徑,該路徑就是剛才所說的OpenCV_contrib/modules文件夾:
確認所有變數設置無誤之後,再次Configure。看到紅色部分是contrib modules:
再次點擊Configure,紅色消失。
步驟4:Generate。
點擊Generate,生成build files。
步驟5:make。
在終端中進入/build目錄,然後make,將源代碼通過讀取makefile生成target,需等待一段時間。
步驟6:sudo make install
輸入用戶密碼,target生成*.dylib文件供使用。完成。
使用OpenCV
這裡重點說明一下CMake如何尋找第三方依賴庫。
CMake how to find Libs這篇文章講解的很清晰,我在這裡結合OpenCV的使用再次走一遍。當我們自己寫的軟體需要使用第三方庫時,需要知道如下信息:
- 頭文件(.h)在哪裡
- 庫文件(.dyLib/ .dll / .o)在哪裡
- 庫文件都叫做什麼?
搞清楚上面三個問題,我們的編譯器就能夠工作。
CMake下,使用find_package來幫助開發者尋找工具。尋找的具體機制請看CMake how to find package。總體上是分為module mode 和config mode。我按照裡面的說明親自尋找了一下,但是在usr/local/share/cmake/Modules路徑下未找到FindOpenCV.cmake文件。我又更換到usr/local/share/opencv路徑,找到了OpenCVConfig.cmake文件。但是並未發現如下的一些變數到底是在哪裡定義的。有哪位大神知道的話,非常歡迎留言解答我的疑問,不勝感激。
<NAME>_FOUNDn<NAME>_INCLUDE_DIRS or <NAME>_INCLUDESn<NAME>_LIBRARIES or <NAME>_LIBRARIES or <NAME>_LIBSn<NAME>_DEFINITIONSn
我使用CLion環境編寫代碼,在工程的根目錄下創建一個CMakeLists.txt的文件,輸入如下的代碼:
cmake_minimum_required(VERSION 3.8)nproject(BlendImages)nnset(CMAKE_CXX_STANDARD 11)nfind_package(OpenCV REQUIRED)nset(SOURCE_FILES main.cpp)nnset(dir ${CMAKE_CURRENT_SOURCE_DIR}/build/)nset(EXECUTABLE_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)nset(LIBRARY_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)nset(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dir})nset(CMAKE_BUILD_FILES_DIRECTORY ${dir})nset(CMAKE_BUILD_DIRECTORY ${dir})nset(CMAKE_BINARY_DIR ${dir})nSET(EXECUTABLE_OUTPUT_PATH ${dir})nSET(LIBRARY_OUTPUT_PATH ${dir}lib)nSET(CMAKE_CACHEFILE_DIR ${dir})nnadd_executable(BlendImages ${SOURCE_FILES})ntarget_link_libraries(BlendImages ${OpenCV_LIBS})n
main.cpp中:
#include <iostream>n#include "opencv2/imgcodecs.hpp"n#include "opencv2/highgui.hpp"nusing namespace cv;nusing namespace std;nnconst int alpha_slider_max = 100;nint alpha_slider;ndouble alpha;ndouble beta;nMat src1;nMat src2;nMat dist;nstatic void on_trackBar(int,void *)n{n alpha = (double)alpha_slider/alpha_slider_max;n beta = (1.0 - alpha);n addWeighted(src1,alpha,src2,beta,0.0,dist);n imshow("Linear Blend",dist);n}nint main()n{n cout << "This is AddingTrackBar Program!" << std::endl;n src1 = imread("../data/LinuxLogo.jpg");n src2 = imread("../data/WindowsLogo.jpg");n if(src1.empty())n {n cout<<"Error loading src1"<<endl;n }n if(src2.empty())n {n cout<<"Error loading src2"<<endl;n }n alpha_slider = 0;n namedWindow("Linear Blend",WINDOW_AUTOSIZE);n char trackBarName[50];n sprintf(trackBarName,"Alpha x %d",alpha_slider_max);n createTrackbar(trackBarName,"Linear Blend",&alpha_slider,alpha_slider_max,on_trackBar);n on_trackBar(alpha_slider,0);n waitKey(0);n return 0;n}n
https://www.zhihu.com/video/904090612305895424
上面的視頻是實現效果。到此,我們就可以在構建好的平台上面開發自己的程序,探索好玩的東西了。
參考
CMake--KitWare blog
how to install build and use OpenCV
CMake學習
推薦閱讀: