OpenCV有很强大的矩阵运算能力,最近想实现一个二值化图片横向像素点个数统计,很容易想到的就是一行一行的累加计算就完事了。转成计算机语言就是一个二重循环,大致的代码逻辑如下:
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);
}
}
当然这么做对小像素图片来说问题也不大,从计算机角度来讲,想要优化它就是利用GPU的并行计算。这里面有OpenCL、CUDA等选择。至于高像素的图片到底性能上差多远,具体这里不做讨论。
OpenCV里面的矩阵计算是已经对针对不同硬件平台最优化了,不需要自己再考虑基于计算机角度上的优化。因此可以好好利用这一特性。
支持运算Mat矩阵有一定的限制,先要转换数据类型:
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));
相乘,即可得到横向像素点的统计:
Mat sum_row = mat_c * s_mat;
取值,得到的结果可以转换成数组,也可以用于继续计算。
for(int i = 0; i < y_sum.rows; i++)
{
sum_row.at<_Float32>(i,0);
}
网友评论