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
반응형
'Programming > OpenCV' 카테고리의 다른 글
OpenCV Adaptive thresholding(적응적 경계화) (0) | 2016.01.18 |
---|---|
OpenCV 히스토그램 구현하기 (0) | 2016.01.18 |
Opencv 픽셀 값 접근하기 - IplImage 데이터 구조 (0) | 2016.01.05 |
OpenCV 트랙바 처리된 이진화 영상처리 in C++ (0) | 2016.01.05 |
OpenCV에서 IplImage와 Mat의 차이 그리고 호환 (2) | 2016.01.05 |