opencv Mat 求元素 中值 均值 總和
阿新 • • 發佈:2019-02-04
搜尋和很久,還是沒有發現求mat 內元素的中值函式,於是自己寫了一個
float Median_Mat_32f(Mat img) { float *buf; buf = new float[img.rows*img.cols]; for (int i =0; i < img.rows; i++) { for (int j = 0; j < img.cols; j++) { buf[i*img.cols+j] = img.ptr<float>(i)[j]; } } qsort(buf, 3, sizeof(buf[0]), comp); return buf[img.rows*img.cols/2]; }
資料型別不確定,於是又想起了寫一個模板
上程式碼:
//比較兩數大小 template <typename _Tp> int mem_cmp(const void *a, const void *b) { //當_Tp為浮點型,可能由於精度,會影響排序 return (*((_Tp *)a) - *((_Tp *)b)); } //求Mat元素中值 template <typename _Tp> _Tp medianElem(Mat img) { _Tp *buf; size_t total = img.total(); buf = new _Tp[total]; for (int i = 0; i < img.rows; i++) { for (int j = 0; j < img.cols; j++) { buf[i*img.cols+j] = img.ptr<_Tp>(i)[j]; } } qsort(buf, total, sizeof(_Tp), mem_cmp<_Tp>); return buf[total/2]; }
//求Mat元素總和(單通道) template <typename _Tp> double sumElem(Mat img) { double sum = 0; for (int i = 0; i < img.rows; i++) { for (int j = 0; j < img.cols; j++) { sum += img.ptr<_Tp>(i)[j]; } } return sum; } //求Mat元素均值(單通道) template <typename _Tp> _Tp sumElem(Mat img) { return _Tp(sumElem<_Tp>(img)/img.total()); }
這樣就好用多了。
歡迎拍磚~