获取点云图

经过两天的努力,在win10上终于是把点云图像给调出来了,本人采用的图漾科技的双目摄像头。但是很遗憾的是一运行出来就很卡,电脑崩溃。(点云的数据量太大了估计是,再有就是电脑太菜)。
一开始一直出现这个问题。
这里写图片描述
这个问题的主要原因是在配置pcl时的环境变量的问题。俗话说发现一个问题比解决十个问题更重要。
效果图:
这里写图片描述
干货代码:

#include<percipio_camport.h>
#include<opencv2/opencv.hpp>
#include<iostream>
#include<pcl/visualization/cloud_viewer.h>

void process_frames(percipio::DepthCameraDevice &port);
void CopyBuffer(percipio::ImageBuffer *pbuf, cv::Mat &img);
static cv::Mat point_cloud;
//点云图的显示
pcl::visualization::CloudViewer* m_pPCLViewer;
pcl::PointCloud<pcl::PointXYZ>::Ptr m_pPointCloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZRGB>::Ptr m_pColorPointCloud(new pcl::PointCloud<pcl::PointXYZRGB>);
void show(int width, int height, int bpp, const unsigned char* data);
void viewerOneOff(pcl::visualization::PCLVisualizer& viewer);
int main()
{
    int ret;
    percipio::DepthCameraDevice device;
    ret = device.OpenDevice();
    if (ret != percipio::CAMSTATUS_SUCCESS)
    {
        printf("Open device failed\n");
        return -1;
    }   
    printf("Open device Success\n");
    ret = device.SetProperty_Int(percipio::PROP_WORKMODE, percipio::WORKMODE_DEPTH);
    if (ret < 0)
    {
        printf("Set work-mode failer\n");
        return -1;
    }
    printf("Set work-mode success\n");
    ret = device.SetPointCloudOutput(true);
    if (ret < 0)
    {
        printf("SetPointCloudput failed error code\n");
    }
    printf("SetPointCloudput success\n");
    while (true)
    {
        int k = cv::waitKey(1);
        if (k == 'q' || k == 1048689)
            break;
        ret = device.FramePackageGet();
        if (ret != percipio::CAMSTATUS_SUCCESS)
        {
            printf("failed in FramePackageget()\n");
            return -1;
        }
        process_frames(device);
    }//while
    delete m_pPCLViewer;
    device.CloseDevice();
    return 0;
}

void process_frames(percipio::DepthCameraDevice &port)
{
    int ret;
    percipio::ImageBuffer pimage;
    ret =port.FrameGet(percipio::CAMDATA_POINT3D, &pimage);
    if (percipio::CAMSTATUS_SUCCESS == ret)
    {
        CopyBuffer(&pimage, point_cloud);
        cv::imshow("point_cloud", point_cloud);
        show(pimage.width,pimage.height,pimage.get_pixel_size(),pimage.data);
    }
}

void CopyBuffer(percipio::ImageBuffer *pbuf, cv::Mat &img)
{
    switch (pbuf->type) {
    case percipio::ImageBuffer::PIX_8C1:
        img.create(pbuf->height, pbuf->width, CV_8UC1);
        break;
    case percipio::ImageBuffer::PIX_16C1:
        img.create(pbuf->height, pbuf->width, CV_16UC1);
        break;
    case percipio::ImageBuffer::PIX_8C3:
        img.create(pbuf->height, pbuf->width, CV_8UC3);
        break;
    case percipio::ImageBuffer::PIX_32FC3:
        img.create(pbuf->height, pbuf->width, CV_32FC3);
        break;
    default:
        img.release();
        return;
    }
    memcpy(img.data, pbuf->data, pbuf->width * pbuf->height * pbuf->get_pixel_size());
}

void show(int width, int height, int bpp, const unsigned char* data)
{
    m_pPCLViewer = NULL;
    float* points = (float*)data;
    size_t image_size = width*height;
    const char* win_name = "Percipio PointCloud";
    static bool bFirst = false;

    if (!m_pPCLViewer)
    {
        m_pPCLViewer = new pcl::visualization::CloudViewer(win_name);
        bFirst = true;
    }

    m_pPointCloud->resize(0);
    for (size_t i = 0; i<image_size; ++i)
    {
        m_pPointCloud->push_back(pcl::PointXYZ(points[0], points[1], points[2]));
        points += 3;
    }

    m_pPCLViewer->showCloud(m_pPointCloud, win_name);

    if (bFirst)
    {
        m_pPCLViewer->runOnVisualizationThreadOnce(viewerOneOff);
        bFirst = false;
    }
}

void viewerOneOff(pcl::visualization::PCLVisualizer& viewer)
{
    viewer.setBackgroundColor(0.0, 0.0, 0.0);
    viewer.setCameraPosition(0, 0, 0, 0, 0, 1, 0, -1, 0);
    viewer.resetCamera();
}

希望可以给大家带来一些帮助。欢迎各位大神前来交流。。

PCL(Point Cloud Library)是一个用于处理点云数据的开源库。在PCL中,点云通常被用来表示三维空间中的物体或场景。对于获取平面的问题,PCL提供了一些方法和算法,可以帮助我们从点云数据中提取平面信息。 提取平面的一种常用方法是使用RANSAC(随机采样一致性)算法。RANSAC算法是一种迭代的方法,通过随机选择几个来拟合一个模型,并计算符合该模型的的数量。反复迭代,找到具有最多符合的模型,即可认为该模型是平面。通过适当的参数设定,可以控制RANSAC算法的收敛性和精度。 在使用PCL进行平面提取时,首先需要将点云数据加载到PCL中,并对点云进行预处理。预处理包括滤波、降采样等操作,以减少噪声和数据冗余。 接下来,可以使用PCL提供的平面提取算法进行平面的提取。常用的方法包括基于RANSAC的平面提取算法。该算法需要设定阈值,表示一个到平面的距离小于该阈值时,认为该属于平面。 当算法找到平面后,可以进一步对平面进行后处理,例如计算平面的法向量、计算平面的参数方程等。 最后,可以将提取到的平面数据进行可视化展示,使用户可以直观地看到提取到的平面。PCL提供了一些可视化工具和函数,方便用户对点云数据和提取结果进行可视化。 通过PCL点云库的使用,我们可以方便地从点云数据获取平面信息。这些平面提取方法和算法可以在计算机视觉、机器人技术以及三维建模等领域得到广泛应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值