OpenCV有很強(qiáng)大的矩陣運(yùn)算能力,最近想實(shí)現(xiàn)一個二值化圖片橫向像素點(diǎn)個數(shù)統(tǒng)計岸晦,很容易想到的就是一行一行的累加計算就完事了直颅。轉(zhuǎn)成計算機(jī)語言就是一個二重循環(huán)褪秀,大致的代碼邏輯如下:
for(int i = 0; i < IMG_H; i++)
{
int sum_row = 0;
for(int j = 0; j < IMG_W; j++)
{
sum_row += bin_img.at<uchar>(i, j);
}
}
當(dāng)然這么做對小像素圖片來說問題也不大,從計算機(jī)角度來講绽慈,想要優(yōu)化它就是利用GPU的并行計算恨旱。這里面有OpenCL、CUDA等選擇坝疼。至于高像素的圖片到底性能上差多遠(yuǎn)搜贤,具體這里不做討論。
OpenCV里面的矩陣計算是已經(jīng)對針對不同硬件平臺最優(yōu)化了裙士,不需要自己再考慮基于計算機(jī)角度上的優(yōu)化入客。因此可以好好利用這一特性。
支持運(yùn)算Mat矩陣有一定的限制,先要轉(zhuǎn)換數(shù)據(jù)類型:
Mat mat_c;
// 只有32FC1, 32FC2, 64FC1, 64FC2才支持乘法
mat.convertTo(mat_c, CV_32FC1, -1 / 255.0, 1);
初始化一個單列矩陣:
Mat s_mat(mat.cols, 1, CV_32FC1, Scalar(1.0));
相乘桌硫,即可得到橫向像素點(diǎn)的統(tǒng)計:
Mat sum_row = mat_c * s_mat;
取值夭咬,得到的結(jié)果可以轉(zhuǎn)換成數(shù)組,也可以用于繼續(xù)計算铆隘。
for(int i = 0; i < y_sum.rows; i++)
{
sum_row.at<_Float32>(i,0);
}