美文网首页
利用OpenCV里Mat数据类型进行矩阵运算

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

作者: Venyeh_Hoo | 来源:发表于2018-12-01 19:39 被阅读0次

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);
}

相关文章

网友评论

      本文标题:利用OpenCV里Mat数据类型进行矩阵运算

      本文链接:https://www.haomeiwen.com/subject/vcsrcqtx.html