openCV中使用Mat.at修改像素的值CV_8UC3和CV_8UC1的區別

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

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    Mat image;
    Mat III=Mat(255,255,CV_8UC3);

    //uchar *pd = II.data;
    Mat IIIBlue = III.clone();
    for(int i=0;i<255;i++)
        for (int j = 0; j < 255; j++)
        {
            //*pd++ = i;
            //II.at<uchar>(i, j) = j;
            IIIBlue.at<Vec3b>(i, j)[0] = j;
            IIIBlue.at<Vec3b>(i, j)[1] = 0;
            IIIBlue.at<Vec3b>(i, j)[2] = 0;
        }

    Mat IIIGreen = III.clone();
    for (int i = 0; i<255; i++)
        for (int j = 0; j < 255; j++)
        {
            //*pd++ = i;
            //II.at<uchar>(i, j) = j;
            IIIGreen.at<Vec3b>(i, j)[0] = 0;
            IIIGreen.at<Vec3b>(i, j)[1] = j;
            IIIGreen.at<Vec3b>(i, j)[2] = 0;
        }

    Mat IIIRed = III.clone();
    for (int i = 0; i<255; i++)
        for (int j = 0; j < 255; j++)
        {
            //*pd++ = i;
            //II.at<uchar>(i, j) = j;
            IIIRed.at<Vec3b>(i, j)[0] = 0;
            IIIRed.at<Vec3b>(i, j)[1] = 0;
            IIIRed.at<Vec3b>(i, j)[2] = j;
        }


    Mat I8UC3 = Mat(255, 255, CV_8UC3);

    //uchar *pd = II.data;
    for (int i = 0; i<255; i++)
        for (int j = 0; j < 255; j++)
        {
            //*pd++ = i;
            I8UC3.at<uchar>(i, j) = i;
        }


    Mat I8UC1 = Mat(255, 255, CV_8UC1);

    //uchar *pd = II.data;
    for (int i = 0; i<255; i++)
        for (int j = 0; j < 255; j++)
        {
            //*pd++ = i;
            I8UC1.at<uchar>(i, j) = i;
        }

    Mat I8UC1_ = Mat(255, 255, CV_8UC1);

    uchar *pd = I8UC1_.data;
    for (int i = 0; i<255; i++)
        for (int j = 0; j < 255; j++)
        {
            *pd++ = i;
        }
    //uchar *L0 = II.ptr<uchar>(0);
    //uchar *L1 = II.ptr<uchar>(1);


    //print(image);
    printf("MAT Blue channle=%d,type=%d\n", IIIBlue.channels(), IIIBlue.type());
    printf("MAT Green channle=%d,type=%d\n", IIIGreen.channels(), IIIGreen.type());
    printf("MAT Green channle=%d,type=%d\n", I8UC3.channels(), I8UC3.type());

    printf("CV_8UC3 channle=%d,type=%d\n", I8UC3.channels(), I8UC3.type());
    printf("CV_8UC1 channle=%d,type=%d\n", I8UC1.channels(), I8UC1.type());

    printf("CV_8UC1_Data channle=%d,type=%d\n", I8UC1_.channels(), I8UC1_.type());

    namedWindow("Display window", WINDOW_AUTOSIZE); // Create a window for display.
    imshow("Blue", IIIBlue); // Show our image inside it.
    imshow("Green", IIIGreen); // Show our image inside it.
    imshow("Red", IIIRed); // Show our image inside it.
    imshow("CV_8UC3", I8UC3); // Show our image inside it.
    imshow("CV_8UC1", I8UC1); // Show our image inside it.

    imshow("CV_8UC1_Data", I8UC1_); // Show our image inside it.
    waitKey(0); // Wait for a keystroke in the window
    return 0;
}

 

運行結果如下圖:

 

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