鱼眼图像不失真的正确方法

2024-07-04

我已经完成了一些示例程序,可以消除棋盘上的镜头失真(如鱼眼图像),并且工作正常,这是屏幕截图

接下来,我想使用鱼眼棋盘图案(上右图)来消除相同的镜头畸变,但从真实图像中去除,但没有运气 - 曲率仍然保留在未畸变的图像上, 因此我得到了这个

the code

void getObjectPoints(cv::Size, std::vector<std::vector<cv::Point3f>>&);

bool getImagePoints(cv::Mat&, cv::Size&, std::vector<std::vector<cv::Point2f>>&);

void runCalibration(cv::Mat& image, cv::Matx33d&, cv::Vec4d&);

cv::Mat removeFisheyeLensDist(cv::Mat&, cv::Matx33d&, cv::Vec4d&);

// ... definitions    
void getObjectPoints(cv::Size patternSize, std::vector<std::vector<cv::Point3f>>& objectPoints)
{
    const float squareSize = 0.0015f;
    std::vector<cv::Point3f> knownBoardPositions;
    for (int i = 0; i < patternSize.height; ++i)
    {
        for (int j = 0; j < patternSize.width; ++j)
        {
            knownBoardPositions.push_back(cv::Point3f(j*squareSize, i*squareSize, 0.0f));
        }
    }
    if (knownBoardPositions.size() > 0)
        objectPoints.push_back(knownBoardPositions);
}

bool getImagePoints(cv::Mat& image, cv::Size& patternSize, std::vector<std::vector<cv::Point2f>>& imagePoints)
{
    bool patternFound = false;
    while (!patternFound)
    {
        std::vector<cv::Point2f> corners;
        for (int i = 7; i <= 30; ++i)
        {
            int w = i;
            int h = i - 2;

            patternFound = cv::findChessboardCorners(image, cv::Size(w, h), corners,
                                              cv::CALIB_CB_ADAPTIVE_THRESH | cv::CALIB_CB_NORMALIZE_IMAGE);
            if (patternFound)
            {
                patternSize.width = w;
                patternSize.height = h;
                imagePoints.push_back(corners);
                break;
            }
        }
    }

    return patternFound;
}

void runCalibration(cv::Mat& image, cv::Matx33d& K, cv::Vec4d& D)
{
    std::vector< std::vector<cv::Point2f> > imagePoints;
    std::vector< std::vector<cv::Point3f> > objectPoints;
    cv::Size patternSize;
    bool patternFound = getImagePoints(image, patternSize, imagePoints);

    if (patternFound)
    {
        getObjectPoints(patternSize, objectPoints);

        std::vector<cv::Vec3d> rvecs;
        std::vector<cv::Vec3d> tvecs;
        cv::fisheye::calibrate(
            objectPoints,
            imagePoints,
            image.size(),
            K,
            D,
            rvecs,
            tvecs,
            cv::fisheye::CALIB_FIX_SKEW |   cv::fisheye::CALIB_RECOMPUTE_EXTRINSIC
        |   cv::fisheye::CALIB_FIX_K1   |   cv::fisheye::CALIB_FIX_K2
        |   cv::fisheye::CALIB_FIX_K3   |   cv::fisheye::CALIB_FIX_K4
//            cv::TermCriteria(3, 20, 1e-6)
        );
    }
}

cv::Mat removeFisheyeLensDist(cv::Mat& distorted, cv::Matx33d& K, cv::Vec4d& D)
{
    cv::Mat undistorted;
    cv::Matx33d newK = K;
    cv::fisheye::undistortImage(distorted, undistorted, K, D, newK);
    return undistorted;
}

int main(int argc, char* argv[])
{
    cv::Mat chessBoardPattern = //..
    cv::Mat distortedImage = //...
    cv::imshow("distorted", distortedImage);

    cv::Matx33d K;  cv::Vec4d D;
    runCalibration(chessBoardPattern, K, D);
    cv::Mat undistoredImage = removeFisheyeLensDist(distortedImage, K, D);    
    cv::imshow("undistored", undistoredImage);
    cv::waitKey(0);
    return 0;
}

因为我认为塔的图像与右侧的棋盘具有非常相似的曲率,所以相同的图案应该适用于塔图像......

我在那里做错了什么? 为什么它不修复塔图像的镜头畸变?


不幸的是你的假设

如果图像具有相同的曲率,则相机参数应该大致相同,因此我可以使用棋盘图案来消除鱼眼图像的扭曲

是错的。即使是同一型号的相机,在焦距、镜头几何形状和放置位置等方面也会存在差异,需要单独进行校准。此外,在相机使用过程中,这些参数可能会因加热、振动和其他影响而发生变化(通常在实践中忽略这一点)。

要在无法访问相机的情况下消除图像失真,您所能做的就是选择一些简单的鱼眼相机模型并尝试手动估计参数,尝试使直线看起来笔直(例如使用带有所有参数滑块的 GUI)。这可能很乏味,但我不知道有更好的选择。此外,一些图像编辑软件可能有这样的工具(如果我没记错的话 GIMP 有)

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

鱼眼图像不失真的正确方法 的相关文章

  • C#:秒到分钟到小时的转换?

    好吧 首先 我很确定我不会在这项作业中使用 TimeSpan 相反 当用户在文本框中输入秒数时 它会在消息框中显示秒 分钟和小时的公式系列 这就是我被困住的地方 我们应该用这个例子来检查我们的答案 7565 秒是 2 小时 6 分 5 秒
  • 查询 LDAP 以查找过去 24 小时内创建的所有计算机对象

    我正在尝试使用 LDAP 查询返回过去 24 小时内创建的所有计算机对象 我的代码目前如下所示 Declare new DirectoryEntry and DirectorySearcher DirectoryEntry domainRo
  • 如何从我的应用程序在用户默认浏览器中启动 URL?

    如何在桌面应用程序中添加一个按钮 使用户的默认浏览器启动并显示应用程序逻辑提供的 URL Process Start http www google com
  • 在 C++ 中访问静态类变量?

    复制 C 对静态类成员的未定义引用 https stackoverflow com questions 272900 c undefined reference to static class member 如果我有这样的类 结构 head
  • 将指针转换为64位整数,为什么在32位和64位平台上结果不同

    我有一个这样的代码片段 up cpp include
  • 如何使用 MVVM light 处理 WP 8.1 上的后退按钮?

    我正在寻找适当的方法来处理 Windows Phone 8 1 WinRT 上的后退按钮按下事件NavigationService在 MVVM light 5 上可用 到目前为止 我认为最好的地方是在ViewModelLocator通过注册
  • Google 的“编码折线算法”的 C# 实现

    有谁有 Google 的简洁而强大的实现吗 编码折线算法 http code google com apis maps documentation utilities polylinealgorithm html in C 我本质上想要实现
  • 我如何知道我的电子邮件是否已使用 Asp.net 被接收和阅读

    我需要知道如何查询已发送的电子邮件状态 Asp net中有没有特殊的类来实现这个功能 如果没有 你知道这样做的方法吗 如果您正在使用System Net Mail命名空间 您可以向电子邮件添加标头以请求已读回执 message Header
  • c malloc 问题(内存损坏)

    使用 malloc 时 如果它生成带有错误的核心转储 malloc memory corruption 这是否意味着 malloc 尝试分配无法自由分配的内存 如果是的话 造成这种情况的原因是什么 这完全取决于您的 malloc 实现 但通
  • pthread 线程状态

    是否有一种机制可以用来判断 pthread 线程当前是否正在运行或已退出 如果线程尚未退出 pthread join 是否有一种方法能够在特定时间段后超时 如果您仅针对 Linux 请使用http www kernel org doc ma
  • 您会在哪里使用友元函数与静态成员函数?

    当我们希望非成员函数访问该类的私有成员时 我们将其设为该类的友元函数 这赋予它与静态成员函数相同的访问权限 两种选择都会为您提供一个不与该类的任何实例关联的函数 什么时候我们必须使用友元函数 什么时候必须使用静态函数 如果两者都是解决问题的
  • 在 Xamarin.Forms 中添加方向更改布局

    我需要实现的是 在将屏幕从纵向更改为横向时向现有页面添加布局 我已经成功地使用检测方向变化void OnSizeAllocation 双倍宽度 双倍高度 但我无法为此事件添加布局 我的示例 C 代码是 public class MyLayo
  • Protobuf 版本与 Qt 冲突

    我正在尝试将 protobufs v 3 3 2 与 Qt 5 9 1 一起使用 这适用于某些 Qt 应用程序 但前提是它们是命令行程序 当我使用 Qt 和 protobufs 创建 GUI 应用程序后 我收到以下错误 libprotobu
  • 创建新选项卡并管理它们 - Selenium

    这是我的代码 var chromeOptions new ChromeOptions chromeOptions AddArguments headless driver new OpenQA Selenium Chrome ChromeD
  • 将字符串中的每个字符转换为 ASCII

    谁能告诉我如何轻松地将字符串中的每个字符转换为 ASCII 值 以便我可以对这些值求和 我需要对哈希函数的值求和 字符串中的每个字符都已经是 ascii include
  • 在 EF core 中启用迁移吗?

    我正在开始使用 EF Core 2 0 我有一个针对 NET 4 6 1 的控制台应用程序 我有一个非常简单的模型类 以及这个上下文 public class ContextCore DbContext protected override
  • GO 语句破坏了 .NET 中的 SQL 执行

    我有一个非常简单的 C 命令 shell 应用程序 它执行 SQL Server 生成的 SQL 脚本来编写模式和数据脚本 它在 GO 声明中爆炸了 错误信息 GO 附近的语法不正确 这是完整的 sql 脚本 Object Table gy
  • lldb:无法实现:无法获取变量的值

    我用这个命令行编译了一个cpp文件 g g test cpp 它在第 28 行抛出异常 我想通过检查 lldb 中的变量来调查原因 我在第 28 行设置了一个断点并运行a out在LLDB中 lldb n Process 84233 sto
  • 谷歌模拟 - 我可以在同一个模拟对象上多次调用 EXPECT_CALL 吗?

    如果我打电话EXPECT CALL在同一个模拟对象上两次TEST F 会发生什么 期望是否附加到模拟对象中 或者第二次调用是否消除了第一次调用的效果 I found 后子句 https github com google googletes
  • 获取非通用任务的结果

    有没有办法得到结果Task

随机推荐

  • Protobuf 版本与 Qt 冲突

    我正在尝试将 protobufs v 3 3 2 与 Qt 5 9 1 一起使用 这适用于某些 Qt 应用程序 但前提是它们是命令行程序 当我使用 Qt 和 protobufs 创建 GUI 应用程序后 我收到以下错误 libprotobu
  • 使用 Flexbox 并保持纵横比,即使内容大小不同

    SO 有很多关于维护元素的纵横比 有或没有 Flexbox 的问题 但是 我的问题略有不同 因为我想覆盖子图像元素的纵横比 确保图像覆盖元素 object fit cover 完全地 确保元素为 1 1 即完美的圆 确保隐藏溢出的图像 换句
  • Django 会话竞争条件?

    摘要 Django 会话中是否存在竞争条件 如何防止它 我在 Django 会话方面遇到了一个有趣的问题 我认为该问题涉及由于同一用户同时发出请求而导致的竞争条件 它发生在一个同时上传多个文件的脚本中 正在本地主机上进行测试 我认为这使得同
  • QTreeView 删除所有项目的装饰/展开按钮

    我想拥有我的QTreeView总是扩展所有项目 在这种情况下 所有展开按钮 装饰都是不必要的 我想摆脱它们 我怎样才能将它们全部删除 setRootIsDecorated只会删除第一层的按钮 这就是我过去针对这个问题所做的 虽然有点麻烦 但
  • 在 Powershell 中运行 Access 宏

    我尝试使用以下代码在 PowerShell v4 0 Windows 8 1 中运行 Access 2010 宏 Access New Object com Access Application Access OpenCurrentData
  • 如何解决有关 TcpListener: 请使用 TcpListener(IPAddress localaddr, int port) 的警告?

    我创建了一个新表单 在顶部我做了 using System using System Collections Generic using System ComponentModel using System Data using Syste
  • 使用 Lucene 提取英语单词词干

    我正在 Java 应用程序中处理一些英文文本 我需要对它们进行词干处理 例如 从文本 amenities amenity 中我需要获取 amenit 该函数如下所示 String stemTerm String term 我找到了 Luce
  • 在 cmd.Cmd 命令行解释器中更好地处理键盘中断

    在使用 python 的 cmd Command 创建自定义 CLI 时 如何告诉处理程序中止当前行并给我一个新的提示 这是一个最小的例子 console min py run python console min py import cm
  • SQL 和 Dapper 性能隐式转换

    我们如何防止 Dapper 中的 SQL 隐式转换 我们意识到 我们正在进行 SQL 隐式转换 导致索引扫描和死锁 Dapper 参数是 nvarchar 而 SQL 表列是 varchar 这导致我们所有的 sql 列都转换为 nvarc
  • 安全地抛出在另一个线程上创建的异常 C#

    我想在线程A中捕获异常 然后将异常对象传递给线程B 并从线程B中抛出它 这样安全吗 Thread A try Code that throws exceptions catch Exception e sendToOtherThread e
  • 垂直对齐到另一个 div 的动态高度?

    我正在尝试将一个 div 与高度动态的相邻 div 垂直对齐 我遇到的大多数方法都要求我知道父 div 的高度 但如果你看我的例子 就会发现是 右 div 驱动了整个部分的高度 我试图让 div 左 中的文本垂直居中显示在右侧的 div 上
  • LINQ to SQL 未映射的属性

    是否可以在设计器中添加自定义属性并且不将其绑定到列 我摆弄了一些设置 决定用该属性创建一个部分类 有没有办法在 ORM 设计器中显示这个字段 LINQ to SQL 设计器正在维护映射 未映射的属性需要放入单独的分部类中
  • 国际象棋棋步验证库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 NET 中是否有可用于验证国际象棋走法和模拟游戏的库 如果该库能够理解代数符号中的移动并提供简单的 A
  • 为什么 SendMessage 对某些应用程序不起作用?

    背景 我试图编写一个自动点击器来在后台点击应用程序 Roblox https en wikipedia org wiki Roblox 不尝试做任何恶意的事情 我能够获取该窗口并执行诸如关闭它之类的命令 但是 当尝试将点击发送到窗口时 它会
  • 创建新选项卡并管理它们 - Selenium

    这是我的代码 var chromeOptions new ChromeOptions chromeOptions AddArguments headless driver new OpenQA Selenium Chrome ChromeD
  • 使用Swashbuckle ISchemaFilter设置输入参数的默认描述

    我想在文档架构中为所有具有 DateTime 类型的输入参数添加默认描述 这样客户就会了解我们正在使用哪些格式等 我可以为此目的创建 ISchemaFilter 的自定义实现吗 我知道我可以使用 xml 注释添加描述 但在这种情况下 我应该
  • 通过谷歌脚本垂直对齐谷歌电子表格上的文本

    我想弄清楚如何在中间垂直对齐文本 根据文档 我发现我的以下示例应该有效 var form FormApp getActiveForm var ss SpreadsheetApp openById form getDestinationId
  • GWT 的图表和绘图 API

    我正在尝试找到一个可以在 GWT 中使用 java 而不是 javascript 使用的图表和绘图 api 我遇到的唯一问题是我发现需要互联网连接的代码将无法连接到互联网 有谁知道这样的API吗 这是我找到的 但又无法使用 https co
  • sails-mongo 适配器,标准化错误消息

    我正在使用 sails mongo 适配器尝试 sailsJs 和 mongodb 将验证添加到模型后 当验证失败时 我会收到以下响应 Users js 模型 module exports schema true attributes na
  • 鱼眼图像不失真的正确方法

    我已经完成了一些示例程序 可以消除棋盘上的镜头失真 如鱼眼图像 并且工作正常 这是屏幕截图 接下来 我想使用鱼眼棋盘图案 上右图 来消除相同的镜头畸变 但从真实图像中去除 但没有运气 曲率仍然保留在未畸变的图像上 因此我得到了这个 the