• 4. 基于faro SDK 读取fls原始文件


      1 #define _SCL_SECURE_NO_WARNINGS
      2 #define _CRT_SECURE_NO_WARNINGS
      3 
      4 #include <iostream>
      5 //#include <atlsafe.h>
      6 //#include <windows.h> 
      7 //#include <cassert>
      8 #include <pcl/point_cloud.h>
      9 #include <pcl/io/pcd_io.h>
     10 #include <pcl/visualization/pcl_visualizer.h>
     11 
     12 using namespace std;
     13 typedef pcl::PointXYZRGBA PointT;
     14 typedef pcl::PointCloud<PointT> PointCloudT;
     15 
     16 #ifdef _WIN64
     17 // Yes - type is 'win32' even on WIN64!
     18 #pragma comment(linker, ""/manifestdependency:type='win32' name='FARO.LS' version='1.1.701.2' processorArchitecture='amd64' publicKeyToken='1d23f5635ba800ab'"")
     19 #else
     20 #pragma comment(linker, ""/manifestdependency:type='win32' name='FARO.LS' version='1.1.701.2' processorArchitecture='amd64' publicKeyToken='1d23f5635ba800ab'"")
     21 #endif
     22 
     23 // These imports just defines the types - they don't determine which DLLs are actually loaded!
     24 // You can choose whatever version you have installed on your system - as long as the interface is compatible
     25 #import "C:WindowsWinSxSamd64_faro.ls_1d23f5635ba800ab_1.1.701.2_none_3592adf9356a0308iQopen.dll" no_namespace
     26 
     27 //... 
     28 
     29 int main()
     30 {
     31     CoInitialize(NULL);   //应用程序调用com库函数(除CoGetMalloc和内存分配函数)之前必须初始化com库
     32     // FARO LS Licensing 
     33     // Please note: The cryptic key is only a part of the complete license
     34     // string you need to unlock the interface. Please
     35     // follow the instructions in the 2nd line below
     36 
     37     BSTR licenseCode = L"FARO Open Runtime License
    "
     38         //#include "../FAROOpenLicense"    // Delete this line, uncomment the following line, and enter your own license key here:
     39         L"Key:39CELNPKTCTXXJ7TN3ZYSPVPL
    "
     40         L"
    "
     41         L"The software is the registered property of FARO Scanner Production GmbH, Stuttgart, Germany.
    "
     42         L"All rights reserved.
    "
     43         L"This software may only be used with written permission of FARO Scanner Production GmbH, Stuttgart, Germany.";
     44 
     45     IiQLicensedInterfaceIfPtr liPtr(__uuidof(iQLibIf));
     46     liPtr->License = licenseCode;
     47     IiQLibIfPtr libRef = static_cast<IiQLibIfPtr>(liPtr);
     48     if (libRef->load("C:\Users\18148\Desktop\Scan_az001.fls\Scan_az001.fls") != 0)   //读取文件的全路径  切记
     49     {
     50         std::cout << "load  ScanData errer !!!" << std::endl;
     51         libRef = NULL;
     52         liPtr = NULL;
     53         return -1;
     54     }
     55 
     56     libRef->scanReflectionMode = 2;            //黑白灰度展示图像
     57     cout << libRef->scanReflectionMode << endl;
     58     //libRef->scanReflectionMode = 1;    //默认为1  可以为0 1 2三个模式。
     59 
     60     int ret = libRef->setAttribute("#app/ScanLoadColor", "2");    //设置为彩色 Load grey information instead of color 
     61     cout << "setAttribute" << ret << endl;
     62 
     63     //if (int ret = libRef->saveAs("C:\Users\18148\Desktop\img\ddb123.fws") != 0)    //可以存储为  fls,fws
     64     //{
     65     //    std::cout << "saveAs  ScanData errer !!!" << std::endl;
     66     //    return -1;
     67     //}
     68     //ret = libRef->extractStream("C:\Users\18148\Desktop\Scan_az001.fls\Scan_az001.fls", "ScanDataStream0", "C:\Users\18148\Desktop\img.fls");
     69 
     70     double x, y, z;
     71     double rx, ry, rz, angle;
     72     libRef->getScanPosition(0, &x, &y, &z);
     73     libRef->getScanOrientation(0, &rx, &ry, &rz, &angle);
     74     int numRows = libRef->getScanNumRows(0);
     75     int numCOls = libRef->getScanNumCols(0);
     76 
     77     std::cout << "numRows::" << numRows << std::endl;
     78     std::cout << "numCOls::" << numCOls << std::endl;
     79     std::cout << x << "," << y << "," << z << std::endl;
     80     std::cout << rx << "," << ry << "," << rz << "," << angle << std::endl;
     81 
     82     PointCloudT::Ptr cloud_pointsPtr(new PointCloudT());
     83     // Access all points points by point 
     84     for (int col = 0; col < numCOls; col++)
     85     {
     86         for (int row = 0; row<numRows; row++)
     87         {
     88             double x, y, z;
     89             int refl;
     90             int result = libRef->getScanPoint(0, row, col, &x, &y, &z, &refl);
     91 
     92             //Use getXYZScanPoints or getXYZScanPoints2 instead to read multiple scan points in a single call. For example, you can read the scan points column by column with these two methods. 
     93             PointT points;
     94             points.x = x;
     95             points.y = y;
     96             points.z = z;
     97             //int rgb = ((int)r) << 16 | ((int)g) << 8 | ((int)b);
     98             points.a = 255;
     99             points.r = (refl >> 16) & 0x0000ff; //uint8_t r = (rgb >> 16) & 0x0000ff;
    100             points.g = (refl >> 8) & 0x0000ff;
    101             points.b = (refl)& 0x0000ff;
    102             points.rgba = points.a << 24 | points.r << 16 | points.g << 8 | points.b;
    103             cloud_pointsPtr->points.push_back(points);
    104 
    105             /*        double **array2D = new double *[numRows];    //二维数组分配内存
    106             for (int i = 0; i<numRows; ++i)
    107             {
    108             array2D[i] = new double[3];
    109             }
    110             double *pos = *array2D;
    111             */
    112             //double *pos = new double[3 * numRows];    //利用一维数组
    113             //int *refl = new int[numRows];
    114             //int result = libRef->getXYZScanPoints(0, row, col, numRows, pos, refl);
    115 
    116             ////std::cout << x<<","<<y<<","<<z<< std::endl;
    117 
    118             //delete[] pos;
    119             //delete[] refl;
    120             //pos = NULL; refl = NULL;
    121         }
    122     }
    123 
    124     // --------------------------------------------
    125     // -----Open 3D viewer and add point cloud-----
    126     // --------------------------------------------
    127     boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
    128     viewer->setBackgroundColor(0, 0, 0);
    129     pcl::visualization::PointCloudColorHandlerRGBField<PointT> rgb(cloud_pointsPtr);
    130     //pcl::visualization::PointCloudColorHandlerCustom<PointT> red(cloud_pointsPtr, 0, 0, 255);
    131     viewer->addPointCloud<PointT>(cloud_pointsPtr, "sample cloud");
    132     viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
    133     viewer->addCoordinateSystem(1.0);
    134     viewer->initCameraParameters();
    135 
    136     // Access all points column per column in polar coordinates 
    137     //double* positions = new double[numRows*3]; 
    138     //int* reflections = new int[numRows]; 
    139     //for (int col = 0; col<numCOls; col++)
    140     //{ 
    141     //    int result = libRef->getPolarScanPoints(0, 0, col, numRows, positions, reflections);
    142     //    for (int row=0 ; row<numRows ; row++)
    143     //    {     
    144     //        double r, phi, theta;     
    145     //        int refl;     
    146     //        r = positions[3*row+0];     
    147     //        phi = positions[3*row + 1];
    148     //        theta = positions[3*row+2];     
    149     //        refl = reflections[row];     // ...   
    150     //    } 
    151     //} 
    152     //delete[] positions; delete[] reflections;
    153 
    154     libRef = NULL; liPtr = NULL;
    155     CoUninitialize();
    156     //--------------------
    157     // -----Main loop-----
    158     //--------------------
    159 
    160     while (!viewer->wasStopped())
    161     {
    162         viewer->spinOnce(100);
    163         boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    164     }
    165     system("pause");
    166     return 0;
    167 }
  • 相关阅读:
    layui 动态设置radio选中
    C# ling 查询 in 用法
    sql 去除小数点后面无效的0
    VUE 全局变量申明和取值
    SQL 逗号分隔将一行拆成多行
    devexpress 延长试用期 licenses.licx
    BugkuCTF-WEB4
    一招破解网页复制+网页上如何实现禁止复制粘贴
    JS的函数
    JS的数组
  • 原文地址:https://www.cnblogs.com/lovebay/p/9337565.html
Copyright © 2020-2023  润新知