OpenCV——点云投影到图像中

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

读取一张照片和一张 pcd, 根据标定的内参和外参,将点云投影到图像中,用于判断雷达相机外参标定是否准确。

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/filter.h>

#include <iostream>

int main(int argc, char** argv)
{
  // read a image and a pcd
  cv::Mat image_origin = cv::imread("/media/data/temp/image/0.jpeg");
  pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_origin(new pcl::PointCloud<pcl::PointXYZI>);
  pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_withoutNAN(new pcl::PointCloud<pcl::PointXYZI>);
  pcl::io::loadPCDFile<pcl::PointXYZI> ("/media/liuzhiyang/data/temp/pcd/0.pcd", *cloud_origin);
  std::vector<int> indices;
  pcl::removeNaNFromPointCloud(*cloud_origin, *cloud_withoutNAN, indices);

  std::vector<cv::Point3f> pts_3d;
  for (size_t i = 0; i < cloud_withoutNAN->size(); ++i)
  {
    pcl::PointXYZI point_3d = cloud_withoutNAN->points[i];
    if (point_3d.x > 2 && point_3d.x < 3 && point_3d.y > -10 && point_3d.y < 10)
    {
      pts_3d.emplace_back(cv::Point3f(point_3d.x, point_3d.y, point_3d.z));
    }
  }

  // using iterator

  // read calibration parameter
  double fx = 1.0757955405501191e+03, fy = 1.0762345733674481e+03;
  double cx = 9.6249394948422218e+02, cy = 6.1957628038839391e+02;
  double k1 = -1.1995613777994101e-01, k2 = 8.6245969435724004e-02, k3 = -2.6778267188218002e-02;
  double p1 = 1.0621717082800000e-03, p2 = 5.4033385896265832e-04;
  cv::Mat camera_matrix = (cv::Mat_<double>(3, 3) << fx, 0.0, cx, 0.0, fy, cy, 0.0, 0.0, 1.0);
  cv::Mat distortion_coeff = (cv::Mat_<double>(1, 5) << k1, k2, p1, p2, k3); 
  cv::Mat r_vec = (cv::Mat_<double>(3, 1) << 1.29949179254383, -1.113823535227475, 1.108412921650477);
  cv::Mat t_vec = (cv::Mat_<double>(3, 1) << -0.370740907093656, -0.2397403632299851, -0.0407927826288379);
  
  // project 3d-points into image view
  std::vector<cv::Point2f> pts_2d;
  cv::projectPoints(pts_3d, r_vec, t_vec, camera_matrix, distortion_coeff, pts_2d);
  cv::Mat image_project = image_origin.clone();
  int image_rows = image_origin.rows;
  int image_cols = image_origin.cols;

  for (size_t i = 0; i < pts_2d.size(); ++i)
  {
    cv::Point2f point_2d = pts_2d[i];
    if (point_2d.x < 0 || point_2d.x > image_cols || point_2d.y < 0 || point_2d.y > image_rows)
    {
      continue;
    }
    else
    {
      image_project.at<cv::Vec3b>(point_2d.y, point_2d.x)[0] = 0;
      image_project.at<cv::Vec3b>(point_2d.y, point_2d.x)[1] = 0;
      image_project.at<cv::Vec3b>(point_2d.y, point_2d.x)[2] = 255;
    }
    
    if (point_2d.x > 0 && point_2d.x < image_cols && point_2d.y > 0 && point_2d.y < image_rows)
    {
      image_project.at<cv::Vec3b>(point_2d.y, point_2d.x)[0] = 0;
      image_project.at<cv::Vec3b>(point_2d.y, point_2d.x)[1] = 0;
      image_project.at<cv::Vec3b>(point_2d.y, point_2d.x)[2] = 255;
    } 
    else
    {
      continue;
    }  
  }

  cv::imshow("origin image", image_origin);
  cv::imshow("project image", image_project);
  cv::imwrite("/media/data/temp/image_origin.jpg", image_origin);
  cv::imwrite("/media/data/temp/image_project.jpg", image_project);
  cv::waitKey(10000);

  return 0;
}

后记:投影部分区域的点云到图像中,不要全部都投。(一般选取标定板所处位置的点云)文章来源地址https://www.toymoban.com/news/detail-741365.html

到了这里,关于OpenCV——点云投影到图像中的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 人工智能-OpenCV+Python实现人脸识别(人脸检测)

    在OpenCV中使用Haar特征检测人脸,那么需要使用OpenCV提供的xml文件(级联表)在haarcascades目录下。这张级联表有一个训练好的AdaBoost训练集。首先要采用样本的Haar特征训练分类器,从而得到一个级联的AdaBoost分类器。Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征

    2024年02月06日
    浏览(99)
  • 人工智能算法工程师面试题——之OpenCV必背汇总(四)

    在OpenCV中,图像融合通常指的是将两个或更多图像以某种方式组合在一起,以创建一个新的图像。这个过程可以用于多种目的,比如艺术效果、图像修复或信息增强。实现图像融合的一种常见方法是通过加权求和,也就是每个像素位置上将不同图像的像素值按照一定的权重相

    2024年02月21日
    浏览(48)
  • 点云检测框投影到图像上(mmdetection3d)

    原模型检测时候只有点云的检测框,本文主要是将demo文件中的pcd_demo.py中的代码,将点云检测出的3d框投影到图像上面显示。   

    2024年02月13日
    浏览(39)
  • Python人工智能应用--图像识别&&深度学习

    像素(缩写为px)是图像中的最小单位,由一个个小方格组成。 这些小方格都有一个固定的位置和颜色,共同决定了图像所呈现出来的样子。 这些小方格的行数与列数又被叫做分辨率。我们常说的某幅图像的分辨率是1280×720,指的就是这张图中的每一行都有1280个像素,每一列都

    2024年04月09日
    浏览(66)
  • OpenCV10-图像直方图:直方图绘制、直方图归一化、直方图比较、直方图均衡化、直方图规定化、直方图反射投影

    图像直方图就是统计图像中每个灰度值的个数,之后将灰度值作为横轴,以灰度值个数或者灰度值所占比率作为纵轴的统计图。通过直方图,可以看出图像中哪些灰度值数目较多,哪些较少,可以通过一定的方法将灰度值较为集中的区域映射到较为稀疏的区域,从而使图像在

    2024年01月16日
    浏览(51)
  • 人工智能|深度学习——基于数字图像处理和深度学习的车牌定位

    车牌识别Vehicle License Plate Recognition VLPR) 是从一张或一系列数字图片中自动定位车牌区域并提取车牌信息的图像识别技术。车牌识别 以数字图像处理、模式识别、计算机视觉等技术为基础,是现代智能交通系统的重要组成部分,广泛应用于日常生活中,如 停车场收 费管理,车

    2024年02月21日
    浏览(45)
  • 毕业设计:基于深度学习的图像分类识别系统 人工智能

    目录 前言 项目背景 数据集 设计思路 自注意力 网络模型 实验环境 实验结果分析 更多帮助     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课

    2024年04月16日
    浏览(90)
  • 毕业设计:基于深度学习的图像去噪算法 人工智能

    目录 前言 项目背景 设计思路 数据集 模型训练 更多帮助     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学

    2024年02月19日
    浏览(47)
  • 人工智能学习与实训笔记(二):神经网络之图像分类问题

    人工智能专栏文章汇总:人工智能学习专栏文章汇总-CSDN博客 目录 二、图像分类问题 2.1 尝试使用全连接神经网络 2.2 引入卷积神经网络  2.3 分类函数Softmax 2.4 交叉熵损失函数 2.5 学习率优化算法 2.6 图像预处理算法 2.6.1 随机改变亮暗、对比度和颜色等 2.6.2 随机填充 2.6.

    2024年02月20日
    浏览(46)
  • 计算机竞赛 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

    🔥 优质竞赛项目系列,今天要分享的是 基于人工智能的图像分类技术 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 传统CNN包含卷积层、全连接层等组件,并采用softmax多类别分类器和多类交叉熵损失

    2024年02月11日
    浏览(61)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包