Qt + OpenGL 显示彩色点云

显示效果如下

在这里插入图片描述

核心代码

点云归一化

根据点云强度,通过opencv的applyColorMap函数将其转化为伪彩色图,即可达到从灰度图转成彩色图的目的
void WOpenglWidget::normalizetoGl(GLfloat *glp, IPointCloud::Ptr cloud)
{
    float min_x = -std::numeric_limits<float>::max();
    float max_x = std::numeric_limits<float>::max();
    float min_y = -std::numeric_limits<float>::max();
    float max_y = std::numeric_limits<float>::max();
    float min_z = -std::numeric_limits<float>::max();
    float max_z = +std::numeric_limits<float>::max();

    cv::Mat img = cv::Mat::zeros(1, cloud->points.size(), CV_8UC1);
    for(unsigned int i = 0; i < cloud->points.size(); i++){
        float x = cloud->points.at(i).x;
        float y = cloud->points.at(i).y;
        float z = cloud->points.at(i).z;

        if(x > max_x){
            max_x = x;
        }
        if(x < min_x){
            min_x = x;
        }
        if(y > max_y){
            max_y = y;
        }
        if(y < min_y){
            min_y = y;
        }
        if(z > max_z){
            max_z = z;
        }
        if(z < min_z){
            min_z = z;
        }
        uchar *p;
        p = img.ptr<uchar>(0);
        p[i] = cloud->points.at(i).intensity;
        //qDebug() << p[i];
    }

    float maxx = max(max_x, max(max_y, max_z));
    float minn = min(min_x, min(min_y, min_z));
    float scalee = max(maxx, fabs(minn));

//    cv::normalize()
    cv::Mat img2 ;
    applyColorMap(img, img2, cv::COLORMAP_HSV);

    for(unsigned int i = 0; i < cloud->points.size(); i++){
       // qDebug() << img2.at<cv::Vec3b>(0,i)[2];
          //qDebug() << img3.at<cv::Vec3b>(0, i)[2]/255.0;
        *(glp + i*6+3) = img2.at<cv::Vec3b>(0, i)[2]/255.0;
        *(glp + i*6+4) = img2.at<cv::Vec3b>(0, i)[1]/255.0;
        *(glp + i*6+5) = img2.at<cv::Vec3b>(0, i)[0]/255.0;
        cloud->points.at(i).x = cloud->points.at(i).x / scalee;
        cloud->points.at(i).y = cloud->points.at(i).y / scalee;
        cloud->points.at(i).z = cloud->points.at(i).z / scalee;
        *(glp + i*6) = cloud->points.at(i).x;
        *(glp + i*6+1) = cloud->points.at(i).y;
        *(glp + i*6+2) = cloud->points.at(i).z;
    }
}

顶点着色器

#version 130
in vec3 posVertex;
in vec3 colorPos;
out vec3 pointColor;
attribute vec2 a_texcoord;
uniform mat4 trans;
varying vec2 v_texcoord;

void main()
{
  gl_Position = trans * vec4(posVertex, 1.0f);
  pointColor = colorPos;
  v_texcoord = a_texcoord;
}

片段着色器

#version 130
out vec4 fragColor;
in vec3 pointColor;
uniform vec4 gColor;
uniform sampler2D texture;
varying vec2 v_texcoord;
void main()
{
  fragColor = vec4(pointColor, 1.0);
}


版权声明:本文为qq_37770942原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。