zoukankan      html  css  js  c++  java
  • 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文件

  • 相关阅读:
    mysql使用group by查询报错SELECT list is not in GROUP BY clause and contains nonaggregated column...解决方案
    CentOS7 使用minikube 搭建kubernetes 学习环境
    5
    4
    3
    2
    1
    8
    7
    Algorithm
  • 原文地址:https://www.cnblogs.com/chaofn/p/10161279.html
Copyright © 2011-2022 走看看