2012-09-20 15 views
6

이것은 분명해야합니다. 그러나 매트 오브 OpenCV에서 모든 픽셀 중에서 최대 값을 찾는 쉬운 방법을 찾을 수 없습니다. 물론 각 픽셀 유형마다 다음과 같은 작업을 수행 할 수 있습니다. 그러나 일반적인 최대 기능은 여전히 ​​유용 할 것입니다.OpenCV에서 Mat의 최대 픽셀 값을 계산하는 방법

double cvMax(cv::Mat& mat) 
{ 
float max=0; 
float* pData=(float*)mat.data; 
for(int i=0;i<mat.rows;i++) 
{ 
    for(int j=0;j<mat.cols;j++) 
    { 
     float value = pData[j+i*mat.cols]; 
     if(value>max) 
     { 
      max=value; 
     } 
    } 
} 
return max; 
} 

답변

17

당신은 항상 OpenCV의

std::max_element(Mat.begin<double>(),Mat.end<double>()); 
+3

아마 max_element가 반복자를 반환한다고 언급 할 가치가 있습니다. – twerdster

+0

한 노트 : Mat iterator가 꽤 느린 것을 기대합니다. 행의 끝 부분에 도달했는지 확인해야하는 각 증가분 (Matrix가 불연속적일 수 있으며, 패딩 바이트가있을 수도 있습니다) – Antonio

9

이력서도 있습니다에서 반복자와 표준 max_element 기능을 사용할 수 있습니다 :: minMaxLoc 구축 함수는 사용할 수 있습니다. 그래도 std :: max_element는 더 간단합니다.

9

cv::minMaxIdx은 사용하기가 정말 간단합니다. 그것은 문서에 복잡하게 보이지만, 당신은 대부분의 매개 변수를 생략 할 수 있습니다 :

Mat m = ...; 

double min, max; 
minMaxIdx(m, &min, &max); 

printf("min: %f, max: %f\n", min, max); 

또한, cv::minMaxIdx는 10 배 이상 빠른 std::max_element보다. cv::minMaxIdxcv::Mat 데이터를 처리하는 데 최적화되어 있고 가능한 경우 여러 스레드를 사용하기 때문입니다.

이미지의 최소 및 최대 위치가 필요한 경우 cv::minMaxLoc을 사용할 수 있습니다.

관련 문제