我与计算机视觉-[CUDA]-[Opencv.Resize的CPU实现和GPU实现]
首先原理和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实现]相关推荐
- CUDA:工作负载遵循CPU预处理->GPU处理->CPU后处理的形式的实例
CUDA:工作负载遵循CPU预处理->GPU处理->CPU后处理的形式的实例 multithreading.h multithreading.cpp Callback.cu multith ...
- [CUDA OpenCV]GPU加速的计算机视觉学习资源下载
点击我爱计算机视觉标星,更快获取CVML新技术 今天跟大家介绍一本学习CUDA加速的OpenCV的新书<Hands-On GPU-Accelerated Computer Vision with ...
- 计算机视觉:Opencv图像去畸变
计算机视觉:Opencv图像去畸变 针孔相机模型图像去畸变 方法一 方法二 区别与联系 鱼眼相机模型图像去畸变 方法一 方法二 区别与联系 参考文献 针孔相机模型图像去畸变 针对畸变参数,k1,k2, ...
- 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 ...
- matlab中imresize函数的用法,为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同
为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同?今年 4 月,我在依照 MATLAB 代码自己写一个卷积神经网络 C++ 实现的过程中,就发现了这个问题,不过那 ...
- 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 ...
- linux下cpu opencl加速,GPU挑战CPU!详解CUDA+OpenCL威力
众所周知,GPU拥有数十倍于CPU的浮点运算能力,但如此强大的实力多数情况下只能用来玩游戏,岂不可惜?因此近年来业界都在致力于发掘GPU的潜能,让它能够在非3D.非图形领域大展拳脚. 1999年,首颗 ...
- matlab运行dxcv,MATLAB imresize 函数和 OpenCV resize 函数结果不同
为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同?今年 4 月,我在依照 MATLAB 代码自己写一个卷积神经网络 C++ 实现的过程中,就发现了这个问题,不过那 ...
- 开源计算机视觉库 OpenCV 被曝两个严重的任意代码执行漏洞(详情)
聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 开源计算机视觉库 OpenCV中修复了两个高危的缓冲区溢出漏洞,它们本可导致任意代码执行的后果. OpenCV是一款开源库,它由Inte ...
最新文章
- Unix的轻巧“约取而实得”(上篇)
- C语言static 具体分析
- 遍历查询ldap服务器用户
- Arduino--二维码显示
- 频偏纠正matlab实现,Matlab关于OFDM同步定时估计和频偏估计的算法
- Git使用中报错fatal: The current branch master has no upstream branch.解决方案
- java出现中文乱码_JAVA中文显示乱码问题
- python语法详解大全_Python语法大全
- 什么是UDS诊断协议?
- 基于JSP的旅游网站系统
- 外壳IK防护等级测试
- 肥猫学习笔记---C语言数据结构与算法(一)-----栈
- 总结jQuery中的DOM节点属性
- python批量修改图片的分辨率dpi值
- 再不复工,公司就要发现没有我们也能正常运转了
- mail 使用QQ邮箱
- 联想小娜怎么开启_联想小娜怎么唤醒
- 如何高效的寻找Github项目
- 计算机基础知识2001年版本,2001年4月份《计算机应用基础》试题及答案(全国)...
- mysql序列号生成_忘掉 Snowflake,感受一下性能高出587倍的全局唯一ID生成算法
热门文章
- 计算机的发展英语思维导图,国外对思维导图概念图的研究发展
- 任天旭的HTML案例
- 0.4 - 铝合金牌号及常用铝合金牌号用途
- Alias.StudioTools.Techniques.Art.To.Part
- 揭密开心网:创始人无专属办公室月薪9000
- 【可视化编程】实验4:C#窗体和控件综合设计(多文本编辑器)
- Ubuntu 12.04版本不能正确识别显示器的解决办法
- 北京化工大学计算机科专业,北京化工大学新高考选科要求-北京化工大学选科对应专业...
- 【Unity入门计划】基本概念(6)-精灵渲染器 Sprite Renderer
- 苹果iPhone6为何挽救不了富士康?