1. 程式人生 > 程式設計 >使用CMake構建OpenCV專案過程解析

使用CMake構建OpenCV專案過程解析

專案結構

為了使整個專案更加條理,我們的資料夾採用如下組織方式:

bin
build
CMakeLists.txt
src

其中bin目錄用於放編譯生成的可執行檔案,build目錄用於cmake構建專案,src用於放原始碼。

使用CMake構建OpenCV專案過程解析

OpenCV原始檔

下面是我們寫的一個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;
}

這是一個很簡單的例子:讀取圖片然後轉化成灰度圖。  

編寫CMake檔案

CMake檔案的檔名CMakeLists.txt有嚴格的大小寫要求,注意不要寫錯。

# 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])

你可以用這個指令定義工程名稱,並可指定工程支援的語言,支援的語言列表是可以忽略的.

這個指令隱式的定義了兩個cmake變數:

  • <projectname>_BINARY_DIR 構建路徑
  • <projectname>_SOURCE_DIR 工程路徑,即CMakeLists.txt所在的路徑。  

接下來是設定cmake要求的最低版本號:

cmake_minimum_required(VERSION 3.5)

  SET指令的語法是:

SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

現階段,你只需要瞭解SET指令可以用來顯式的定義變數即可。這裡我們將變數CMAKE_RUNTIME_OUTPUT_DIRECTORY定義為${opencv_test_SOURCE_DIR}/bin也就是工程路徑下的bin目錄。 

find_package指令 

find_package這個指令以被用來在系統中自動查詢配置構建工程所需的程式庫。在linux和unix類系統下這個命令尤其有用。CMake自帶的模組檔案裡有大半是對各種常見開源庫的find_package支援,支援庫的種類非常多。

當它找到OpenCV程式庫之後,就會幫助我們預定義幾個變數,OpenCV_FOUND、OpenCV_INCLUDE_DIRS、OpenCV_LIBRARY_DIRS、OpenCV_LIBRARIES,它們分別指是否找到OpenCV,OpenCV的標頭檔案目錄,OpenCV的庫檔案目錄,OpenCV的所有庫檔案列表。接著我們就可以使用這些變數來配置了:

include_directories(${OpenCV_INCLUDE_DIRS})

這個指令用來設定包含的標頭檔案的路徑。

link_directories(${OpenCV_LIBRARY_DIRS})

這個指令用來設定庫檔案的路徑。

target_link_libraries(opencv_test ${OpenCV_LIBS})

這個指令用來設定需要的庫檔案,它的語法是:

TARGET_LINK_LIBRARIES(target library1<debug | optimized> library2...)

其中的target就是前面設定生成的目標檔案(可執行檔案):

add_executable(opencv_test src/opencv_test.cpp)

這個命令很好理解,首先是可執行檔案的名字,然後是原始碼的名字。因此,這個命令一定要在TARGET_LINK_LIBRARIES之前使用。

現在我們的CMakeLists.txt就介紹完了。

構建專案

進入build目錄,然後開始構建:

cd build
cmake ..

因為CMakeLists.txt在buil的父目錄中,因此make命令之後使用..。

然後編譯生成可執行檔案:

make

執行生成的可執行檔案以測試我們是否成功,該程式需要傳遞一個命令列引數。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。