1. 程式人生 > >OpenCV中的均值與最值的計算

OpenCV中的均值與最值的計算

搜尋和很久,還是沒有發現求mat 內元素的中值函式,於是自己寫了一個

  1. float Median_Mat_32f(Mat img)  
  2. {  
  3.     float *buf;  
  4.     buf = newfloat[img.rows*img.cols];  
  5.     for (int i =0; i < img.rows; i++)  
  6.     {  
  7.         for (int j = 0; j < img.cols; j++)  
  8.         {  
  9.             buf[i*img.cols+j] = img.ptr<float>(i)[j];  
  10.         }  
  11.     }  
  12.     qsort(buf, 3, sizeof(buf[0]), comp);  
  13.     return buf[img.rows*img.cols/2];  
  14. }  

資料型別不確定,於是又想起了寫一個模板

上程式碼:

  1. //比較兩數大小
  2. template <typename _Tp>  
  3. int mem_cmp(constvoid *a, constvoid *b)    
  4. {    
  5.     //當_Tp為浮點型,可能由於精度,會影響排序
  6.     return (*((_Tp *)a) - *((_Tp *)b));    
  7. }  
  8. //求Mat元素中值
  9. template <typename _Tp>  
  10. _Tp medianElem(Mat img)  
  11. {  
  12.     _Tp *buf;  
  13.     size_t total = img.total();  
  14.     buf = new _Tp[total];  
  15.     for (int i = 0; i < img.rows; i++)  
  16.     {    
  17.         for (int j = 0; j < img.cols; j++)  
  18.         {    
  19.             buf[i*img.cols+j] = img.ptr<_Tp>(i)[j];    
  20.         }    
  21.     }  
  22.     qsort(buf, total, sizeof(_Tp), mem_cmp<_Tp>);  
  23.     return buf[total/2];  
  24. }  
  1. //求Mat元素總和(單通道)
  2. template <typename _Tp>  
  3. double sumElem(Mat img)  
  4. {  
  5.     double sum = 0;  
  6.     for (int i = 0; i < img.rows; i++)  
  7.     {    
  8.         for (int j = 0; j < img.cols; j++)  
  9.         {    
  10.             sum += img.ptr<_Tp>(i)[j];    
  11.         }    
  12.     }  
  13.     return sum;  
  14. }  
  15. //求Mat元素均值(單通道)
  16. template <typename _Tp>  
  17. _Tp sumElem(Mat img)  
  18. {  
  19.     return _Tp(sumElem<_Tp>(img)/img.total());  
  20. }