三维点云转换为二维图像

news/2024/7/21 5:22:18 标签: 图像处理, 计算机视觉, opencv

文章目录

    • 前言
    • 原理
    • 代码
    • 总结与反思
    • 实验结果展示

前言

目的:将三维点云转换为二维图像
作用:
a.给点云赋予彩色信息,增强点云所表达物体或对象的辨识度;
b.将三维点云中绘制的目标物体通过映射关系绘制到二维图像中,这个工作在点云标注邻域被广泛使用;
c.可以根据点云中绘制的结果提取二维图像中对应的物体

原理

  1. 确定要投影的平面,将点云投影至该平面,得到二维点坐标;
  2. 求得二维点云所在平面的极值,即x_max,x_min,y_max,y_min;
  3. 根据x_max,x_min,y_max,y_min确定点云范围;
  4. 根据点云范围即想得到图像分辨率的大小求得单个像素代表的实际长度L;
  5. 遍历点云,将点的坐标与极小值点的坐标做差之后除以L,即为该点在图像中的像素坐标
  6. RGB信息填充到对应的像素内;

代码

void pointcloud_to_image(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_in, float x_max, float x_min, float y_max, float y_min)
{
	pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
	cloud->points.resize(cloud_in->size());
	for (size_t i = 0; i < cloud->points.size(); i++)   //将三维点云投影到二维,这里为投影到XOY平面
	{
		cloud->points[i].x = cloud_in->points[i].x;
		cloud->points[i].y = cloud_in->points[i].y;
		cloud->points[i].z = 0;
		cloud->points[i].r = cloud_in->points[i].r;
		cloud->points[i].g = cloud_in->points[i].g;
		cloud->points[i].b = cloud_in->points[i].b;
	}
 
	Mat image(480, 640, CV_8UC3);
	for (int j = 0; j < image.rows; j++)
	{
		for (int i = 0; i < image.cols; i++)
		{
			image.at<Vec3b>(j, i)[0] = 0;
			image.at<Vec3b>(j, i)[1] = 0;
			image.at<Vec3b>(j, i)[2] = 0;
		}
	}
 
	float l; //单个像素代表的实际长度
	float a = (x_max - x_min) / 640;   //分辨率,根据实际需要设置,这里采用648*480
	float b = (y_max - y_min) / 480;
	if (a > b)
	{
		l = a;
	}
	else
	{
		l = b;
	}
 
	for (int i = 0; i < cloud->size(); i++)
	{
                                //计算点对应的像素坐标
		int x = (cloud->points[i].x - x_min) / l;
		int y = (cloud->points[i].y - y_min) / l;
 
                                //将颜色信息赋予像素
		if (x > 0 && x < 640 && y>0 && y < 480)
		{
			image.at<Vec3b>(y, x)[0] = cloud->points[i].r;
			image.at<Vec3b>(y, x)[1] = cloud->points[i].g;
			image.at<Vec3b>(y, x)[2] = cloud->points[i].b;
		}
	}
	imshow("image", image);
	waitKey(0);
}

总结与反思

在实际应用中,为使二维图像保留更多的点云信息,除了将颜色信息填充到对应的像素内,也可考虑将点云高度信息、法向量信息填充到图像像素内

实验结果展示

原始带部分噪声的点云数据
在这里插入图片描述
去除噪声,使用法向量信息将点云映射为法向量图像
代码参照上面改改,具体省略
在这里插入图片描述

欢迎交流,如有错误,请指正~


http://www.niftyadmin.cn/n/4997477.html

相关文章

CAD图形导入到Visio

背景 写论文&#xff0c;一些设计图纸是用CAD绘制的&#xff0c;但是截图和导出清晰度都不太行&#xff0c;而且相同文字类型在CAD里面会比较丑&#xff0c;所以想到放到Visio里面来。 方法 保存CAD图纸为低版本&#xff08;我一般保存成2000&#xff09;&#xff0c;以免Vi…

【DP】CF Edu 21 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 就是一个 N为1e5&#xff0c;M为3e5的背包问题&#xff0c;不过特殊条件是 w < 3 我们去从最简单的情况开始考虑 当只有w 1的物品和w 2的物品时&#xff0c;考虑贪心地把物品按价值排序&#xff0c;然后选…

企业架构LNMP学习笔记9

nginx配置文件定义php-fpm服务&#xff1a; 编写测试文件&#xff1a; vim /usr/local/nginx/html/index.php 内容&#xff1a; <?phpphpinfo(); 在nginx的配置文件中配置&#xff1a; 修改配置文件&#xff0c;告知nginx如果收到.php结尾的请求&#xff0c;交由给php-…

springboot实现简单的消息对话

目录 一、前言 二、实战步骤 步骤 1&#xff1a; 步骤 2&#xff1a; 步骤 3&#xff1a; 步骤 4&#xff1a; 一、前言 要在Spring Boot项目中实现消息对话&#xff0c;你可以使用WebSocket技术。WebSocket是一种在客户端和服务器之间提供实时双向通信的协议。 二、实…

JavaScript设计模式(四)——策略模式、代理模式、观察者模式

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

百万级并发IM即时消息系统(4)用户基本CRUD

前置&#xff1a; 代码层次还是由低到高&#xff1a;model层数据库操作->service层封装->路由层调用业务 手把手详细教你如何使用go-swagger文档 - 掘金 (juejin.cn) golang swagger注解说明_go swagger 注释_mctlilac的博客-CSDN博客 Gin篇&#xff1a;gorm 使用 - …

YOLO-NAS详细教程-介绍如何进行物体检测

对象检测是计算机视觉中的一项核心任务,可以检测和分类图像中的边界框。自从深度学习首次取得突破以来,它就以极快的速度获得普及和普及,并推动了医疗领域、监控、智能购物等众多公司的发展。考虑到它最终满足了两个基本需求,这一点也就不足为奇了端到端方式:找到所有当前…

Java应用CPU占用过高故障排除

一、背景 最近测试反馈测试环境接口偶现有访问超时&#xff0c;然后APP提示是网络失败&#xff0c;看了一下测试环境的应用完全没啥问题&#xff0c;一直以为是网络问题。 今天测试有反馈了&#xff0c;赶紧看了一下测试服务器&#xff0c;这次终于有症状了&#xff0c;CPU直…