• c++ OpenCV入门教程:图片读取和它的基本操作以及能获取的图片属性


    使用OpenCV时CMakeLists.txt怎么写

    有些朋友使用cmake编译c++程序因此这里我介绍下使用opencv库的cmakelists.txt怎么写。如果你还不知道cmake那就忽略这一步(因为cmake就是命令行编译c++,你用的是IDE编译c++程序那就不用管cmakelists.txt了)。

    #opencv 4.+需要c++11以上版本的编译器
    set(CMAKE_CXX_FLAGS "-std=c++11")
    # 引入Opencv包
    find_package(OpenCV REQUIRED)
    include_directories(${OpenCV_INCLUDE_DIRS})
    # 注意use_opencv.cpp是我源代码文件名,你需要改成你源代码名
    add_executable(use_opencv use_opencv.cpp)
    # 链接OpenCV库
    target_link_libraries(use_opencv ${OpenCV_LIBS})
    

    读取图片

    其实读取图片很简单,但是你得注意图片相对当前代码的路径。它就是读取得到一个矩阵。矩阵的元素是个数字。这个数字表示颜色。

    #include <iostream>
    using namespace std;
    
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    int main(int argc, char** argv){
        cv::Mat image;
        image = cv::imread("./ubuntu.png");
        if(image.data== nullptr)//nullptr是c++11新出现的空指针常量
        {
            cerr<<"图片文件不存在"<<endl;
            return 0;
        }else
            cout<<image<<endl;//你会发现图片就是一个矩阵
        return 0;
    }
    

    图像矩阵的大小取决于我们所用的颜色模型,确切地说,取决于所用通道数。如果是灰度图像,矩阵就会像这样:

    在这里插入图片描述
    而对多通道图像来说,矩阵中的列会包含多个子列,其子列个数与通道数相等。例如,RGB颜色模型的矩阵:
    在这里插入图片描述
    注意,子列的通道顺序是反过来的:BGR而不是RGB。

    显示图片

    #include <iostream>
    using namespace std;
    
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    int main(int argc, char** argv){
        cv::Mat image;
        image = cv::imread("./ubuntu.png");
        if(image.data== nullptr)//nullptr是c++11新出现的空指针常量
        {
            cerr<<"图片文件不存在"<<endl;
            return 0;
        }
        cv::imshow("这里是窗口的名字",image);
        cv::waitKey(0);// 按任意键在0秒后退出窗口,不写这句话是不会显示出窗口的
        return 0;
    }
    

    输出图片的基本信息

    #include <iostream>
    using namespace std;
    
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    int main(int argc, char** argv){
        cv::Mat image;
        image = cv::imread("./ubuntu.png");
        if(image.data== nullptr)//nullptr是c++11新出现的空指针常量
        {
            cerr<<"图片文件不存在"<<endl;
            return 0;
        }
    
        //输出图片的基本信息
        cout<<"图像宽为:"<<image.cols<<"	高度为:"<<image.rows<<"	通道数为:"<<image.channels()<<endl;
        return 0;
    }
    

    按像素遍历图片

    	cv::Mat image;
        image = cv::imread("./ubuntu.png");
        if(image.data== nullptr)//nullptr是c++11新出现的空指针常量
        {
            cerr<<"图片文件不存在"<<endl;
            return 0;
        }
    
        // 遍历每个像素
        //之所以用y这个名字表示行是因为图片的坐标系中行号就是y
        for (size_t y = 0; y < image.rows; ++y) {
    
            // 获取行指针,之所以用char的原因是因为颜色值是1-256用char能放得下
            // ptr是pointer的缩写
            unsigned char* row_ptr= image.ptr<unsigned char>(y);
            for (size_t x = 0; x < image.cols; ++x) {
                //这是获得像素数据数组的头指针,注意像素数据可能会有多个通道所以才需要用数组存储
                unsigned char* data_ptr = &row_ptr[x*image.channels()];
                //对当前像素逐个通道输出颜色值
                for (int i = 0; i < image.channels(); ++i) {
                    cout<< int(data_ptr[i]);
                }
            }
        }
    
    知乎 https://www.zhihu.com/people/yuanmuou/activities
  • 相关阅读:
    孔曰成仁,孟曰取义
    mysql索引&实现原理
    MySQL存储引擎
    HashMap原理
    反射
    list对象属性排序
    mysql数据表操作&库操作
    mysql字段类型
    java线程池初步理解
    java四种内部类
  • 原文地址:https://www.cnblogs.com/ailitao/p/11787567.html
Copyright © 2020-2023  润新知