一、圆形检测
int index=0;while(1){pcl::visualization::PCLVisualizer viewer2("Visualization of original and target point cloud");viewer2.setBackgroundColor(255,255,255);pcl::PointCloud<pcl::PointXYZ>::Ptr Circle2D(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr tempRemain(new pcl::PointCloud<pcl::PointXYZ>);pcl::SampleConsensusModelCircle2D<pcl::PointXYZ>::Ptr model_circle2D(new pcl::SampleConsensusModelCircle2D<pcl::PointXYZ>(Src_Cloud_Planar));std::vector<int> inliers;pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_circle2D);ransac.setDistanceThreshold(0.001);ransac.computeModel();ransac.getInliers(inliers);qDebug()<<"点云数量:"<<inliers.size();if(inliers.size()==0){break;}pcl::IndicesPtr tempinliers(new std::vector<int>(inliers));Eigen::VectorXf modelParas;ransac.getModelCoefficients(modelParas);std::cout << modelParas<< "\n\n";qDebug()<<modelParas(0);qDebug()<<modelParas(1);qDebug()<<modelParas(2);qDebug()<<"002!";pcl::ExtractIndices<pcl::PointXYZ> Circle_extract;Circle_extract.setInputCloud(Src_Cloud_Planar);Circle_extract.setIndices(tempinliers);Circle_extract.setNegative(false);Circle_extract.filter(*Circle2D);Circle_extract.setNegative(true);Circle_extract.filter(*tempRemain);*Src_Cloud_Planar = *tempRemain;if(inliers.size()<=60){viewer2.close();continue;}QVector<pcl::PointXYZ> points;double o_x = modelParas(0), o_y=modelParas(1), r = modelParas(2); for (int i = 0; i < 100; i++) {pcl::PointXYZ point;double alpha = 2 * M_PI / (100 - 1);point.x = o_x + r * cos(i * alpha);point.y = o_y + r * sin(i * alpha);point.z = 0;points.push_back(point);}for (int i = 0; i < points.size() - 1; i++){viewer2.addLine(points.at(i), points.at(i + 1), QString("CircleLineX%1").arg(index).toStdString(), 0);index=index+1;}viewer2.addLine(points.at(points.size() - 1), points.at(0), QString("CircleLineX%1_%2").arg(points.size()).arg(5).toStdString(), 0);index=index+1;pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(Src_Cloud_Planar, 0, 255, 0);viewer2.addPointCloud<pcl::PointXYZ>(Src_Cloud_Planar, single_color, "Source clouds");while (!viewer2.wasStopped()){viewer2.spinOnce(1);}}qDebug()<<"003!";while (!viewer00.wasStopped()){viewer00.spinOnce(1);}
二、直线检测
pcl::PointCloud<pcl::PointXYZ>::Ptr line2D(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_f2D(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr ptCloud2D(new pcl::PointCloud<pcl::PointXYZ>);pcl::ModelCoefficients::Ptr coefficients3(new pcl::ModelCoefficients);pcl::PointIndices::Ptr inliers3(new pcl::PointIndices);pcl::SACSegmentation<pcl::PointXYZ> seg;seg.setOptimizeCoefficients(true);seg.setModelType(pcl::SACMODEL_LINE);seg.setMethodType(pcl::SAC_RANSAC);seg.setMaxIterations(100);seg.setDistanceThreshold(0.0005);seg.setInputCloud(Tgt_Cloud_Planar);seg.segment(*inliers3, *coefficients3);pcl::ExtractIndices<pcl::PointXYZ> extract2;extract2.setInputCloud(Tgt_Cloud_Planar);extract2.setIndices(inliers3);extract2.setNegative(false);extract2.filter(*line2D);extract2.setNegative(true);extract2.filter(*cloud_f2D);*ptCloud2D = *cloud_f2D;pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color3(line2D, 0, 0, 0);viewer00.addPointCloud<pcl::PointXYZ>(line2D, single_color3, "Target clouds90");for (int i = 0; i < line2D->size() - 1; i++){viewer00.addLine(line2D->points[i], line2D->points[i+1], QString("LineX%1").arg(i).toStdString(), 0);}viewer00.addLine(line2D->points[line2D->size() - 1], line2D->points[0], QString("LineX%1_%2").arg(line2D->size()).arg(5).toStdString(), 0);qDebug()<<"size"<<line2D->size();qDebug()<<"003!";while (!viewer00.wasStopped()){viewer00.spinOnce(1);}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!