2017-11-21 10 views
-2
Mat imv; 
Mat_<double>end(1, 1); 
double distance; 
Mat_<double>Point(1, 3);  
... 
imv = Point.t(); 
end = Point*inv[m]*imv; 
distance = sqrt(end(0, 0)); 

변수 유형의 정의와 마할 라 노비스 거리의 계산 과정이 있습니다.opencv에서 Mahalanobis 거리를 계산하는 데 Mat 유형을 사용하면 속도가 너무 느립니다. 어떻게 효율을 향상시킬 수 있습니까?

+2

무엇이 궁금 했습니까? 어떤 벤치 마크를 측정 했습니까? 어떤 플랫폼을 사용하고 있습니까? 도움이 필요하시면 조금 더 노력하십시오! –

+0

세부 사항이 부족해서 죄송합니다. 데이터 (포인트)와 컬러 모델 (마르크 m은 색상 m의 공분산 행렬) 사이의 마하라 누 비스 거리를 계산하려고합니다. ROI의 모든 픽셀과 컬러 모델 간의 거리를 계산합니다 픽셀. 코드를 실행할 때 "end = Point * inv [m] * imv"에서 많은 시간을 소비합니다.이 파트를 최적화하는 방법을 알고 싶습니다. 형식 때문에 매트입니까? –

+0

아직 [mcve]가 없으며 측정이 완료되었다는 증거도 없습니다. –

답변

0

표현이 불투명합니다. 이미지의 모든 픽셀을 가로 지르고, 색상 모델과 마할 라 노비스 거리를 계산하려고합니다. 너무 느립니다. 항상 최적화를 수행해야한다고 생각했습니다. 매트릭스 곱셈의 효율성. 오늘은 순환 속도를 향상시키기 위해 멀티 스레드를 사용하여 효율성을 향상시키고 유용합니다.

#pragma omp parallel for num_threads(6) 
      for (int m = 0; m < k_num; m++) {  
       Mat_<double>end(1, 1); 
       double distance = 1000; 
       Mat_<double>Point(1, 3); 
       Point(0, 0) = double(data3[j * 3]) - mean1[m].at<double>(0, 0); 
       Point(0, 1) = double(data3[j * 3 + 1]) - mean1[m].at<double>(0, 1); 
       Point(0, 2) = double(data3[j * 3 + 2]) - mean1[m].at<double>(0, 2); 

       end = Point * inv[m] * Point.t(); 
       distance = sqrt(end(0, 0)); 
       } 
      }