2014-03-04 3 views
5

이미지가 4 채널이고 4 * UINT8 형식입니다.openCV의 convertto 기능이 작동하지 않는 이유는 무엇입니까?

내가 3 채널 부동 소수점으로 변환하려고 나는이 코드를 사용하고 있습니다 :

images.convertTo(images,CV_32FC3,1/255.0); 

를 변환 후, 이미지는 부동 소수점 형식으로되어 있지만, 여전히 4 개 채널이 있습니다. OpenCV에서 네 번째 (알파) 채널을 없애려면 어떻게해야합니까?

답변

8

@AldurDisciple이 Mat::convertTo()Mat의 데이터 형식을 변경하지 않는 수를 변경하는 데 사용하기위한 것입니다 말했듯 채널.

해결하려면 두 단계로 분할해야합니다

cvtColor(image, image, CV_BGRA2BGR);  // 1. change the number of channels 
image.convertTo(image, CV_32FC3, 1/255.0); // 2. change type to float and scale 
+0

안녕하세요 선생님, 무엇'1/255.0'합니까? 그것은 어떤 것에 유용합니까? –

+5

@Kabyle'1/255.0'은 배율 인수로 '[0, 255]'값을'[0, 1]'로 변환합니다. 자세한 내용은 ['Mat :: convertTo()'] (http://docs.opencv.org/modules/core/doc/basic_structures.html?highlight=convertto#mat-convertto)의 문서를 참조하십시오. – herohuyongtao

1

convertToMat의 데이터 유형을 독점적으로 변경하는 데 사용됩니다. 문서 (link)에 언급 된 바와 같이 출력 이미지의 채널 수는 입력 이미지와 항상 동일합니다.

당신이 채널의 수를 줄일 데이터 유형을 변경하려는 경우, 당신은 split, mergeconvertTo의 조합을 사용해야합니다

cv::Mat img_8UC4; 

cv::Mat chans[4]; 
cv::split(img_8UC4,chans); 

cv::Mat img_8UC3; 
cv::merge(chans,3,img_8UC3); 

cv::Mat img_32FC3; 
img_8UC3.convertTo(img_32FC3); 

는 또 다른 방법은 스스로 알고리즘을 코딩 할 수 있습니다를, 이것은 매우 쉽고 아마도 더 효율적입니다.

0

OpenCV의 cvtColor function을 사용하면 매트의 채널 유형 및 개수를 변환 할 수 있습니다.

void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0) 

그래서 이런 일이 색깔의 3 채널 컬러 4 채널을 변환하는 것입니다 :

cvtColor(image, image, CV_BGRA2BGR, 3);

또는 mixChannels function을 사용하는 것이 더 효율적입니다. 설명서를 확인한 경우 채널을 분할하는 방법을 보여주는 예제가 있습니다.

그럼 당신은 정말 특정 유형을 변경하려면 :

image.convertTo(image,CV_32F); 
관련 문제