基于faro SDK 读取fls原始文件

匿名 (未验证) 提交于 2019-12-03 00:41:02
  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:\Windows\WinSxS\amd64_faro.ls_1d23f5635ba800ab_1.1.701.2_none_3592adf9356a0308\iQopen.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\n"  38         //#include "../FAROOpenLicense"    // Delete this line, uncomment the following line, and enter your own license key here:  39         L"Key:39CELNPKTCTXXJ7TN3ZYSPVPL\n"  40         L"\n"  41         L"The software is the registered property of FARO Scanner Production GmbH, Stuttgart, Germany.\n"  42         L"All rights reserved.\n"  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 }

原文:https://www.cnblogs.com/lovebay/p/9337565.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!