OpenCV中的均值與最值的計算
阿新 • • 發佈:2019-01-05
搜尋和很久,還是沒有發現求mat 內元素的中值函式,於是自己寫了一個
- float Median_Mat_32f(Mat img)
- {
- float *buf;
- buf = newfloat[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(constvoid *a, constvoid *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());
- }