使用CMake構建OpenCV項目


這篇文章我們來對我們的安裝進行測試,並介紹如何用CMake工具快捷地構建OpenCV項目。
為了使整個項目更加條理,我們的文件夾采用如下組織方式:

bin
build
CMakeLists.txt
src

其中bin目錄用於放編譯生成的可執行文件,build目錄用於cmake構建項目,src用於放源代碼。"CMakeLists.txt"這個名字,一個字都不能錯。
編寫的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, COLOR_BGR2GRAY);
    // imwrite("~/template/result.jpg", gray_img);
    imshow( "gray" ,gray_img);
   cv : : waitKey( 0 );

    return 0 ;
}
這是一個很簡單的例子:讀取圖片然后轉化成灰度圖。取名為main.cpp。需要注意的是在沒有“語法糖”的情況下編寫代碼非常困難,我選擇首先在vs中編好,然后復制。

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 ${opencv_test_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系統也幫助我們預定義了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR變量,他們的值分別跟opencv_test_BINARY_DIR與opencv_test_SOURCE_DIR一致。【注意這里的許多約定,這個名字應該就是目錄名稱】
為了統一起見,建議以后直接使用PROJECT_BINARY_DIR,PROJECT_SOURCE_DIR,即使修改了工程名稱,也不會影響這兩個變量。如果使用了<projectname>_SOURCE_DIR,修改工程名稱后,需要同時修改這些變量。
接下來是設置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這個指令以被用來在系統中自動查找配置構建工程所需的程序庫。在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命令之后使用..。
-- Configuring done
-- Generating done
-- Build files have been written to : /home /liuchaoyang /grad_proj /opencv_test /build
這樣就構建成功了,構建之后會生成很多文件,其中就有Makefile文件。
然后編譯生成可執行文件:
make
[ 50 %] Building CXX object CMakeFiles /opencv_test.dir /src /opencv_test.cpp.o
[ 100 %] Linking CXX executable .. /bin /opencv_test
[ 100 %] Built target opencv_test
運行生成的可執行文件以測試我們是否成功,該程序需要傳遞一個命令行參數。下面是運行結果:
這里非常神奇的就是CMake能夠自動給你找到環境。那么也就是說當我們進行類庫移植的時候,最好進行一次CMake和make ,看上去非常高級。
總結:
這幾個標黃的地方,改成和目錄名稱一樣,應該就可以了。




附件列表

     


    免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM