opencv讀取圖像時圖像數組的存儲方式,以及如何訪問每一個點的像素

使用opencv讀取圖像時圖像的排列方式是一個三維數組,但並非是三維數組按照[r:[[]] g:[[]] b:[[]]] 然後組合的方式存儲。

圖片的存儲方式可以理解成有個長 * 寬 的矩陣 矩陣的每一個點包括[b, g, r]三個點的數據 是按照[b, g, r][b, g, r] 的方式存儲

 

#include <iostream>
#include <opencv2/opencv.hpp>
#include <math.h>

using namespace std;
using namespace cv;

int main() {
    string path = "005.jpg";
    Mat srcImage = imread(path);
    namedWindow("show", 0);
    imshow("show", srcImage);
    waitKey(0);

    Mat dst;
    dst.create(srcImage.size(), srcImage.type());
    //遍歷每一個像素
    for(int i = 0; i < srcImage.rows; i++){
        for(int j = 0; j < srcImage.cols; j++){
            /*
             * 使用at模板函數來訪問每一行每一列的像素
             * 如 img.at<Vec3b>(i, j) 其中[0]爲b [1] g [2] r
             * 由此可以看出RGB的排列方式,是一個三維數組 其中第一維是長 第二維是寬,第三維度包含三個點分別是BGR
             * */
            int b = srcImage.at<Vec3b>(i, j)[0];
            int g = srcImage.at<Vec3b>(i, j)[1];
            int r = srcImage.at<Vec3b>(i, j)[2];
            //打印結果:[b, g, r][b, g, r][b, g, r][b, g, r]
            cout << srcImage.at<Vec3b>(i, j) << endl;
            dst.at<Vec3b>(i, j)[0] = b;
            dst.at<Vec3b>(i, j)[1] = g;
            dst.at<Vec3b>(i, j)[2] = r;
        }
    }

    namedWindow("show1", 0);
    imshow("show1", dst);
    waitKey(0);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章