2014-04-17 2 views
2

C++ 인터페이스를 통해 opencv를 사용하고 있습니다. 하나의 채널 이미지를 얻으려는 멀티 채널 이미지를 나타내는 cv::Mat m1이 있습니다. m2 픽셀은 m1 (해당 픽셀의 값은 여러 값을 갖는데 하나는 하나의 값임)에있는 해당 픽셀의 모든 값 중에서 최대 값을가집니다. 각 채널). 누구든지 m1에서 m2을 얻는 가장 효율적인 방법을 알고 있습니까?멀티 채널에서 최대 단일 채널 cv :: Mat cv :: Mat

+1

http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#void%20reduce%28InputArray%20src,%20OutputArray%20dst,%20int를 보라 % 20dtype, % 20int % 20rtype, % 20int % 20dtype % 29 그러나 폭 * 높이 3 채널 요소를 너비 * 높이 * 채널 행렬로 변환해야합니다. – Micka

+0

어떻게 변환 할 수 있습니까? Mat :: reshape()를 사용하고 있지만이 경우 행렬은 Mat :: IsCountinuous()를 만족해야합니다. –

답변

2

당신은 cv::reduce()Mat::reshape()를 사용하여이 작업을 수행 할 수 있습니다. 핵심은 행의 각 요소가 하나의 색상 구성 요소를 나타내는 단일 채널 이미지로 m1을 재구성하는 것입니다. m1.reshape(1, m1.total())을 통해이 작업을 수행 할 수 있습니다. 그런 다음 reduce()을 적용하면 최대 구성 요소 값을 포함하는 Mat이 표시되고 그 결과를 다시 모양을 바꾸어 모양이 m1이되는 간단한 문제가됩니다. 간단한 예는 다음과 같습니다

uchar data[] = {1,2,3, 3,1,2, 2,1,3, 3,2,1}; 
cv::Mat m1(2,2, CV_8UC3, data); // Maximum component value is 3 for all pixels 
cv::Mat m2; 
cv::reduce(m1.reshape(1, m1.total()), m2, 1, CV_REDUCE_MAX); 
m2 = m2.reshape(0, m1.cols); // 2x2 Mat, all elements are 3 
+0

나는 당신의 대답에 동의하고 그것을 제 문제에 적용 할 수 있습니다.하지만 OpenCV 문서에 따르면 m.IsContinuous()가 true를 반환 할 때만 m.reshape (x, y)를 적용 할 수 있습니다. 그 상황에서 어떤 대답? –

+0

나만의 솔루션을 작성 하시겠습니까? 해결하기가 어렵지 않습니다. – Aurelius

관련 문제