2012-10-08 3 views
2

나는 intensity equalization을 위해 안드로이드에서이 opencv 코드를 사용하고 있습니다. 실행 시간은 프레임 당 약 300ms (720x480)입니다. 누구든지 가능한 시간 최적화에 대한 아이디어가 있습니까?Opencv 안드로이드 코드 최적화

 cvtColor(image, hsvImage, CV_BGR2HSV); 
     // Get intensity 
     intensity = hsvImage.at<Vec3b>((int)reference.Point_::y, (int)reference.Point_::x); 
     float value = (float)REGULAR_INTENSITY/intensity[2]; 
     float saturation = (float)REGULAR_SATURATION/intensity[1]; 
     if (counter == 15 && (int)intensity[2] < REGULAR_INTENSITY) { 
      equalization = false; 
     } 
     // Modify intensity 
     float transformedSaturation, transformedValue; 
     for(int i = 0; i < hsvImage.rows; i++) { 
      unsigned char *data = hsvImage.ptr(i); 
      for(int j = 0; j < hsvImage.cols; j++) { 
       transformedSaturation = (uchar)*++data * saturation; 
       if (transformedSaturation > MAX_COLOR) { 
        transformedSaturation = MAX_COLOR; 
       } 
       *data++ = transformedSaturation; 
       transformedValue = (uchar)*data * value; 
       if (transformedValue > MAX_COLOR) { 
        transformedValue = MAX_COLOR; 
       } 
       *data++ = transformedValue; 
      } 
     } 
     cvtColor(hsvImage, image, CV_HSV2BGR); 
+0

당신은 어떤 코드 조각이 대부분의 시간을 소비하는지 알아 냈습니까? cvtColor와 메인 루프에 얼마나 많은 시간을 소비 했습니까? – james

+0

마지막 줄 : CV_HSV2BGR 변환. 나는 아무 것도 할 수 없다고 생각한다. –

+1

적용 가능한 경우 색상 변환을 위해 gpu :: cvtColor 사용을 고려하십시오. – remi

답변

2

당신이 OpenCV의 transform를 사용하여 시도 유무 : 여기

코드인가? 나는 그것이 최적화 된 것 같아요,하지만 포화 캐스팅에 대해 모르겠다 (그 경우> max_color, 다음 = 최대 색상)

+0

고마워요.하지만 알다시피, 나는 src 배열에 의존하는 배열을 곱하고 있습니다. 정적이 아닙니다. –

+0

Intensity, Value, Saturation에 대한 배율을 계산하고이 값을 사용하여 전체 데이터를 균등하게합니다. 그래서 당신은 1x3 행렬을 생성하고, 채도, 채도, 값을 채우고 cv :: transform을 호출해야합니다. – remi