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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/414012.html
標籤:其他
上一篇:yolo原理系列——yolov1--yolov5詳細解釋
下一篇:Ubuntu18.04配置ork(ecto、ecto_image_pipeline、ecto_opencv、ork_reconstruction)
