首页 > 其他分享 >opencv的projectPoints的使用

opencv的projectPoints的使用

时间:2024-04-06 19:33:18浏览次数:16  
标签:objectPoints imagePoints projectPoints opencv tVec 使用 cv point2D

前言

今天要用到重投影这块的内容,是想把相机坐标系下的一个点投影到像素坐标系下。原理很简单,其实手搓一个函数也完全可以。但是还是想尝试一下用封装好的库函数,这样比较简洁和优雅。
但是使用过程中遇到了一些程序死掉的问题。

代码片段

  std::vector<cv::Point3f> objectPoints;
  std::vector<cv::Point2f> imagePoints;

  tVec.x() = tVec.x()/tVec.z();
  tVec.y() = tVec.y()/tVec.z();
  tVec.z() = 1;

  objectPoints.emplace_back(tVec.x(), tVec.y(), tVec.z());

  cv::Mat tvec = (cv::Mat_<float>(1, 3) << 0, 0, 0);
  cv::projectPoints(objectPoints, cv::Mat::zeros(1, 3, CV_64F), tvec, this->camera_matrix_, this->dist_coeffs_, imagePoints);
  cv::Point2d point2D = imagePoints[0];
  if (point2D.x > 0 && point2D.y > 0 && point2D.x < image.cols && point2D.y < image.rows)
      cv::circle(image, point2D, 6, cv::Scalar(255,0,255), -1);

踩的坑

踩坑的原因主要是对于projectPoints函数所传入的参数不熟悉。
比如上文的objectPoints等的类型。
以及rvec,tvec的赋值也要注意,由于我已知相机坐标系下的点的坐标,所以实际是不需要用这两个相机外参的。因此需要赋空值。二者赋空值的方式如上。
奇怪的是,如果像下面这样,编译时会出问题的。必须像上面那样。

  cv::projectPoints(objectPoints, cv::Mat::zeros(1, 3, CV_64F), (cv::Mat_<float>(1, 3) << 0, 0, 0), this->camera_matrix_, this->dist_coeffs_, imagePoints);
  cv::Point2d point2D = imagePoints[0];

参考博客:https://blog.csdn.net/weixin_43297891/article/details/114497700

标签:objectPoints,imagePoints,projectPoints,opencv,tVec,使用,cv,point2D
From: https://www.cnblogs.com/bozhi233/p/18117805

相关文章

  • C++模版简单认识与使用
    目录前言:1.泛型编程2.函数模版3.类模版为什么要有类模版?使用typedef不行吗?类模版只能显示实例化:注意类名与类型的区别:注意类模版最好不要声明和定义分离:总结:前言:正如标题而言,这里只是对模版的简单认识与使用,方便后面博客介绍stl中一些容器的实现,更复杂详细的模版......
  • 使用 HTMX 和 Bun 进行全栈 Web 开发
    将HTMX放在前端,Bun放在后端,然后将它们与Elysia和MongoDB连接起来,形成快速便捷的技术栈,使开发Web应用程序变得轻而易举。Bun和HTMX是目前软件领域最有趣的两个事情。Bun是一个速度极快的一体化服务器端JavaScript平台,而HTMX是一种HTML扩展,用于创建简单......
  • 在 Deno Deploy 中使用更简单的新项目创建流程
    DenoDeploy是一个JavaScript无服务器应用程序的全球分布式平台,是在Web上部署和运行JavaScript和TypeScript的最简单、最快的方法之一。DenoDeploy的JS/TS和WebAssembly代码在地理位置靠近用户的托管服务器上运行,从而实现低延迟和更快的响应时间。它还原生......
  • 使用 Prisma ORM 和 Cloudflare D1 构建应用程序
    自2017年推出Workers以来,Cloudflare一直引领边缘计算领域。Cloudflare最近通过D1发布了本机无服务器数据库。我们现在可以使用PrismaORM与D1一起构建应用程序。将数据库部署到边缘CloudflareWorkers是一种分布在全球范围内的轻量级无服务器计算形式。它们......
  • [转帖]【Linux】使用 apt-get 查询并安装指定版本的软件
    https://zhuanlan.zhihu.com/p/540712989 一、通过apt-get安装指定版本的软件$sudoapt-getinstallpackage=versionversion是软件版本号,package是要安装的软件二、查询指定软件有多少个版本1、通过网站搜索https://packages.ubuntu.com/2、使用apt-cachem......
  • 使用 5 行 Python 代码拆分或合并 PDF 文件
    目录:拆分PDF文件合并PDF文件如果希望从大型PDF文件中提取特定页面或将多个PDF文件合并为一个文件,可以使用一些PDF编辑器来完成,但是你可能会发现拆分或合并功能在很多免费版PDF编辑工具中通常不可用。在本文中,我将分享一个简单的解决方案,用几行Python代......
  • 在RichTextBox mvvm中使用wpf工具包在插入符号处插入文本
    ,可以通过以下步骤实现:首先,确保你已经在项目中引用了WPF工具包。可以通过在VisualStudio中的项目引用中添加对WPF工具包的引用来完成。在你的MVVM模式中,创建一个名为"InsertTextCommand"的命令类,用于处理插入文本的逻辑。这个命令类应该实现ICommand接口,并且包含一个Execute方......
  • 使用Python插入100万条数据到MySQL数据库并将数据逐步写出到多个Excel
    Python插入100万条数据到MySQL数据库步骤一:导入所需模块和库首先,我们需要导入MySQL连接器模块和Faker模块。MySQL连接器模块用于连接到MySQL数据库,而Faker模块用于生成虚假数据。importmysql.connector#导入MySQL连接器模块fromfakerimportFaker#导入......
  • C语言 ---- extern的使用
    extern是一个关键字,用于在C和C++中声明一个变量或函数的外部链接性。当您在一个源文件中使用extern声明一个变量或函数时,它表示该变量或函数是在另一个源文件中定义的,而不是在当前文件中定义的。1.声明全局变量的外部链接性://File1.cintglobal_variable;//定义一个全局......
  • .NET 8使用日志功能以及自定义日志提供程序
    .NET8使用日志功能以及自定义日志提供程序日志级别下表列出了LogLevel值、方便的Log{LogLevel}扩展方法以及建议的用法:展开表LogLevel“值”方法描述Trace0LogTrace包含最详细的消息。这些消息可能包含敏感的应用数据。这些消息默认情况下处于禁用状态,并......