利用OpenCV里Mat数据类型进行矩阵运算


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);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容