OpenCV中的矢量化卷积

本文介绍了从一维卷积的基本实现到矢量化优化的过程,以及在2-D卷积中的应用,涉及SIMD加速和OpenCV库。同时提到了AI和机器学习领域的相关资源。
摘要由CSDN通过智能技术生成

我们将首先实现一维卷积,然后对其进行矢量化。2-D 矢量化卷积将在各行之间执行 1-D 卷积以产生正确的结果。

一维卷积:标量

void conv1d(Mat src, Mat &dst, Mat 内核)

{

​ int len = src.cols;

dst = Mat(1, len, CV_8UC1);

​ int sz = kernel.cols / 2;

copyMakeBorder(src, src, 0, 0, sz, sz, BORDER_REPLICATE);

​ for (int i = 0; i < len; i++)

​ {

​ double 值 = 0;

​ for (int k = -sz; k <= sz; k++)

值 += src.ptr(0)[i + k + sz] * kernel.ptr(0)[k + sz];

dst.ptr(0)[i] = saturate_cast(值);

​ }

}

  1. 我们首先设置变量并在 src 矩阵的两侧创建边框,以处理边缘情况。

    ​ int len = src.cols;

    dst = Mat(1, len, CV_8UC1);

    ​ int sz = kernel.cols / 2;

    copyMakeBorder(src, src, 0, 0, sz, sz, BORDER_REPLICATE);

  2. 对于主循环,我们选择一个索引 i,并使用 k 变量将其与内核一起偏移。我们将值存储在 value 中,并将其添加到 dst 矩阵中。

    ​ for (int i = 0; i < len; i++)

    ​ {

    ​ double 值 = 0;

    ​ for (int k = -sz; k <= sz; k++)

    值 += src.ptr(0)[i + k + sz] * kernel.ptr(0)[k + sz];

    dst.ptr(0)[i] = saturate_cast(值);

    ​ }

    一维卷积:矢量

我们现在将看一维卷积的矢量化版本。

void conv1dsimd(Mat src, Mat 内核, float *ans, int row = 0, int rowk = 0, int len = -1)

{

​ 如果 (len == -1)

len = src.cols;

Mat src_32,kernel_32;

​ const int alpha = 1;

src.convertTo(src_32, CV_32FC1, alpha);

​ int ksize = kernel.cols, sz = kernel.cols / 2;

copyMakeBorder(src_32, src_32, 0, 0, sz, sz, BORDER_REPLICATE);

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值