首先原理和cpu的实现我这里就不赘述了,大家可以移步此篇文章,讲的很详细,并且gpu的代码也是按照这篇的思路去做的,链接:图像处理之双线性插值法。

下面直接贴代码:

CPU端实现:

void Resize(cv::Mat matDst1, cv::Mat matSrc) {uchar* dataDst = matDst1.data;int stepDst = matDst1.step;uchar* dataSrc = matSrc.data;int stepSrc = matSrc.step;int iWidthSrc = matSrc.cols;int iHiehgtSrc = matSrc.rows;float scale_x = (float)iWidthSrc / matDst1.cols;float scale_y = (float)iHiehgtSrc / matDst1.rows;for (int j = 0; j < matDst1.rows; ++j){float fy = (float)((j + 0.5) * scale_y - 0.5);int sy = cvFloor(fy);fy -= sy;sy = std::min(sy, iHiehgtSrc - 2);sy = std::max(0, sy);short cbufy[2];cbufy[0] = cv::saturate_cast<short>((1.f - fy) * 2048);cbufy[1] = 2048 - cbufy[0];for (int i = 0; i < matDst1.cols; ++i){float fx = (float)((i + 0.5) * scale_x - 0.5);int sx = cvFloor(fx);fx -= sx;if (sx < 0) {fx = 0, sx = 0;}if (sx >= iWidthSrc - 1) {fx = 0, sx = iWidthSrc - 2;}short cbufx[2];cbufx[0] = cv::saturate_cast<short>((1.f - fx) * 2048);cbufx[1] = 2048 - cbufx[0];for (int k = 0; k < matSrc.channels(); ++k){*(dataDst + j * stepDst + 3 * i + k) = (*(dataSrc + sy * stepSrc + 3 * sx + k) * cbufx[0] * cbufy[0] +*(dataSrc + (sy + 1)*stepSrc + 3 * sx + k) * cbufx[0] * cbufy[1] +*(dataSrc + sy * stepSrc + 3 * (sx + 1) + k) * cbufx[1] * cbufy[0] +*(dataSrc + (sy + 1)*stepSrc + 3 * (sx + 1) + k) * cbufx[1] * cbufy[1]) >> 22;}}}
}

GPU端实现:

__global__ void CudaResizeKernel(uint8_t* dataSrc, int widthSrc, int heightSrc, int stepSrc, uint8_t* dataDst, int widthDst, int heightDst, int stepDst, float scale_x, float scale_y, int chanel) {int x = blockIdx.x * blockDim.x + threadIdx.x;int y = blockIdx.y * blockDim.y + threadIdx.y;if (x < widthDst && y < heightDst) {float fy = (float)((y + 0.5) * scale_y - 0.5);int sy = floor(fy);fy -= sy;sy = sy <= heightSrc - 2 ? sy : heightSrc - 2;sy = sy >= 0 ? sy : 0;short cbufy[2];//cbufy[0] = (1.f - fy) * 2048 < -32768 ? -32768 : (cbufy[0] = (1.f - fy) * 2048 > 32767 ? 32767 : (1.f - fy) * 2048);cbufy[0] = (1.f - fy) * 2048;cbufy[1] = 2048 - cbufy[0];float fx = (float)((x + 0.5) * scale_x - 0.5);int sx = floor(fx);fx -= sx;if (sx < 0) {fx = 0, sx = 0;}if (sx >= widthSrc - 1) {fx = 0, sx = widthSrc - 2;}short cbufx[2];//cbufx[0] = (1.f - fx) * 2048 < -32768 ? -32768 : (cbufy[0] = (1.f - fx) * 2048 > 32767 ? 32767 : (1.f - fx) * 2048);cbufx[0] = (1.f - fx) * 2048;cbufx[1] = 2048 - cbufx[0];for (int k = 0; k < chanel; ++k){*(dataDst + y * stepDst + 3 * x + k) = (*(dataSrc + sy * stepSrc + 3 * sx + k) * cbufx[0] * cbufy[0] +*(dataSrc + (sy + 1)*stepSrc + 3 * sx + k) * cbufx[0] * cbufy[1] +*(dataSrc + sy * stepSrc + 3 * (sx + 1) + k) * cbufx[1] * cbufy[0] +*(dataSrc + (sy + 1)*stepSrc + 3 * (sx + 1) + k) * cbufx[1] * cbufy[1]) >> 22;}}
}

GPU端调用:

void CudaResize(uint8_t* dataSrc, int widthSrc, int heightSrc, int stepSrc, uint8_t* dataDst, int widthDst, int heightDst, int stepDst, int chanel) {dim3 dimGrid(widthDst + 32 - 1 / 32, heightDst + 32 - 1 / 32);dim3 dimBlock(32, 32);float xScale = (float)widthSrc / widthDst;float yScale = (float)heightSrc / heightDst;CudaResizeKernel << < dimGrid, dimBlock >> > (dataSrc, widthSrc, heightSrc, stepSrc, dataDst, widthDst, heightDst, stepDst, xScale, yScale, 3);

效率还没有测试过,欢迎沟通和学习本人qq:37593238,添加请注明题目,如需转载请请注明出处。

我与计算机视觉-[CUDA]-[Opencv.Resize的CPU实现和GPU实现]相关推荐

  1. CUDA:工作负载遵循CPU预处理->GPU处理->CPU后处理的形式的实例

    CUDA:工作负载遵循CPU预处理->GPU处理->CPU后处理的形式的实例 multithreading.h multithreading.cpp Callback.cu multith ...

  2. [CUDA OpenCV]GPU加速的计算机视觉学习资源下载

    点击我爱计算机视觉标星,更快获取CVML新技术 今天跟大家介绍一本学习CUDA加速的OpenCV的新书<Hands-On GPU-Accelerated Computer Vision with ...

  3. 计算机视觉:Opencv图像去畸变

    计算机视觉:Opencv图像去畸变 针孔相机模型图像去畸变 方法一 方法二 区别与联系 鱼眼相机模型图像去畸变 方法一 方法二 区别与联系 参考文献 针孔相机模型图像去畸变 针对畸变参数,k1,k2, ...

  4. RuntimeError: Expected object of backend CUDA but got backend CPU for argument

    RuntimeError: Expected object of backend CUDA but got backend CPU for argument #4 'mat1' 原因:变量没有加cud ...

  5. matlab中imresize函数的用法,为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同

    为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同?今年 4 月,我在依照 MATLAB 代码自己写一个卷积神经网络 C++ 实现的过程中,就发现了这个问题,不过那 ...

  6. RuntimeError: Expected object of backend CUDA but got backend CPU for argument #4 'mat1'

    RuntimeError: Expected object of backend CUDA but got backend CPU for argument #4 'mat1' 原因:变量没有加cud ...

  7. linux下cpu opencl加速,GPU挑战CPU!详解CUDA+OpenCL威力

    众所周知,GPU拥有数十倍于CPU的浮点运算能力,但如此强大的实力多数情况下只能用来玩游戏,岂不可惜?因此近年来业界都在致力于发掘GPU的潜能,让它能够在非3D.非图形领域大展拳脚. 1999年,首颗 ...

  8. matlab运行dxcv,MATLAB imresize 函数和 OpenCV resize 函数结果不同

    为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同?今年 4 月,我在依照 MATLAB 代码自己写一个卷积神经网络 C++ 实现的过程中,就发现了这个问题,不过那 ...

  9. 开源计算机视觉库 OpenCV 被曝两个严重的任意代码执行漏洞(详情)

    聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 开源计算机视觉库 OpenCV中修复了两个高危的缓冲区溢出漏洞,它们本可导致任意代码执行的后果. OpenCV是一款开源库,它由Inte ...

最新文章

  1. Unix的轻巧“约取而实得”(上篇)
  2. C语言static 具体分析
  3. 遍历查询ldap服务器用户
  4. Arduino--二维码显示
  5. 频偏纠正matlab实现,Matlab关于OFDM同步定时估计和频偏估计的算法
  6. Git使用中报错fatal: The current branch master has no upstream branch.解决方案
  7. java出现中文乱码_JAVA中文显示乱码问题
  8. python语法详解大全_Python语法大全
  9. 什么是UDS诊断协议?
  10. 基于JSP的旅游网站系统
  11. 外壳IK防护等级测试
  12. 肥猫学习笔记---C语言数据结构与算法(一)-----栈
  13. 总结jQuery中的DOM节点属性
  14. python批量修改图片的分辨率dpi值
  15. 再不复工,公司就要发现没有我们也能正常运转了
  16. mail 使用QQ邮箱
  17. 联想小娜怎么开启_联想小娜怎么唤醒
  18. 如何高效的寻找Github项目
  19. 计算机基础知识2001年版本,2001年4月份《计算机应用基础》试题及答案(全国)...
  20. mysql序列号生成_忘掉 Snowflake,感受一下性能高出587倍的全局唯一ID生成算法

热门文章

  1. 计算机的发展英语思维导图,国外对思维导图概念图的研究发展
  2. 任天旭的HTML案例
  3. 0.4 - 铝合金牌号及常用铝合金牌号用途
  4. Alias.StudioTools.Techniques.Art.To.Part
  5. 揭密开心网:创始人无专属办公室月薪9000
  6. 【可视化编程】实验4:C#窗体和控件综合设计(多文本编辑器)
  7. Ubuntu 12.04版本不能正确识别显示器的解决办法
  8. 北京化工大学计算机科专业,北京化工大学新高考选科要求-北京化工大学选科对应专业...
  9. 【Unity入门计划】基本概念(6)-精灵渲染器 Sprite Renderer
  10. 苹果iPhone6为何挽救不了富士康?