05-05 14:11
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[OpenCV] 특정 픽셀 컬러 정보 얻어내기 본문

Programming/OpenCV

[OpenCV] 특정 픽셀 컬러 정보 얻어내기

cinema4dr12 2015. 7. 4. 23:02

이번 포스팅에서는 OpenCV의 Mat class의 data pointer를 통해 특정 픽셀의 컬러 정보를 얻어오는 방법에 대해 알아보도록 하겠습니다.


1.  이미지를 로딩합니다.


1
2
// Read an image
cv::Mat image = cv::imread( YOUR_IMAGE_PATH, 1 );
cs


2.  uchar 타입의 image data pointer를 얻어옵니다.


1
uchar *data = image.data;
cs


3.  마찬가지로 컬러 채널별로 uchar 타입을 선언합니다.


1
uchar *blue, *green, *red;
cs


4.  특정 픽셀 (j, i) 각 채널 데이터를 얻어옵니다.


1
2
3
blue    = image.data + j*image.step + i*image.elemSize() + 0;
green    = image.data + j*image.step + i*image.elemSize() + 1;
red    = image.data + j*image.step + i*image.elemSize() + 2;
cs



Sample Code 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <opencv2/opencv.hpp>
 
#include <stdlib.h>
#include <stdio.h>
 
using namespace std;
using namespace cv;
 
void GetPixelData( cv::Mat image, uchar* blue, uchar* green, uchar* red, int j, int i );
 
/* @ function main */
int main( int argc, char** argv )
{
    // Read an image
    cv::Mat image = cv::imread( {YOUR_IMAGE_PATH}, 1 );
    
    uchar *blue, *green, *red;
 
    blue = nullptr;
    green = nullptr;
    red = nullptr;
 
    // get (j,i) pixel : j-th row, i-th column pixel
    int j = 0;
    int i = 1;
 
    GetPixelData( image, blue, green, red, j, i );
 
    return 0;
}
 
 
/* @function GetPixelData (j,i) */
void GetPixelData( cv::Mat image, uchar* blue, uchar* green, uchar* red, int j, int i )
{
    uchar *data = image.data;
 
    int nRow = image.rows;
    int nCol = image.cols;
 
    if( i > nCol - 1 || j > nRow - 1 ) {
        cout << "Selected pixel is out of range." << endl;
        return;
    }
 
    blue    = image.data + j*image.step + i*image.elemSize() + 0;
    green    = image.data + j*image.step + i*image.elemSize() + 1;
    red    = image.data + j*image.step + i*image.elemSize() + 2;
 
    cout << "Red: " << (int)*red << " , Green: " << (int)*green << " , Blue: " << (int)*blue << endl;
}
cs

하지만 위의 방법보다 간단한 방법이 있는데, 픽셀로부터 직접 값을 얻어오는 방법입니다. 아마도 대부분의 개발자들은 이 방법을 선호할 것입니다.


Sample Code 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <opencv2/opencv.hpp>
 
#include <stdlib.h>
#include <stdio.h>
 
using namespace std;
using namespace cv;
 
/* @ function main */
int main( int argc, char** argv )
{
    // Read an image
    cv::Mat image = cv::imread( {YOUR_IMAGE_PATH}, 1 );
 
    // get (j,i) pixel : j-th row, i-th column pixel
    int j = 0;
    int i = 1;
    // read a pixel from image directly
    int nBlue, nGreen, nRed;
    nBlue = 0; nGreen = 0; nRed = 0;
 
    nBlue    = image.at<cv::Vec3b>(j,i)[0];
    nGreen    = image.at<cv::Vec3b>(j,i)[1];
    nRed    = image.at<cv::Vec3b>(j,i)[2];
 
    cout << "Red : " << nRed << " , Green : " << nGreen << " , Blue : " << nBlue << endl;
 
    return 0;
}
cs


Comments