2016-06-23 6 views
0

jpg 파일이 있습니다.이 파일을 BGR 용 n * 3, 3 열, jpg 이미지의 픽셀 수에 대한 n 행으로 재 배열하고 싶습니다.opencv mat을 만들고 요소를 추가하십시오.

여기까지 제가 한 것입니다. 이 코드를 실행하기 전에

Mat img = imread(test.jpg); 
    Mat imgHSV; 
    cvtColor(img, imgHSV, COLOR_BGR2HSV); 
    vector<Mat> imgHSV_split; 
    split(imgHSV,imgHSV_split); //split the 3 channel image into 3 single channel mats 

Mat img_combind_feature(imgHSV.rows*imgHSV.cols(),3,CV_8UC1); 
for(int i=0; i < imgHSV.row; i++){ 
for(int j=0; j < imgHSV.col; j++){ 


for (int k=0; k<3; k++){ 


img_combind_feature.row(l).col(k) = imgHSV_split[k].row(i).col(j); 

} 
} 
} 

, 난

Mat img = imread(test.jpg); 
    Mat imgHSV; 
    cvtColor(img, imgHSV, COLOR_BGR2HSV); 
    vector<Mat> imgHSV_split; 
    split(imgHSV,imgHSV_split); //split the 3 channel image into 3 single channel mats 

Mat img_combind_feature(1,3,CV_8UI1); 
img_combind_feature.row(0).col(0) = imgHSV_split[0].row(0).col(0); 

img_combind_feature.row(0).col(1) = imgHSV_split[1].row(0).col(0); 

img_combind_feature.row(0).col(2) = imgHSV_split[2].row(0).col(0); 


cout << imgHSV_split[0].row(0).col(0) << endl; 
cout << img_combind_feature.row(0).col(0) << endl; 

두 출력이 다른 간단한 3 * 3 버전을 시도했다.

[ 43] [232] 두 매트 간의 데이터 유형 변환이 원인입니까? 그리고 이렇게하는 것이 더 쉬운 방법이 있다면, 이것이 좋은 방법이라고 확신하지 못합니까?

답변

0

너는 이것을 과장하고있어. n x 3 당신이 찾고있는 것

Mat img = ... // 3 channels 

int n = img.rows * img.cols; 
Mat data = img.reshape(1, n); // 1 channel, n rows, the # of cols will be automaticallt set to 3. 

data :

는 단순히 같은 reshape를 사용할 수 n = rows * cols과 더불어, n x 3에 3 채널 이미지 rows x cols을 돌립니다.


대부분의 경우, 당신은 CV_32F 입력 행렬을 필요로 kmeansdata를 사용해야합니다. 그럼 당신은 CV_32F 등을 data을 변환 할 수 있습니다

data.convertTo(data, CV_32F); 

당신은 원래의 모양으로 결과를 복원하는 방법도 보여줍니다 kmeans와 예에 대한보고 here을 가질 수 있습니다.

+0

정확히 내가 kmeans에 필요한 것입니다! 고맙습니다! – tomu

+0

도움이 되니 기뻐요 D – Miki

+0

나는 진드기를 클릭했는데 그것은 초록색으로 받아 들여진다. – tomu

관련 문제