精华内容
下载资源
问答
  • 以非接触三维扫描方式工作,全自动拼接,具有高效率、高精度、高寿命、高解析度等优点,特别适用于复杂自由曲面逆向建模, 主要应用于产品研发设计(RD,比如快速成型、三维数字化、三维设计、三维立体扫描等)、...
  • 试论GPS配合三维激光扫描工程测绘技术及应用.pdf
  • 探讨GPS配合三维激光扫描工程测绘技术及应用.pdf
  • 地面三维激光扫描技术与全站仪测量技术、近景摄影测量技术相比有其自身的优势,主要特点有:非接触测量、数据采用频率高、精度高全景复制等特点。本章主要学习三维激光扫描入门基础知识。主要内容有:一、基本概念;...

    随着地理空间信息服务产业的快速发展,地理空间数据的要求越来越高。对地理空间数据的要求正朝着大信息量、高精度、可视化和可挖掘方向发展。地面激光雷达技术是一门新兴的测绘技术,已逐渐成为广大科研和工程技术人员全新的解决问题的手段。地面三维激光扫描技术与全站仪测量技术、近景摄影测量技术相比有其自身的优势,主要特点有:非接触测量、数据采用频率高、精度高全景复制等特点。本章主要学习三维激光扫描入门基础知识。主要内容有:一、基本概念;二、地面三维激光扫描仪测量原理;三、三维激光扫描系统分类;四、三维激光扫描系统特点;五、点云的特点。

    目录

    一、基本概念

    二、地面三维激光扫描仪测量原理

    三、三维激光扫描系统分类

    展开全文
  • 总结基于Kinect的三维扫描

    到这里,我相信绝大多数大一的相关专业学生都可以完成这样一台扫描仪了。
    让我们全局看一下这个小项目。


    机械方面
    可以参考三维扫描仪[8]——如何设计一台云台式扫描仪(机械结构)
    这里写图片描述
    这里写图片描述
    这里写图片描述
    我们需要一个支架,支起Kinect和云台,同时我们也需要一套齿轮组,获得精确的角度变化。


    开发环境方面
    可以参考:
    三维扫描仪[6]——常用软件及开发环境
    三维扫描仪[7]——认识Processing和Arduino开发环境
    其中
    这里写图片描述
    Meshlab


    这里写图片描述
    Arduino


    这里写图片描述
    Processing
    和其他的中间件是必须的


    项目代码方面
    可以参考:
    三维扫描仪[9]——如何设计一台云台式扫描仪(初步软件设计)
    三维扫描仪[10]——如何设计一台云台式扫描仪(代码详解)
    这里也附上全套代码
    Arduino
    步进电机代码

    int xdir = 13;
    int Step = 12;
    int xen = 9;
    
    void setup() {
      // put your setup code here, to run once:
      pinMode(xen, OUTPUT);
      pinMode(xdir, OUTPUT);
      pinMode(Step, OUTPUT);
      digitalWrite(xen, LOW);
      digitalWrite(xdir, LOW);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      digitalWrite(Step, LOW);
      delay(10);
      digitalWrite(Step, HIGH);
      delay(10);
    }
    

    角度传感器代码

    int potPin = A0;
    int Pos = 0;
    
    void setup() {
      // put your setup code here, to run once:
      pinMode(potPin, INPUT);
      Serial.begin(9600);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      Pos = analogRead(potPin);
      delay(250);
      Serial.println(Pos);
    }
    

    Processing

    import processing.serial.*;
    import processing.opengl.*;
    import SimpleOpenNI.*;
    import kinectOrbit.*;
    //Init Orbit and OpenNI Class.
    KinectOrbit myOrbit;
    SimpleOpenNI kinect;
    //Serial data.
    Serial myPort;
    boolean serial = true;
    //!
    String turnTableAngle = "0";
    int turnAngle = 0;
    float Angle = 0;
    //!
    //Init pointClouds and ArrayList with clolors.
    ArrayList<PVector> scanPoints = new ArrayList<PVector>();//pointCloud
    ArrayList<PVector> scanColors = new ArrayList<PVector>();//obj color
    ArrayList<PVector> objectPoints = new ArrayList<PVector>();//pointCloud
    ArrayList<PVector> objectColors = new ArrayList<PVector>();//obj color
    
    //Height
    float baseHeight  = -180;
    float modelWidth  = 1000;
    float modelHeight = 1000;
    PVector axis = new PVector(0, baseHeight, 1200);
    
    int scanLines = 300;
    int scanRes   = 1;  //high ppx
    boolean scanning = false;
    boolean arrived  = false;
    float[] shotNumber = new float[30];
    int currentShot = 0;
    
    int dataNum = 1;
    
    public void setup()
    {
      size(800, 600, OPENGL);
    
      //Init orbit
      myOrbit = new KinectOrbit(this, 0, "kinect");
      myOrbit.drawCS(true);
      myOrbit.drawGizmo(true);
      myOrbit.setCSScale(200);
      myOrbit.drawGround(true);
    
      //Init SimpleOpenNI
      kinect = new SimpleOpenNI(this);
      kinect.setMirror(false);
      kinect.enableDepth();
      kinect.enableRGB();
      kinect.alternativeViewPointDepthToImage();
    
      //Serial
      if(serial) {
        String portName = Serial.list()[0];
        myPort = new Serial(this, portName, 9600);
        //!
        myPort.bufferUntil('\n');
        //!
      }
    }
    
    public void draw()
    {
      kinect.update();
      background(0);
      myOrbit.pushOrbit(this);  //Start Orbit
      drawPointCloud(1);
      //!!!!!
      updateObject(scanLines, scanRes);
      //!!!!!
      drawObjects();
      drawBoundingBox();
      kinect.drawCamFrustum();
      myOrbit.popOrbit(this);
    }
    
    
    
    
    
    
    void drawPointCloud(int steps)
    {
      int index;
      PVector realWorldPoint;
      stroke(255);
    
      for(int y = 0; y < kinect.depthHeight(); y += steps) {
        for(int x = 0; x < kinect.depthWidth(); x += steps) {
          index = x + y * kinect.depthWidth();
          realWorldPoint = kinect.depthMapRealWorld()[index];
          stroke(150);
          point(realWorldPoint.x, realWorldPoint.y, realWorldPoint.z);
        }
      }
    }
    
    void drawObjects()
    {
      pushStyle();
      strokeWeight(1);
    
      for(int i = 1; i < objectPoints.size(); i++) {
        stroke(objectColors.get(i).x, objectColors.get(i).y, objectColors.get(i).z);
        point(objectPoints.get(i).x, objectPoints.get(i).y, objectPoints.get(i).z + axis.z);
      }
      for(int i = 1; i < scanPoints.size(); i++) {
        stroke(scanColors.get(i).x, scanColors.get(i).y, scanColors.get(i).z);
        point(scanPoints.get(i).x, scanPoints.get(i).y, scanPoints.get(i).z + axis.z);
      }
      popStyle();  
    }
    
    void drawBoundingBox()
    {
      stroke(255, 0, 0);
      line(axis.x, axis.y, axis.z, axis.x, axis.y+100, axis.z);
      noFill();
      pushMatrix();
      translate(axis.x, axis.x + baseHeight + (modelHeight / 2), axis.z);
      box(modelWidth, modelHeight, modelWidth);
      popMatrix();
    }
    
    void scan()
    {
      for(PVector v : scanPoints) {
        objectPoints.add(v.get());
        int index = scanPoints.indexOf(v);
        objectColors.add(scanColors.get(index).get());
      }
      if(currentShot < shotNumber.length-1) {
        currentShot ++;
        println("scan angle = " + Angle);
      }
      else {
        scanning = false;
      }
      arrived = false;
    }
    
    void updateObject(int scanWidth, int step)
    {
      int index;
      PVector realWorldPoint;
      scanPoints.clear();
      scanColors.clear();
      serialEvent(myPort);
      Angle = radians(map(turnAngle, 0, 1023, 0, 360));
      //println("angle = " + Angle);
      //draw line
      pushMatrix();
      translate(axis.x, axis.y, axis.z);
      rotateY(Angle);
      line(0, 0, 100, 0);
      popMatrix();
    
      int xMin = (int)(kinect.depthWidth() / 2 - scanWidth / 2);
      int xMax = (int)(kinect.depthWidth() / 2 + scanWidth / 2);
      for(int y = 0; y < kinect.depthHeight(); y += step) {
        for(int x = xMin; x < xMax; x += step) {
          index = x + (y * kinect.depthWidth());
          realWorldPoint = kinect.depthMapRealWorld()[index];
          color pointCol = kinect.rgbImage().pixels[index];
    
          if(realWorldPoint.y < (modelHeight + baseHeight) && realWorldPoint.y > baseHeight) {
            if(abs(realWorldPoint.x - axis.x) < modelWidth / 2) {
              if(realWorldPoint.z < axis.z + modelWidth / 2 && realWorldPoint.z > axis.z - modelWidth / 2) {
                PVector rotatedPoint;
                realWorldPoint.z -= axis.z;
                realWorldPoint.x -= axis.x;
                rotatedPoint = vecRotY(realWorldPoint, Angle);
    
                scanPoints.add(rotatedPoint.get());
                scanColors.add(new PVector(red(pointCol), green(pointCol), blue(pointCol)));
              }
            }
          }
        }
      }
    }
    
    PVector vecRotY(PVector vecIn, float phi)
    {
      PVector rotatedVec = new PVector();
      rotatedVec.x = vecIn.x * cos(phi) - vecIn.z * sin(phi);
      rotatedVec.z = vecIn.x * sin(phi) + vecIn.z * cos(phi);
      rotatedVec.y = vecIn.y;
      return rotatedVec;
    }
    
    public void keyPressed()
    {
      switch(key) {
        case 'c':
          objectPoints.clear();
          objectColors.clear();
          currentShot = 0;
          break;
        case 'e':
          String stringNum = String.valueOf(dataNum);
          char key = stringNum.charAt(0);
          exportPly(key);
          dataNum ++;
          println("save success!");
          break;
        case 's':
          scan();
          break;
      }
    }
    
    public void serialEvent(Serial myPort)
    {
      String inString = myPort.readStringUntil('\n');
      if(inString != null) {
        //cut space
        turnTableAngle = trim(inString);
        turnAngle = Integer.parseInt(turnTableAngle);
      }
    }
    
    void exportPly(char key)
    {
      PrintWriter output;
      String viewPointFileName;
      viewPointFileName = "myPoints" + key + ".ply";
      output = createWriter(dataPath(viewPointFileName));
    
      //!!!!
      //head file
      output.println("ply");
      output.println("format ascii 1.0");
      output.println("comment This is your Processing ply file");
      output.println("element vertex " + (objectPoints.size()-1));
      output.println("property float x");
      output.println("property float y");
      output.println("property float z");
      output.println("property uchar red");
      output.println("property uchar green");
      output.println("property uchar blue");
      output.println("end_header");
      //!!!!
    
      for(int i = 0; i < objectPoints.size() - 1; i++) {
        output.println(
          (objectPoints.get(i).x / 1000) + " "
          + (objectPoints.get(i).y / 1000) + " "
          + (objectPoints.get(i).z / 1000) + " "
          + (int) objectColors.get(i).x + " "
          + (int) objectColors.get(i).y + " "
          + (int) objectColors.get(i).z
        );
      }
    
      output.flush();
      output.close();
    }
    

    三维重建原理方面
    可以参考:
    三维扫描仪[2]——大恒、微软、还是淘宝一下双目摄像头?
    三维扫描仪[3]——标定·理论


    本项目并不涉及、但是接下来会用到的标定方面
    可以参考:
    三维扫描仪[4]——标定·Matlab单目标定
    三维扫描仪[5]——标定·Matlab双目标定


    展望
    本来没有这个部分的
    然而我昨天(2017.4.21)散步的时候突然想到:
    用两个Kinect
    KinectA保持不动 KinectB在A的视野下运动 由KinectB扫描
    我们需要确定A的空间位置 获得B实时的空间位置和角度
    最终!根据多个空间坐标系的转换 实现手持Kinect扫描并叠加
    没有实验过,也没考虑过优势。
    只是作为一个二本大三的软件工程学生,感觉扫描仪再贴点,再有庞杂的机械结构,挺不好的。
    希望廉价的扫描仪能服务更多的普通人吧。
    希望我将来去漫展的时候,真的能把你们变成我的手办。
    这里写图片描述
    这里写图片描述


    扫描仪这个部分并没有结束。
    这只是一个小例子,用来体会逆向工程的。
    接下来我们干个酷炫的
    要不这几年真白读了
    这里写图片描述

    展开全文
  • 三维扫描激光相机

    2021-02-25 05:30:34
    英国国家工程实验室研制成一种简单的三维扫描激光相机。在“Stripe”系统上,10 mW He-Ne激光通过倾斜反射镜分裂为光学扇面。
  • 地面三维激光扫描仪是地面激光扫描系统中最主要的硬件设备,近年来得到了快速发展,主要体现在品牌数量、性能指标、类型等方面的变化。本章主要介绍国内外主要设备的基本情况,对国内外研究现状进行分析,最后指出...

    地面三维激光扫描仪是地面激光扫描系统中最主要的硬件设备,近年来得到了快速发展,主要体现在品牌数量、性能指标、类型等方面的变化。本章主要介绍国内外主要设备的基本情况,对国内外研究现状进行分析,最后指出目前存在的问题与未来的发展趋势。

    2.1 国外地面三维激光扫描仪简介


    目前,生产地面三维激光扫描仪的公司比较多,随着地面三维激光扫描技术应用普及程度的不断提高,国外产品在中国的市场目前还占主导地位。它们各自的产品在性能指标上有所不同,以下简要介绍有代表性的公司产品。

    2.1.1 奥地利 Riegl公司的产品

    自Riegl 公司于1998年向市场成功推出首台三维激光扫描仪以来,并于2002年全球首家实现地面三维激光扫描仪和专业化的尼康和佳能数码单反相机的结合。其强大的软件功能,可根据用户的需要,提供极为丰富的三维立体空间模型(AutoCAD)、立体影像(MAYA)及三维定量分析。经过改装,该系统可装载在汽车上,进行连续的三维数据的采集。

    Riegl激光扫描仪具有的主要特点包括扫描速度最快、拼接时间最短、产品质量最好、具备的功能最多、配套的软件最多、合作的厂家最多、产品的种类最多、产品的信誉最好、设备所能达到的各项技术指标均优于厂家公开的技术指标。

    Riegl公司于1999年推出LPM-2K扫描仪,2002年

    展开全文
  • 三维扫描仪 XTOM-MATRIX

    2019-05-16 19:00:28
    XTOM-MATRIX蓝光三维扫描仪具有工业级高精度和高稳定性,在严苛的环境下仍可提供高精测量数据。 蓝光技术 以蓝光条纹技术为基础,在图像采集过程中,可有效过滤周围环境光干扰,对于深色表面、反光表面,大幅...

    XTOM-MATRIX专为工业级三维数字化检测而研发制造,适用于待测物体几何形状的全尺寸三维数字化检测。XTOM-MATRIX蓝光三维扫描仪具有工业级高精度和高稳定性,在严苛的环境下仍可提供高精测量数据。
    三维扫描仪

    1. 蓝光技术
      以蓝光条纹技术为基础,在图像采集过程中,可有效过滤周围环境光干扰,对于深色表面、反光表面,大幅提高扫描质量和测量精度,提升数据质量。

    2. 外差式多频相移技术
      蓝光三维扫描仪基于双目立体视觉原理,采用国际先进的外差式多频相移技术。工业相机按照立体摄像原则进行图像采集。对于大尺寸物体、复杂曲面及柔性表面的测量,优势更加明显。

    3. 系统自动监测技术
      蓝光三维扫描仪在工作过程中能对校准状态、转换精度、环境变化和部件位移进行持续性监控,并给予相应补偿,确保系统处理最佳工作状态,从而保证测量数据的可靠性和准确度。

    4. 多重混合扫描技术
      多重混合扫描技术是通过对两个相机和投影头进行特定标定流程,能让两个相机和投影头两两组成测量单元,能提高
      单次有效测量范围和数据质量,尤其是对于深孔、槽等复杂曲面以及反光表面。

    应用优势

    工业级测头
    蓝光三维扫描仪采用一体式外壳设计,有效保护测头内部工业相机与工业镜头等精密零部件。产品所有电
    子器件均以最高的工艺水准采购和设计制造,即使在各种严苛的操作环境下,也能保证系统的测量精度和稳定性。设备外
    观设计符合人体工程学,扫描头带把手设计,操作便捷。

    自动拼接
    蓝光三维扫描仪支持多种自动拼接方式,如标志点全局拼接、特征拼接、单轴或多轴转台全自动拼接等多
    种拼接方式,确保数据的拼接精度和测量效率。

    高精度高像素网格数据
    蓝光三维扫描仪在每次测量均可得到全域分布的三维点云数据和高精度网格数据。相机分辨率可达900万及更
    高像素,在测量数据上,可呈现非常高的特微细节分辨率,因此也适用于微小零部件的三维测量。

    目前,三维扫描仪广泛应用应用于汽车工业、航空航天、模具制造、铸造等行业,主要用于产品质量检测和逆向工程。

    展开全文
  • Geomagic Design X 培训手册 逆向工程软件-从三维扫描到CAD软件的捷径.pdf
  • 逆向工程实施流程随着三维测量及CAD技术的进步测量工具已经升级为三坐标测量设备而逆向设计工具也由二维绘图工具升级为三维造型CAD软件柴油机的测绘逆向工程的实施 逆向工程实施流程逆向工程实施流程逆向工程实施...
  • 三维激光扫描在变形监测中的应用,对于工程建设行业有很好的参考价值
  • 基于此方法,开发了一个实验原型系统,并针对国内地下矿山的一段巷道开展了激光扫描三维重建实验,成功地重建了巷道三维模型。实例结果表明,本文所提出的适用于巷道单站点激光点云的自动处理和三维重建的方法不仅仅...
  • 三维扫描仪的价格远高于一般3D打印机的价格,而且不论是价格还是技术,看起来都不亲民。那么,我们要它来干什么呢?
  • 三维激光扫描技术应用于构筑物三维建模,邢正全,邓喀中,三维激光扫描技术作为近几年发展起来的高科技技术,在逆向工程领域的应用中凸显了巨大的优越性。构筑物的三维建模就是常见的逆向
  • 介绍了徕卡HDS4500三维激光扫描系统及相应处理软件Cyclone Scan,并通过实例介绍该系统在地质工程上的应用。从而发现徕卡HDS4500三维激光扫描系统在岩土工程、地质工程领域的工程测量及变形监测等方面有着巨大的应用...
  • 文中应用三维激光扫描仪技术,对核岛基坑边坡进行位移监测。通过与全站仪数据的对比分析,得出其在边坡位移监测上不仅具备远距离、无干扰等优势,还具有较高的精度和效率。结论指出:在核电站施工边坡现场,增加三维数据...
  • 文中介绍了将这一技术应用到边坡工程中实例,通过对边坡的连续扫描形成了完整的三维数据,再对后期数据处理的基础上,将边坡内破碎区域的面积快速精确地分析统计出来,为指导实际施工提供了依据。三维激光扫描技术也为...
  • 土方量计算是每一工程建设项目中最基本和经常遇到的问题,如何准确、快速、高精度的计算土方量,对工程的工期、投资和规划设计都...结果表明:运用三维扫描仪计算的土方量,精度高、效率快,能够满足各种工程建设的需求。
  • 三维扫描仪简介

    千次阅读 2013-01-21 22:06:32
     三维扫描仪(3D scanner) 是一种科学仪器,用来侦测并分析现实世界中物体或环境的形状(几何构造)与外观数据(如颜色、表面反照率等性质)。 搜集到的数据常被用来进行三维重建计算,在虚拟世界中创建实际物体的...
  • 三维扫描学习目录 一、理论基础 1.三维扫描原理及精度控制 二、边缘定位(原理)2. 边缘细定位边缘(求解普遍亚像素边缘)3. 针对圆型标志点曲率滤波 三、求解标志点圆心4. 三种基于矩的亚像素级边缘定位方法...
  • 行业分类-机械工程-一种用于古建筑模型建立的三维激光扫描仪.zip
  • 针对正交三维扫描测头的3个探测方向间存在着相互干涉,即耦合的问题,提出了一种基于多区域变参数系数矩阵的正交三维扫描测头标定方法.运用3×3系数矩阵对测头进行标定,该方法依据测头变形量的正负将标准球划分为4...
  • 三维激光扫描技术简介

    千次阅读 2015-08-03 13:26:25
    我们来了解下什么是三维激光扫描,感兴趣的筒子并且想做这方面的算法与软件的可以给我留言~~~  三维激光扫描技术是测绘界的一项技术革新,既然有三维,激光这些词,那么就说明了这项技术是基于三维和激光的概念...
  • 三维激光扫描技术在沉降监测工程中可快速获取被测物体表面大量密集点的三维坐标信息,并在此基础上重构被测目标的三维模型。对三维激光扫描仪在地面沉降监测及获取地表三维模型进行了探讨,获取了矿区地表的三维精细...
  • 通过三维激光扫描系统在南泥湖露天矿采空区探测中的应用,成功实现了采空区隐蔽工程可视化和对采空区顶板有效安全厚度进行量化测试和定量评价,为露天矿采空区处理提供了可靠技术依据,具有一定的推广价值。
  • 基于Kinect的三维扫描仪——机械结构
  • 为了解决复杂的或高大的建筑物结构变形监测问题,采用了地面三维激光扫描技术,研究了三维激光扫描的单点定位精度,数据采集方法和相关的数据处理方法,提出了利用建筑物特征线是否变形来判定建筑物变形的思路。...
  • 三维激光扫描技术作为新兴测绘科技,通过关注目标的无接触扫描,实现点云空间数据的高效获取,在实体建模、滑坡变形监测、古建筑保护等方面发挥重要作用。文中拟以激光扫描仪在桥梁监测中的应用为例,在分析扫描系统分类...
  • 利用一组反射镜组成的光学导管进行传像,将投影光路和成像光路压缩在有限的空间内,解决了条纹投影三维测量轮廓术在口腔测量中阴影和遮挡的问题.依据该技术原理设计、制作了测量系统.并进行了相应的实验测量和精度...
  • 基于激光三角测量原理和现代光电传感技术,提出了一种用于三维曲面轮廓测量的激光扫描光三角检测系统,其采用半导体激光测头,并与二维光栅位移检测系统和伺服控制系统相结合,实现了对被测曲面的多点扫描,通过计算机...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,054
精华内容 6,421
关键字:

三维扫描工程服务