OpenCV——点云投影到图像中

2023-11-18

读取一张照片和一张 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;
}

后记:投影部分区域的点云到图像中,不要全部都投。(一般选取标定板所处位置的点云)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV——点云投影到图像中 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 按成员序列化

    我已经实现了template
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 重载<<的返回值

    include
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • llvm 介绍有用的网站

    LLVM笔记 7 指令的side effect LLVM笔记 7 指令的side effect Five100Miles 博客园 LLVM每日谈之十八 GEP Instruction的几点总结 LLVM每日谈之十八 GEP Instruct
  • 用docker搭建公司内部的gitlab 和 wiki

    docker run name gitlab d link gitlab postgresql postgresql link gitlab redis redisio publish 10022 22 publish 10080 80 e
  • 使用jasypt为springboot配置文件加密

    使用jasypt为配置文件加密 配置项明文可能出现的问题 先看一份典型的配置文件 配置MySQL数据库连接 spring datasource driver class name com mysql jdbc Driver spring d
  • 【为什么】C++中的#pragma once是干什么,和#include guard区别

    一 pragma once是C和C 编程语言中的一个非标准但广泛支持的预处理指令 用于使当前源文件在单次编译中只被包含一次 它与 include guards有相同的作用 但有一些优点 如 代码更少 避免名称冲突 有时可以提高编译速度 代码
  • Nim游戏

    Nim游戏 一共有N堆石子 编号从1到N 第i堆中有a i 个石子 有A和B两个人 依次拿石子 每次可以从任意堆中拿任意数量的石子 至少拿一颗 至多拿着一堆剩下的所有石子 两个人轮流行动 取光所有石子的一方获胜 最后一次拿石子的那一人获胜
  • Go语言切片详解

    文章一 Go语言切片基础 文章二 Go语言切片详解 文章三 Go Go 语言切片 Slice 文章四 Go基础 数组和切片 一个固定长度一个可变长度 文章五 Go语言自学系列 golang切片的初始化 文章六 go语言切片详解 初始化 扩容
  • 通用技术 关于线上监控的思考总结

    前言 近期和大佬们对规划 梳理新财年要做的事情 有非常重要的一项就是线上监控 对于线上监控 大家都最熟悉不过 凡是在生产环境上运行的系统 或多或少都会有监控 但是否有思考过哪些监控是有效的 监控的目的是什么 监控告警出来之后又是怎么的一轮操
  • C实现Unix时间戳和本地时间转化

    我们平常说时间都说的几点几分几秒 星期几 但是在计算机里面并不是直接使用我们所说的时间 而是使用Unix时间戳 这样不管是哪个平台 哪个系统 都可以根据自己对时间的定义进行转换 像Java PHP等都提供了接口来进行转化 C库里面也有这样的
  • MQ如何保证消息不丢失?

    MQ如何保证消息不丢失要从三个方面来考虑 1 生产者 生产者要确保消息投递到MQ服务端 可以使用手动ACK 消息确认机制 认为消息持久化到硬盘 才能够认为生产者投递成功 2 MQ服务端 需要将消息持久化到硬盘 3 消费者 消费者要确保消息消
  • 报错解决:A server error occurred. Please contact the administrator /gbk 9737

    简介 HTML网页显示如题报错 对应python终端显示的是如下错误 解决办法 1 打开报错显示的views debug py 找到如下代码 我这个是已经修改过的 只要找到这段就行 在open 中加入encoding utf 8 如下图 编
  • Linux 下Qt应用程序打包发布方法及踩过的坑

    写这篇文章主要是记录一下自己遇到的问题及解决办法 希望对遇到相同问题的你有所帮助 目的 我需要编写一份可以在服务器上运行的Qt代码 即需要在linux环境下将Qt应用程序打包将其放在服务器上运行 环境 服务器上ubantu版本20 04 1
  • C++中的Date类(日期类)

    C 中Date类用的比较多 所以通过查找参考 自己写了一个比较全面的Date类 直接上代码 头文件 h ifndef DATE H INCLUDED define DATE H INCLUDED include
  • Acticiti中startProcessInstanceByKey方法在variable表中的如何存储

    Acticiti中startProcessInstanceByKey方法在variable表中的如何存储 已知 在使用runtimeService startProcessInstanceByKey String processDefini
  • STM32 进阶教程 14 - 程序加密之FLASH读写保护

    前言 在嵌入式应用开发中 应用开发完成后往往需要对芯片中的程序进行加密处理 用以保护程序安全 不至被竞争对手从芯片把程序固件考走 本节将给大学介绍一个如何实现程序自动给芯片加密功能 学完本节内容 你也可以开发不容易初别人破解的程序了 示例详
  • html 横屏内容显示不全_为什么我的文本显示不全?

    在实际工作中 经常会遇到文本显示不全的情况 比如表格里的文本显示不全等情况 你一般是怎么操作呢 本期与大家分享几种常见的原因 1 Word表格文本显示不全 如下图所示 表格里面的文本显示不全 这时该怎么处理 很多人会进行以下操作 选中表格
  • windows10 使用python(pyhive,impala)连接hive  遇到的问题

    1 socket gaierror Errno 11001 getaddrinfo failed 解决方法 一定不要输入http 另外不要输入密码 conn hive Connection host 12 34 5 20 port 1000
  • 小程序-uni.previewImage实现点击图片放大的预览功能

    uni previewImage是uniapp提供的预览图片的方法 第一种点击盒子图片预览放大效果 1 准备结构
  • How to reduce the number of bugs when coding ?

    写设计文档能帮助自己理清设计思路 如果设计到修改原有代码 一定要关注到原有代码的逻辑闭合 否则造成的后果是加功能引入了BUG 作设计的时候要考虑到各种场景和约束 单元测试一定要做到位 程序员自己测试可以做到白盒测试去覆盖每一个分支 程序员有
  • Vue 下的文件夹分类和文件作用等

    src assets css base css 项目基础的 css normalize css githut 上一个很多企业都会引入的 css 用来规定一些基础空间的外貌的样式 images common 放一些 share 的 js 文件
  • OpenCV——点云投影到图像中

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