2013-09-24 5 views
0

Visual Studio 2012와 Opencv 라이브러리 2.4.6 버전으로 프로그래밍 중입니다.split() 함수를 사용하지 않고 BGR 행렬을 나눕니다.

누군가가 BGR 이미지를 모든 채널에 하나씩 세 개의 이미지로 나누는 것에 대해 도움을 줄 수 있습니까?

OpenCV에 분할 기능이 있다는 것을 알고 있지만 32 비트 라이브러리가있는 64 비트 프로세서가 있거나 아마도 라이브러리 버전이므로 처리되지 않은 예외가 발생합니다. split()을 사용하지 않고 BGR 행렬의 픽셀 값을 반복하는 법을 알아야합니다.

미리 감사드립니다.

+4

더 나은 해결책은'split()'을 사용하여 근본적인 문제를 해결하는 것입니다. – Aurelius

답변

1

split()을 사용하지 않으려면 원본 이미지에서 각 r, g, b 픽셀 값을 읽고 대상 이미지에 쓸 수 있으며 단일 채널이어야합니다.

#include <stdio.h> 
#include <opencv2/opencv.hpp> 
#include <iostream> 

using namespace cv; 
using namespace std; 


int main(int argc, const char** argv){ 

Mat src = imread("ball.jpg", 1); 
Mat r(src.rows,src.cols,CV_8UC1); 
Mat g(src.rows,src.cols,CV_8UC1); 
Mat b(src.rows,src.cols,CV_8UC1); 

for(int i=0;i<src.rows;i++){ 
    for(int j=0;j<src.cols;j++){ 
    Vec3b pixel = src.at<Vec3b>(i, j); 
    b.at<uchar>(i,j) = pixel[0]; 
    g.at<uchar>(i,j) = pixel[1]; 
    r.at<uchar>(i,j) = pixel[2]; 
    } 
    } 

    imshow("src", src); 
    imshow("r", r); 
    imshow("g", g); 
    imshow("b", b); 

    waitKey(0); 
} 
+0

감사합니다. – user140888

+0

당신은 오신 것을 환영합니다. – Haris