一:使用GPU进行点云分割,理论上可以极大地加快分割速度;
于是对PCL1.7.1进行了编译,回到32位系统,重设QT,编译成功(时间好漫长,一定要配置仔细,否则编译一次又一次浪费更多时间);
使用时:
#include < pcl/gpu/segmentation/gpu_extract_cluster.h>或者
#include < pcl/gpu/segmentation/gpu_extract_cluster.h>
函数里面添加代码:
// Get params from function in
float tolerance =m_DistanceThre;
unsigned int min_pts_per_cluster =MaxCloudNum;
unsigned int max_pts_per_cluster =MinCloudNum;
std::vector<pcl::PointIndices> cluster_indices;
//define the extractor
pcl::gpu::EuclideanClusterExtraction ec;
pcl::gpu::DeviceArray<pcl::PointXYZ> DevicePointArray(CloudSrc->size()); // allocation the new GPU memory!
pcl::gpu::EuclideanClusterExtraction::GPUTreePtr treeGPU(new pcl::gpu::EuclideanClusterExtraction::GPUTree);
treeGPU->setCloud(DevicePointArray);
//Set paramS!
ec.setSearchMethod (treeGPU);
ec.setClusterTolerance (tolerance);
ec.setMinClusterSize (MinCloudNum);//ec.setMinClusterSize (100)
ec.setMaxClusterSize (MaxCloudNum);//ec.setMaxClusterSize (25000)
ec.setHostCloud (CloudSrc);
//ec.setInput (DevicePointArray);
ec.extract(cluster_indices);
由此转入函数调用 ,编译出现问题 工程出现重定义,反复修改几次
设置 extract 函数里面调用的函数为全局函数,消除了两个重定义;不过extract本身不能消除,也无法设置为静态成员函数;
二:没有办法,注释掉gpu_extract_cluster.cpp里面的HPP包含,
重新加入库,编译库,最后还是没有成功,出现同样问题。发现时源代码的问题
三:把gpu_extract_cluster.hpp 和gpu_extract_cluster.h从源代码里面抽离出来,
gpu_extract_cluster.hpp 修改为gpu_extract_cluster.cpp
把gpu_extract_cluster.cpp 和gpu_extract_cluster.h添加到项目里面
程序编译成功。
四:编译成功可以运行,
待程序运行到gpu_extract_cluster.cpp 的extract函数里面,
if( !tree_->isBuilt() )
{
tree_->build();//
}
建立八叉树的时候,显卡驱动出现崩溃!瞬间我快要心碎的哭了,这可如何是好啊!
错误提示:
AviTest.exe 中的 0x74a71ee9 处有未经处理的异常: Microsoft C++ 异常: 内存位置 0x035ded58 处的 thrust::system::system_error。
这可到头了,trust虽然可以像C++库一样被使用,我可,没有时间再去调试这个东西了,一股蛋蛋的淡疼的感觉。
最终定位到 afxmem.cpp,定位到323下一句要执行的语句:
321pResult = _malloc_dbg(nSize, _NORMAL_BLOCK, NULL, 0);
322#else
323pResult = malloc(nSize);
324#endif
(tree_->build()行提示 treesize =4915200 702000个pointxyz ,
而 pResult = malloc(nSize);提示为nSize=4294967295,坑死人的大空间,怎么分配啊!)
这难道是显卡驱动有问题?还是CUDA有问题,我只能孤独地在黑夜里提心吊胆地摸索着前行,一步一磕绊,痛苦不堪.....
路慢慢其修远兮,不想探索了!!!先放下,哪天想起来或者发现自己的错误在哪里了,再回头解决.