1. 程式人生 > >CMakeList.txt設定OpenCv路徑

CMakeList.txt設定OpenCv路徑

原始檔imageBasics.cpp

#include <iostream>
#include <chrono>
using namespace std;

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

int main ( int argc, char** argv )
{
    // 讀取argv[1]指定的影象
    cv::Mat image;
    image = cv::imread ( argv[1] ); //cv::imread函式讀取指定路徑下的影象
    // 判斷影象檔案是否正確讀取
    if ( image.data == nullptr ) //資料不存在,可能是檔案不存在
    {
        cerr<<"檔案"<<argv[1]<<"不存在."<<endl;
        return 0;
    }
    
    // 檔案順利讀取, 首先輸出一些基本資訊
    cout<<"影象寬為"<<image.cols<<",高為"<<image.rows<<",通道數為"<<image.channels()<<endl;
    cv::imshow ( "image", image );      // 用cv::imshow顯示影象
    cv::waitKey ( 0 );                  // 暫停程式,等待一個按鍵輸入
    // 判斷image的型別
    if ( image.type() != CV_8UC1 && image.type() != CV_8UC3 )
    {
        // 影象型別不符合要求
        cout<<"請輸入一張彩色圖或灰度圖."<<endl;
        return 0;
    }

    // 遍歷影象, 請注意以下遍歷方式亦可使用於隨機畫素訪問
    // 使用 std::chrono 來給演算法計時
    chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
    for ( size_t y=0; y<image.rows; y++ )
    {
        // 用cv::Mat::ptr獲得影象的行指標
        unsigned char* row_ptr = image.ptr<unsigned char> ( y );  // row_ptr是第y行的頭指標
        for ( size_t x=0; x<image.cols; x++ )
        {
            // 訪問位於 x,y 處的畫素
            unsigned char* data_ptr = &row_ptr[ x*image.channels() ]; // data_ptr 指向待訪問的畫素資料
            // 輸出該畫素的每個通道,如果是灰度圖就只有一個通道
            for ( int c = 0; c != image.channels(); c++ )
            {
                unsigned char data = data_ptr[c]; // data為I(x,y)第c個通道的值
            }
        }
    }
    chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
    chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>( t2-t1 );
    cout<<"遍歷影象用時:"<<time_used.count()<<" 秒。"<<endl;

    // 關於 cv::Mat 的拷貝
    // 直接賦值並不會拷貝資料
    cv::Mat image_another = image;
    // 修改 image_another 會導致 image 發生變化
    image_another ( cv::Rect ( 0,0,100,100 ) ).setTo ( 0 ); // 將左上角100*100的塊置零
    cv::imshow ( "image", image );
    cv::waitKey ( 0 );
    
    // 使用clone函式來拷貝資料
    cv::Mat image_clone = image.clone();
    image_clone ( cv::Rect ( 0,0,100,100 ) ).setTo ( 255 );
    cv::imshow ( "image", image );
    cv::imshow ( "image_clone", image_clone );
    cv::waitKey ( 0 );

    // 對於影象還有很多基本的操作,如剪下,旋轉,縮放等,限於篇幅就不一一介紹了,請參看OpenCV官方文件查詢每個函式的呼叫方法.
    cv::destroyAllWindows();
    return 0;
}

 CMakeList.txt

cmake_minimum_required( VERSION 2.8 )
project( imageBasics )

# 新增c++ 11標準支援
set( CMAKE_CXX_FLAGS "-std=c++11" )

# 尋找OpenCV庫
set(OpenCV_DIR /home/chaofan/opt/opencv-3.4.4/release)
find_package( OpenCV 3 REQUIRED )
# 新增標頭檔案
include_directories( ${OpenCV_INCLUDE_DIRS} )

add_executable( imageBasics imageBasics.cpp )
# 連結OpenCV庫
target_link_libraries( imageBasics ${OpenCV_LIBS} )

 怎麼找到opencv的路徑?
就是去找安裝opencv的時候建立的release或build資料夾,主要依據是裡面有OpenCVConfig.cmake檔案