使用CMake構(gòu)建OpenCV項(xiàng)目過程解析
項(xiàng)目結(jié)構(gòu)
為了使整個(gè)項(xiàng)目更加條理,我們的文件夾采用如下組織方式:
bin
build
CMakeLists.txt
src
其中bin目錄用于放編譯生成的可執(zhí)行文件,build目錄用于cmake構(gòu)建項(xiàng)目,src用于放源代碼。
OpenCV源文件
下面是我們寫的一個(gè)OpenCV示例代碼:
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> using namespace std; using namespace cv; int main(int argc, char** argv) { if (argc != 2) { cout << "Usage: opencv_test <image path>" << endl; return -1; } char *imgName = argv[1]; Mat image; image = imread(imgName, 1); if (!image.data) { cout << "No image data" << endl; return -1; } Mat gray_img; cvtColor(image, gray_img, CV_BGR2GRAY); imwrite("images/result.jpg", gray_img); return 0; }
這是一個(gè)很簡單的例子:讀取圖片然后轉(zhuǎn)化成灰度圖。
編寫CMake文件
CMake文件的文件名CMakeLists.txt有嚴(yán)格的大小寫要求,注意不要寫錯(cuò)。
# project name
PROJECT(opencv_test)
# requirement of cmake version
cmake_minimum_required(VERSION 3.5)
# set the directory of executable files
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
# find required opencv
find_package(OpenCV REQUIRED)
# directory of opencv headers
include_directories(${OpenCV_INCLUDE_DIRS})
# name of executable file and path of source file
add_executable(opencv_test src/opencv_test.cpp)
# directory of opencv library
link_directories(${OpenCV_LIBRARY_DIRS})
# opencv libraries
target_link_libraries(opencv_test ${OpenCV_LIBS})
PROJECT指令的語法是:
PROJECT(projectname [CXX] [C] [Java])
你可以用這個(gè)指令定義工程名稱,并可指定工程支持的語言,支持的語言列表是可以忽略的.
這個(gè)指令隱式的定義了兩個(gè)cmake變量:
- <projectname>_BINARY_DIR 構(gòu)建路徑
- <projectname>_SOURCE_DIR 工程路徑,即CMakeLists.txt所在的路徑?! ?/li>
接下來是設(shè)置cmake要求的最低版本號(hào):
cmake_minimum_required(VERSION 3.5)
SET指令的語法是:
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
現(xiàn)階段,你只需要了解SET指令可以用來顯式的定義變量即可。這里我們將變量CMAKE_RUNTIME_OUTPUT_DIRECTORY定義為${opencv_test_SOURCE_DIR}/bin也就是工程路徑下的bin目錄。
find_package指令
find_package這個(gè)指令以被用來在系統(tǒng)中自動(dòng)查找配置構(gòu)建工程所需的程序庫。在linux和unix類系統(tǒng)下這個(gè)命令尤其有用。CMake自帶的模塊文件里有大半是對(duì)各種常見開源庫的find_package支持,支持庫的種類非常多。
當(dāng)它找到OpenCV程序庫之后,就會(huì)幫助我們預(yù)定義幾個(gè)變量,OpenCV_FOUND、OpenCV_INCLUDE_DIRS、OpenCV_LIBRARY_DIRS、OpenCV_LIBRARIES,它們分別指是否找到OpenCV,OpenCV的頭文件目錄,OpenCV的庫文件目錄,OpenCV的所有庫文件列表。接著我們就可以使用這些變量來配置了:
include_directories(${OpenCV_INCLUDE_DIRS})
這個(gè)指令用來設(shè)置包含的頭文件的路徑。
link_directories(${OpenCV_LIBRARY_DIRS})
這個(gè)指令用來設(shè)置庫文件的路徑。
target_link_libraries(opencv_test ${OpenCV_LIBS})
這個(gè)指令用來設(shè)置需要的庫文件,它的語法是:
TARGET_LINK_LIBRARIES(target library1<debug | optimized> library2...)
其中的target就是前面設(shè)置生成的目標(biāo)文件(可執(zhí)行文件):
add_executable(opencv_test src/opencv_test.cpp)
這個(gè)命令很好理解,首先是可執(zhí)行文件的名字,然后是源碼的名字。因此,這個(gè)命令一定要在TARGET_LINK_LIBRARIES之前使用。
現(xiàn)在我們的CMakeLists.txt就介紹完了。
構(gòu)建項(xiàng)目
進(jìn)入build目錄,然后開始構(gòu)建:
cd build
cmake ..
因?yàn)镃MakeLists.txt在buil的父目錄中,因此make命令之后使用..。
然后編譯生成可執(zhí)行文件:
make
運(yùn)行生成的可執(zhí)行文件以測試我們是否成功,該程序需要傳遞一個(gè)命令行參數(shù)。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android開發(fā)實(shí)現(xiàn)webview中img標(biāo)簽加載本地圖片的方法
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)webview中img標(biāo)簽加載本地圖片的方法,結(jié)合實(shí)例形式分析了webview加載本地圖片的步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-10-10android調(diào)用webservice接口獲取信息
這篇文章主要為大家詳細(xì)介紹了android調(diào)用webservice接口獲取信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Android實(shí)現(xiàn)TextView中文字鏈接的4種方式介紹及代碼
Android實(shí)現(xiàn)TextView中文字鏈接的方式有很多種;總結(jié)起來大概有4種:用Spannable或?qū)崿F(xiàn)它的類,如SpannableString來格式,部分字符串等等,感興趣的你可以參考下2013-02-02Android SDK Manager國內(nèi)無法更新的解決方案
本文主要介紹Android SDK Manager國內(nèi)無法更新的解決方案,這里提供了解決方法,及簡單說明實(shí)現(xiàn)流程,有興趣的小伙伴可以參考下2016-09-09Android Studio 3.5格式化布局代碼時(shí)錯(cuò)位、錯(cuò)亂bug的解決
這篇文章主要介紹了Android Studio 3.5格式化布局代碼時(shí)錯(cuò)位、錯(cuò)亂bug的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android開發(fā)中一個(gè)簡單實(shí)用的調(diào)試應(yīng)用技巧分享
這篇文章主要跟大家分享了一個(gè)簡單實(shí)用的Android調(diào)試應(yīng)用技巧,文中介紹的非常詳細(xì),相信對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面來一起看看吧。2017-05-05