2017-01-12 10 views
0

인터넷 및 stackoverflow를 철저히 검색했지만 정확히 무엇을 찾고 있는지 찾지 못했습니다!openCV의 특정 이미지에있는 모든 픽셀의 RGB 값에 액세스

OpenCV에서 특정 이미지 (이미지의 모든 픽셀)의 RGB (실제로 BGR) 값을 어떻게 얻을 수 있습니까? 나는 C++을 사용하고 있고, 이미지는 cv :: Mat 변수에 저장되어있다.

나는 지금까지 내 노력 중 일부를 보여주고있다 : 나는 다른 stackoverflow 링크에서이 코드를 시도했다. 그러나 코드를 다시 실행할 때마다 16 진수 값이 변경되었습니다! 예를 들어 한 번 00CD5D7C, 다음 실행 00C09D7C입니다.

cv::Mat img_rgb = cv::imread("img6.jpg"); 
Point3_<uchar>* p = img_rgb.ptr<Point3_<uchar> >(10,10); 
p->x; //B 
p->y; //G 
p->z; //R 
std::cout<<p; 

다른 시도에서 나는이 코드를 다른 대답에서 사용했습니다. 여기서 출력은 항상 -858993460입니다.

img_rgb.at<cv::Vec3b>(10,10); 
img_rgb.at<cv::Vec3b>(10,10)[0] = newval[0]; 
img_rgb.at<cv::Vec3b>(10,10)[1] = newval[1]; 
img_rgb.at<cv::Vec3b>(10,10)[2] = newval[2]; 

cout<<newval[0]; //For cout<<newval[1]; cout<<newval[2]; the result is still same 

참고 : RGB를 얻으려는 테스트에 (10,10)을 사용했습니다. 전체 이미지가 RGB 값을 얻습니다!

+0

당신이하고있는 일을 이해하려고하는 것조차 보이지 않는 것 같습니다. 'std :: cout << img_rgb.at를 사용하십시오 (10,10); – Miki

+0

@Miki 나는 이것이 매우 어리 석다는 것을 깨닫지 못했습니다! 답변 주셔서 감사합니다 :) 그것은 정말 잘 작동합니다. –

+1

[OpenCV의 특정 픽셀 RGB 값에 액세스] 가능한 중복 (http://stackoverflow.com/questions/8932893/accessing-certain-pixel-rgb-value-in-opencv) – TylerH

답변

0

컬러 이미지 (CV_8UC3 유형)를로드 중이므로 .at<Vec3b>(row, col)으로 해당 요소에 액세스해야합니다. 요소는 BGR 순서에 있습니다

Mat img_bgr = imread("path_to_img"); 

for(int r = 0; r < img_bgr.rows; ++r) { 
    for(int c = 0; c < img_bgr.cols; ++c) { 
     std::cout << "Pixel at position (x, y) : (" << c << ", " << r << ") =" << 
      img_bgr.at<Vec3b>(r,c) << std::endl; 
    } 
} 

당신은 당신이 .at 기능을 사용할 필요가 없습니다 또한, (일명 Mat_<Vec3b>) Mat3b를 사용하여 간단하지만 직접 괄호를 사용 할 수 있습니다

Mat3b img_bgr = imread("path_to_img"); 

for(int r = 0; r < img_bgr.rows; ++r) { 
    for(int c = 0; c < img_bgr.cols; ++c) { 
     std::cout << "Pixel at position (x, y) : (" << c << ", " << r << ") =" << 
      img_bgr(r,c) << std::endl; 
    } 
} 

을 각 단일 채널을 얻으려면 다음을 쉽게 수행 할 수 있습니다.

Vec3b pixel = img_bgr(r,c); // or img_bgr.at<Vec3b>(r,c) 
uchar blue = pixel[0]; 
uchar green = pixel[1]; 
uchar red = pixel[2]; 
+0

좋은 설명 선생님, 정말 고마워요! 그리고 이메일 주소를 찾았습니다. 컴퓨터 비전의 초보자로서 가까운 장래에 더 신경 쓸 것 같아요. –

+1

@ TousifZaman 커뮤니티가 응답으로 혜택을 누릴 수 있도록 전자 메일이 아닌 StackOverflow에 미래의 질문을 게시하십시오. – merlinND

+0

@merlinND 물론, 제 질문은 항상 여기에 올 것입니다. 나는이 분야에서 몇 가지 기술과 팁 및 제안을 노크 할 것이다. StackOverflow는 내가 생각하는 곳이 아닙니다. –