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<<"\t高度為:"<<image.rows<<"\t通道數為:"<<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]);
            }
        }
    }


免責聲明!

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



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