VS_图片转换点云

作者 : admin 本文共2380个字,预计阅读时间需要6分钟 发布时间: 2024-06-4 共4人阅读
文章内容:
  1. 通过OpenCV读取图片数据
  2. 将图片数据转换为点云
  3. 显示点云
  4. 保存点云到文件
  5. 图片转换灰度图
  6. 显示灰度图
文章介绍

代码是用Ai工具生成后在VS上运行没有问题的。
可以参考里面读写PCL文件,PCL的显示等内容。

#include 
#include 
#include 
#include 
#include 
// 图片转换点云
// 将图片转换为点云,并返回
void img2Cloud(cv::Mat img, pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud) {
cloud->points.clear();
for (int i = 0; i < img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
pcl::PointXYZ point;
point.x = j;
point.y = i;
point.z = img.at<uchar>(i, j);
cloud->points.push_back(point);
}
}   
}
// 彩色图片转换为点云
void colorImg2Cloud(cv::Mat img, pcl::PointCloud<pcl::PointXYZRGB>::Ptr& cloud) {
cloud->points.clear();
for (int y = 0; y < img.rows; y++)
{
for (int x = 0; x < img.cols; x++)
{
pcl::PointXYZRGB point;
point.x = x;
point.y = y;
point.z = img.at<cv::Vec3b>(y, x)[0];
point.r = img.at<cv::Vec3b>(y, x)[0];
point.g = img.at<cv::Vec3b>(y, x)[1];
point.b = img.at<cv::Vec3b>(y, x)[2];
cloud->points.push_back(point);
}
}
}
// 显示单色点云
void showCloud(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
viewer->setBackgroundColor(0, 0, 0);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 255, 0, 0); //设置点云颜色
viewer->addPointCloud(cloud, single_color, "sample cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
}
}
// 显示彩色点云
void showColorCloud(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud) {
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Color Viewer"));
viewer->setBackgroundColor(0, 0, 0);
viewer->addPointCloud<pcl::PointXYZRGB>(cloud, "sample cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
}
}
// 保存点云到文件
void saveCloud(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, const std::string& filename) {
pcl::io::savePCDFileASCII(filename, *cloud);
}
// 图片转换灰度图
void img2Gray(cv::Mat img, cv::Mat& gray_img) {
cv::cvtColor(img, gray_img, cv::COLOR_BGR2GRAY);
}
int main() {
// 读取图片
cv::Mat img = cv::imread("xiaogou.jpg");
// 彩色图片转换为点云
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
colorImg2Cloud(img, cloud);
showColorCloud(cloud);
// 灰度图片转换为点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_gray(new pcl::PointCloud<pcl::PointXYZ>);
cv::Mat gray_img;
img2Gray(img, gray_img);
img2Cloud(gray_img, cloud_gray);
showCloud(cloud_gray);
cv::imshow("gray_img", gray_img);
cv::waitKey(0);
return 0;
}
本站无任何商业行为
个人在线分享 » VS_图片转换点云
E-->