728x90
반응형





OpenCV 픽셀 값 접근하기 - cvMat 데이터 구조






저번 OpenCV 픽셀 값 접근하기 - IplImage 데이터구조 포스팅 http://eehoeskrap.tistory.com/33


지난 포스팅에서는 IplImage 데이터 구조에서 픽셀 값에 어떻게 접근하는지에 대해 포스팅하였다. 이번에는 OpenCV cv::Mat 데이터 구조에서 각 픽셀에 어떻게 접근하는지에 대해 살펴보겠다.



Gray 흑백 영상의 경우


Image.at<uchar>(x, y);






BGR 컬러 영상의 경우 


(RGB 컬러 영상을 뜻함, 보통 화소값 자체에는 BGRBGR..순서로 되어있음을 유의)


using namespace cv;


Image.at<Vec3b>(x, y)[0];           // Blue

Image.at<Vec3b>(x, y)[1];        // Green

Image.at<Vec3b>(x, y)[2];           // Red




흑백 영상의 경우는 채널이 하나(1)이기 때문에 배열, 즉 인덱스 방식을 사용하지 않는다. 컬러 영상의 경우 채널이 세개(3)이기 때문에 배열, 즉 인덱스 방식을 사용한다.




다음은 cvMat 데이터 구조에서 픽셀 값에 직접 접근하는 대표적인 예제인 소금뿌리기 예제이다.



소스코드는 아래와 같다.





 
#include<opencv2/core.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>

using namespace std;
using namespace cv;

void salt(Mat &image, int snum){
	for (int n = 0; n < snum; n++)
	{
		int x = rand() % image.cols;
		int y = rand() % image.rows;

		if (image.channels() == 1) // Gray 영상일 경우
		{
			image.at<uchar>(x, y) = 255; // 255는 흰색
		} else if (image.channels()==3) // RGB 영상일 경우
		{
			image.at<Vec3b>(y, x)[0] = 255;
			image.at<Vec3b>(y, x)[1] = 255;
			image.at<Vec3b>(y, x)[2] = 255;
		}
	}
}

int main()
{
	Mat image = imread("lena.png"); // ("lena.png",0) 이면 Gray 영상으로 열기
	salt(image, 15000);
	imshow("소금뿌리기 ㅇㅅㅇ", image);
	waitKey(0);
}






예쁜 레나 얼굴에 만 오천개의 소금을 뿌려주었다.






728x90
반응형