PCL三维点云中的立体框映射到二维图像(在图像中绘制立体框)

这篇具有很好参考价值的文章主要介绍了PCL三维点云中的立体框映射到二维图像(在图像中绘制立体框)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

三维点云与图像的映射,或者说是将三维点云中的点与二维图像中的某一个像素点进行对应。那么这么做的目的是什么呢?用途是什么呢“
目的:目的就是将三维点与二维图像之间的映射关系
作用1、可以给点云赋予彩色信息,增强点云所表达物体或对象的辨识度;2、可以将三维点云中绘制的目标物体通过映射关系绘制到二维图像中(最基本的就是三维立体框的绘制),这个工作在点云标注邻域被广泛使用。3、可以根据点云中绘制的结果提取二维图像中对应的物体。
点云投影到二维图像,PCL点云应用方法,计算机视觉,人工智能,opencv,图像处理,c++

一、二维图像与点云映射

要实现将点云中的点或者是立体框绘制到二维图像中,首先就需要找到点云与二维图像之间的映射关系(将点云与二维像素点对应),有关点云与二维图像之间的映射过程可以看博客《激光雷达点云与单幅图像配准/映射变为彩色点云》。该文中给出了详细的转换过程、转换源码和免费的测试文件,有需要的可自行下载和测试。

二、将点云中的点或立体框映射到二维图像中

这个过程其实并不难理解,就是通过点云与图像的映射关系将三维点(x,y,z)转换为二维像素点(u,v),然后再根据二维像素点进行图像绘制即可。
首先:考虑到点云中部分图像的点可能会超出原图像的大小,所有我们对图像边缘进行扩大,绘制结束后再进行裁剪。

	cv::Mat maskImage = cv::Mat(image.rows + 500, image.cols+500, CV_8UC3, cv::Scalar(255, 255, 255));;
	cv::Mat img1 = maskImage(cv::Range(0, image.rows), cv::Range(0, image.cols));
	image.copyTo(img1);

三维点与二维限速之间的映射过程,注意:具体的映射过程要看博客《激光雷达点云与单幅图像配准/映射变为彩色点云》

calculate(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, std::vector<cv::Point> &outPixel) {
	cv::Mat word_h = cv::Mat(4, 1, CV_64FC1);
	cv::Mat p_result = cv::Mat(3, 1, CV_64FC1);
	cv::Point xy;
	for (int i = 0; i < cloud->size(); i++) {
		word_h = (cv::Mat_<double>(4, 1) << cloud->points[i].x, cloud->points[i].y, cloud->points[i].z, 1);
		p_result = K * tc * word_h;
		int u = (int)((p_result.at<double>(0, 0)) / p_result.at<double>(2, 0));
		int v = (int)((p_result.at<double>(1, 0)) / p_result.at<double>(2, 0));
		if (u >= 0 && u < cols && v >= 0 && v < rows) {
			xy.y = v;
			xy.x = u;
			outPixel.push_back(xy);
		}
	}

点云坐标绘制到二维图像源码

drawBox(std::vector<pcl::PointCloud<pcl::PointXYZ>>allRangeBOX_3D_PointList) {
	//cv::Mat img;
	//cv::undistort(image, UndistortImage, K1, D, K1);
	cv::Mat maskImage = cv::Mat(image.rows + 500, image.cols+500, CV_8UC3, cv::Scalar(255, 255, 255));;
	cv::Mat img1 = maskImage(cv::Range(0, image.rows), cv::Range(0, image.cols));
	image.copyTo(img1);
	UndistortImage = maskImage;
	cols = UndistortImage.cols;
	rows = UndistortImage.rows;
	for (int i = 0; i < allRangeBOX_3D_PointList.size(); i++) {
		if (allRangeBOX_3D_PointList[i].size() == 0) continue;
		std::vector<cv::Point> outPixel;
		calculate(allRangeBOX_3D_PointList[i].makeShared(), outPixel);
		std::cout << "outPixel.size()" << outPixel.size() << endl;
		if (outPixel.size() < 8)continue;// 判断二维像素点的个数,因为立体框有八个点
		cv::Scalar color = cv::Scalar(255., 0., 0.);
		cv::line(UndistortImage, outPixel[0], outPixel[1], color, 5, cv::LINE_8);
		cv::line(UndistortImage, outPixel[0], outPixel[3], color, 5, cv::LINE_8);
		cv::line(UndistortImage, outPixel[0], outPixel[4], color, 5, cv::LINE_8);
		cv::line(UndistortImage, outPixel[4], outPixel[5], color, 5, cv::LINE_8);
		cv::line(UndistortImage, outPixel[4], outPixel[7], color, 5, cv::LINE_8);
		cv::line(UndistortImage, outPixel[1], outPixel[5], color, 5, cv::LINE_8);
		cv::line(UndistortImage, outPixel[5], outPixel[6], color, 5, cv::LINE_8);
		cv::line(UndistortImage, outPixel[6], outPixel[7], color, 5, cv::LINE_8);
		cv::line(UndistortImage, outPixel[1], outPixel[2], color, 5, cv::LINE_8);
		cv::line(UndistortImage, outPixel[3], outPixel[7], color, 5, cv::LINE_8);
		cv::line(UndistortImage, outPixel[2], outPixel[3], color, 5, cv::LINE_8);
		cv::line(UndistortImage, outPixel[2], outPixel[6], color, 5, cv::LINE_8);
	}
	UndistortImage = UndistortImage(cv::Range(0, image.rows), cv::Range(0, image.cols));
	cols = UndistortImage.cols;
	rows = UndistortImage.rows;
}

测试结果

点云投影到二维图像,PCL点云应用方法,计算机视觉,人工智能,opencv,图像处理,c++
点云投影到二维图像,PCL点云应用方法,计算机视觉,人工智能,opencv,图像处理,c++文章来源地址https://www.toymoban.com/news/detail-641101.html

到了这里,关于PCL三维点云中的立体框映射到二维图像(在图像中绘制立体框)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MATLAB slice函数绘制三维n×m×k矩阵的立体图或剖面图 —可视化四维数据

    数据可能包含测量物理对象所得的值,如管道内的温度。在此情况下,物理维度可以表示为一个空间体,用颜色表示测量的幅值。使用 slice 函数显示在空间体横截面处所测得的变量的值。 参考 1、 https://www.researchgate.net/post/How-to-display-a-3-Dimensional-matrix-by-their-values-in-MatlabFor

    2024年02月11日
    浏览(23)
  • 激光雷达点云与单幅图像配准/映射变为彩色点云

    如果没有对pcl库进行配置,则需要先配置pcl:可重复使用的VS-PCL1.10.1环境配置 本文提供激光雷达采集的点云与单幅二维图像之间的配准方法,目的是实现点云到图像之间的映射,同时也可以将点云转变为彩色点云。 数据准备: point_cloud: 激光雷达点云数据; img: 与激光雷达对

    2023年04月08日
    浏览(25)
  • 深度学习应用篇-计算机视觉-语义分割综述[5]:FCN、SegNet、Deeplab等分割算法、常用二维三维半立体数据集汇总、前景展望等

    【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、

    2024年02月16日
    浏览(37)
  • PCL 快速删除点云中重叠的点(方法三)

      如图所示,测试点云有15697个重复点。 若某一点在某一距离阈值领域内不止其本身一个点,则认为其有重复点。

    2024年02月12日
    浏览(18)
  • Matlab把二维矩阵画成三维图像

    上面的速度文件是一列数据,在matlab中可以认为是向量,数据量为10000*5000,所以才能被设置为5000*10000的矩阵。 这样画出来的图像水平两轴为x:1,10000;y:1,5000。 垂向上的数值则是矩阵对应的速度值。 因为数据量太大,电脑很卡就不放图片了,你可以用C语言或者其他的什

    2024年02月12日
    浏览(25)
  • matlab绘图(三)绘制三维图像

    一、绘制三维曲线  二、绘制三维曲面 1.meshgrid函数  2.mesh和surf函数 1.最基本的绘制三维曲线的函数 —plot3 plot3(x1,y1,z1, 选项 1,x2,y2,z2, 选项 2,…, xn,yn,zn , 选项 n) 其中,每一组 x , y , z 组成一组曲线的坐标参数,选项的定义和 plot 函数相同。当 x 、 y 、 z 是同维向量时,则

    2024年02月01日
    浏览(84)
  • Python三维图像的绘制以及相关图例添加(3D图像 - 图例)

    此部分自行完成,预先准备好需要的数据即可。 本例子实现的是:要在4*4的格子里面的3个格子里分别绘制3条不同颜色的图形。 (为了更加直观,绘图相关的程序不使用循环) (为了更加直观,绘图相关的程序不使用循环) 可以看到3维柱形是通过ax.bar3d()函数设置的, 其中传入的

    2024年02月11日
    浏览(29)
  • 数学建模--三维图像绘制的Python实现

    目录 1.绘制三维坐标轴的方法 2.绘制三维函数的样例1  3.绘制三维函数的样例2 4.绘制三维函数的样例3  5.绘制三维函数的样例4  6.绘制三维函数的样例5           

    2024年02月09日
    浏览(35)
  • python数学建模--sympy三维图像绘制

    在求解二元函数最值的时候,我们不知道自己经过若干个步骤求出的结果是否正确,那么我们该怎么办呢?一种办法就是将这个函数的图像绘制出来 三维图像的作用在于,它不仅能让我们直观的看出待求二元函数在指定区间内的形状,而且对于我们求得的最值以及求极值的步

    2024年02月06日
    浏览(54)
  • 【Python VTK】读取二维序列医学图像分割结果并进行三维重建

    最近在开发过程中遇到了这样的问题: 在医学图像开发过程中,我们将医学图像通过 深度学习 算法进行分割,现在想要 通过这一套二维图像进行三维重构 。 以下是分割结果: 图一:前列腺核磁图像分割结果 图一:前列腺核磁图像分割结果 图一:前列腺核磁图像分割结果

    2024年02月01日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包