一、介绍  

在机器时间领域我们做算法开发一般都会先在CPU上执行。CPU的全称是Central Processing Unit,而GPU的全称是Graphics Processing Unit。在命名上。这两种器件相同点是它们都是Processing Unit——处理单元;不同点是CPU是“核心的”,而GPU是用于“图像”处理的。在我们一般理解里,这些名称的确非常符合大众印象中它们的用途——一个是电脑的“大脑核心”,一个是图像方面的“处理器件”。但是聪明的人类并不会被简单的名称所束缚,他们发现GPU在一些场景下可以提供优于CPU的计算能力。

   

二、GPU线程与架构

在CUDA架构下, 显示芯片执行时的最小单位是thread. 数个thread可以组成一个block. 一个block中的thread能存取同一块共享的内存, 而且可以快速进行同步的动作. 不同block中的thread无法存取同一个共享的内存, 因此无法直接互通或进行同步. 因此, 不同block中的thread能合作的程度是比较低的.

然后依据thread, block和grid, 有着不同的存储. 核心就是thread. 可以结合下图进行理解:

    

三、基于GPU的双目三维重建

之前所做的多频外差法三维重建,单目三重建都是基于CPU架构使用c++编程实现的,目前工业上已经大范围需要使用三维重建技术来完成一些测量需求,因此三维重建的质量与效率都显的十分重要,哪个环境满足不了要求都无法实现工业化量产的要求。基于此背景我将之前开发的双目结构光和单目结构光均实现了GPU化,提高了三维重建效率。

实验环境,vs2013+CUDA9.0

硬件:结构光双目三维测量系统,相机分辨率130w和500w

void decMulPha5_GPU(unsigned char* GPUImageLeft, unsigned char* GPUImageRight,vector<unsigned char*> leftImage, vector<unsigned char*> rightImage, float* leftPhaseImg, float* rightPhaseImg, int w, int h)
{//InitCUDA();//使用event计算时间float time_elapsed = 0;cudaEvent_t start, stop;cudaEventCreate(&start);    //创建EventcudaEventCreate(&stop);cudaEventRecord(start, 0);    //记录数据准备时间// compute the size of dataconst size_t imageDataSize = sizeof(unsigned char) * w * h * PATTERNSNUM;// part1a. prepare the result data ,在设备端为结果开辟空间const size_t phaseDataSize = sizeof(float) * w * h;float* leftPhaseImage;float* rightPhaseImage;cudaMalloc(&leftPhaseImage, phaseDataSize);cudaMalloc(&rightPhaseImage, phaseDataSize);unsigned char* leftImageTexure; //left Imageunsigned char* rightImageTexure; //right ImagecudaMalloc(&leftImageTexure, imageDataSize);cudaMalloc(&rightImageTexure, imageDataSize);cudaDeviceSynchronize();  cudaMemcpy(leftImageTexure, GPUImageLeft, imageDataSize, cudaMemcpyHostToDevice);cudaMemcpy(rightImageTexure, GPUImageRight, imageDataSize, cudaMemcpyHostToDevice);cudaEventRecord(stop, 0);cudaEventSynchronize(stop);cudaEventElapsedTime(&time_elapsed, start, stop);printf("A: Time of prepare data: %f (ms)\n", time_elapsed);cudaEventRecord(start, 0);    //记录零均值化时间// part2. run kerneldim3 BlockDim(TX, TY);unsigned int bx = (w + BlockDim.x - 1) / BlockDim.x;unsigned int by = (h + BlockDim.y - 1) / BlockDim.y;dim3 GridDim(bx, by);DecMulPha5_Texture << < GridDim, BlockDim >> > (leftImageTexure, rightImageTexure, leftPhaseImage, rightPhaseImage, w, h);cudaDeviceSynchronize();cudaEventRecord(stop, 0);cudaEventSynchronize(stop);cudaEventElapsedTime(&time_elapsed, start, stop);printf("B: Time of DecMulPha5_Texture : %f (ms)\n", time_elapsed);// part3. copy the data from devicecudaEventRecord(start, 0);    //记录查找相关点时间cudaMemcpy(leftPhaseImg, leftPhaseImage, sizeof(float) * w * h, cudaMemcpyDeviceToHost);cudaMemcpy(rightPhaseImg, rightPhaseImage, sizeof(float) * w * h, cudaMemcpyDeviceToHost);cudaEventRecord(stop, 0);cudaEventSynchronize(stop);cudaEventElapsedTime(&time_elapsed, start, stop);printf("C: Time of copy memory from Device: %f (ms)\n", time_elapsed);// par4. release datacudaEventRecord(start, 0);    //记录释放内存时间cudaFree(leftImageTexure);cudaFree(rightImageTexure);cudaFree(leftPhaseImg);cudaFree(rightPhaseImg);free(GPUImageLeft);free(GPUImageRight);//free(leftPhaseImage);//free(rightPhaseImage);cudaEventRecord(stop, 0);cudaEventSynchronize(stop);cudaEventElapsedTime(&time_elapsed, start, stop);printf("D: Time of release data: %f (ms)\n", time_elapsed);
}

四、结论

采用的硬件与软件系统如图所示

最终的结果比对是用现在的GPU方式与之前的CPU方式进行重建时间的对比,如下表所示

相机分辨率 CPU处理时间/ms GPU处理时间/ms
1280*1024 1200ms~1300ms 230ms~280ms
2448*2048 3500ms~3800ms 900ms~1100ms

交流微信

基于GPU编程的三维重建系统相关推荐

  1. 基于GPU的医学图像三维重建体绘制技术综述

    2019独角兽企业重金招聘Python工程师标准>>> 1 前言 随着医学图像三维重建体绘制技术的发展及其研究的深入,医生对数据的分析不再局限于简单的观察输出结果,还要求能对结果进行 ...

  2. [结构光三维重建] 2、基于结构光的三维重建系统工作原理总结

    概念 基于结构光三维重建系统模型,如下图所示: 基于结构光的三维成像,实际上是三维参数的测量与重现,需要主动去投射结构光到被测物体上,通过结构光的变形来确定被测物的尺寸参数,是一种主动三维测量方式. ...

  3. 使用gpu服务器搭建人脸识别系统,基于GPU的大规模人脸识别系统的设计与实现

    摘要: 近年来,随着基于深度学习的人脸识别技术的发展,成为了计算机视觉研究最热门的领域之一,被广泛的应用于公共安全.安防.金融等领域.但在实际应用场景中,人脸识别的准确率往往容易受到光线.遮挡.姿态等 ...

  4. 《基于GPU加速的计算机视觉编程》学习笔记

    <基于GPU加速的计算机视觉编程>学习笔记(1) 最近打算 准备工作 CUDA开发环境(主要是查看N卡的信息) 在WIN10下安装CUDA工具包 最近打算 在训练模型的时候,感觉电脑非常吃 ...

  5. 基于图像的三维重建系统概览

    前言 从2维图像重建3维立体具有重要的研究价值和潜在经济社会价值,其核心技术是图像的密集匹配,从最早的70年代摄影测量领域开始研究图像匹配,至今已有近半个世纪的时间.可以这样说,该问题的研究基础奠定于 ...

  6. 《基于GPU加速的计算机视觉编程》学习笔记(2)

    <基于GPU加速的计算机视觉编程>学习笔记(2) 笔记(1)得到的结论 CUDA的开发环境 拥有Ubuntu16.04系统 linux下查看显卡信息 linux下安装CUDA工具包 一个基 ...

  7. 【GPU编程】基于GPU的光线投射体绘制(GPU-Based Ray-Casting Volume Rendering)入门学习

    基于GPU的光线投射体绘制 这篇文字将会讲述怎么运用OpenGL和nVidia Cg进行基于GPU的光线投射体绘制. 读者最好具有OpenGL和顶点-片段渲染的相关经验. 首先,我们为什么需要这个算法 ...

  8. 可视化编程,公网访问——全网首个基于Node-red的在线评语系统

    本文内容已迁移,新的阅读地址可视化编程,公网访问--全网首个基于Node-red的在线评语系统 更新更全的Node-RED教程,请访问 Node-RED系列教程

  9. 计算机视觉用显卡,基于GPU加速的计算机视觉编程:使用OpenCV和CUDA实时处理复杂图像数据...

    本书是OpenCV开发人员的推荐阅读指南,手把手教你使用OpenCV和CUDA实现GPU加速的计算机视觉项目开发,帮你快速掌握利用GPU实时处理复杂图像数据的高效技术.全书共11章,章介绍CUDA架构 ...

最新文章

  1. 【OpenCV】图像/视频相似度测量PSNR( Peak signal-to-noise ratio) and SSIM,视频/图片转换
  2. php mysql xa_分布式事务之——MySQL对XA事务的支持
  3. 入门Web前端要注意什么?要学哪些软件?
  4. Dictionary加速查询(TryGetValue)
  5. 20135213 20135231 信息安全系统设计基础课程第三次实验报告
  6. 博客开张第一贴!谢谢!大伙多多关照!谢谢.
  7. 华为MDC调试工具使用介绍
  8. 事务对性能影响_不是事务的事务!(分布式事务系列-完结篇)
  9. 【软件测试】验收测试是以最终用户为主的测试
  10. python 系统策略禁止这个安装_电脑无法安装软件提示设置了系统策略禁止此项安装怎么办?...
  11. 用python和sympy库解决方程组问题_使用Python的SymPy库解决数学运算问题的方法
  12. java.lang.NoSuchFieldError: INSTANCE at org.apache.http.conn.ssl.SSLConnectionSocketFactory
  13. android 农历工具类,公历农历互相转换的Java日历工具类
  14. go 学习笔记之咬文嚼字带你弄清楚 defer 延迟函数
  15. python求真分数_Python 列出最简真分数序列*
  16. 极客学院 Android 系统体系教程
  17. 前端权限管理方案之精确到按钮级别
  18. SECS/GEM 半导体设备通讯标准学习笔记
  19. 为什么淘宝搜索宝贝排名先后不一样,原理是什么?
  20. 卸载和安装番茄小助手

热门文章

  1. 职场面试中遇到的问题,八个方案,见招拆招
  2. 月薪50K的测试工程师,要求原来是这样!
  3. metapath2vec 异构网络表示学习
  4. 西瓜创客python课程、8岁可以上课吗_有家长让孩子用西瓜创客学编程的吗,感觉怎么样?...
  5. JavaSE_语法基础
  6. 【Python】解决CNN中训练权重参数不匹配size mismatch for fc.weight,size mismatch for fc.bias
  7. 时间脱敏,也许能稍稍帮助你摆脱焦虑
  8. web仿真或实际内存分析应用及自动化方案
  9. python修改文件格式为jpg_利用python将webp文件转化为jpg文件,将png文件修改为jpg,图像重命名...
  10. Qt5开发从入门到精通——第六篇一节( 图像与图片——位置相关函数 )