找到 4 个特定的角像素并将它们与扭曲透视一起使用

2024-05-23

我正在使用 OpenCV,我想知道如何构建一个简单版本的透视变换程序。我有一张平行四边形的图像,它的每个角都由具有特定颜色的像素组成,该像素在图像中没有其他位置。我想遍历所有像素并找到这 4 个像素。然后我想将它们用作新图像中的角点,以扭曲原始图像的透视。最后我应该有一个放大的正方形。

Point2f src[4]; //Is this the right datatype to use here?
int lineNumber=0;
//iterating through the pixels
for(int y = 0; y < image.rows; y++)
{
    for(int x = 0; x < image.cols; x++)
    {
        Vec3b colour = image.at<Vec3b>(Point(x, y));
    if(color.val[1]==245 && color.val[2]==111 && color.val[0]==10) { 
        src[lineNumber]=this pixel // something like Point2f(x,y) I guess
        lineNumber++;
    }
    }
}
/* I also need to get the dst points for getPerspectiveTransform 
and afterwards warpPerspective, how do I get those? Take the other 
points, check the biggest distance somehow and use it as the maxlength to calculate 
the rest? */

你应该如何使用OpenCV来解决这个问题? (我只是猜我没有以“正常而聪明的方式”这样做)另外我该如何进行下一步,即使用多个像素作为“标记”并计算多个像素中间的平均点点。有什么比遍历每个像素更有效的方法吗?

基本上是这样的:


从带有彩色圆圈作为标记的图像开始,例如:

请注意,这是一个 png 图像,即采用无损压缩,保留了实际颜色。如果您使用像 jpeg 这样的有损压缩,颜色会稍微改变,并且您无法像此处那样通过精确匹配对它们进行分段。

您需要找到每个标记的中心。

  1. 使用分割(已知)颜色inRange http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html?#cv.InRange
  2. 查找具有给定颜色的所有连接组件,其中查找轮廓 http://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?s#findcontours
  3. 找到最大的斑点,这里完成了最大元素 http://www.cplusplus.com/reference/algorithm/max_element/带有 lambda 函数,并且distance http://www.cplusplus.com/reference/iterator/distance/?kw=distance。您可以为此使用 for 循环。
  4. 找到最大斑点的质心,这里完成了moments http://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?s#moments。最终,您也可以在这里使用循环。
  5. 将中心添加到您的source顶点。

Your 目的地顶点只是目标图像的四个角。

然后你可以使用获取透视变换 http://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html?#getperspectivetransform and 扭曲透视 http://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html?#warpperspective查找并应用扭曲。

结果图像是:

Code:

#include <opencv2/opencv.hpp>
#include <vector>
#include <algorithm>
using namespace std;
using namespace cv;

int main()
{
    // Load image
    Mat3b img = imread("path_to_image");

    // Create a black output image
    Mat3b out(300,300,Vec3b(0,0,0));

    // The color of your markers, in order
    vector<Scalar> colors{ Scalar(0, 0, 255), Scalar(0, 255, 0), Scalar(255, 0, 0), Scalar(0, 255, 255) }; // red, green, blue, yellow

    vector<Point2f> src_vertices(colors.size());
    vector<Point2f> dst_vertices = { Point2f(0, 0), Point2f(0, out.rows - 1), Point2f(out.cols - 1, out.rows - 1), Point2f(out.cols - 1, 0) };

    for (int idx_color = 0; idx_color < colors.size(); ++idx_color)
    {
        // Detect color
        Mat1b mask;
        inRange(img, colors[idx_color], colors[idx_color], mask);

        // Find connected components
        vector<vector<Point>> contours;
        findContours(mask, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);

        // Find largest
        int idx_largest = distance(contours.begin(), max_element(contours.begin(), contours.end(), [](const vector<Point>& lhs, const vector<Point>& rhs) {
            return lhs.size() < rhs.size();
        }));

        // Find centroid of largest component
        Moments m = moments(contours[idx_largest]);
        Point2f center(m.m10 / m.m00, m.m01 / m.m00);

        // Found marker center, add to source vertices
        src_vertices[idx_color] = center;
    }

    // Find transformation
    Mat M = getPerspectiveTransform(src_vertices, dst_vertices);

    // Apply transformation
    warpPerspective(img, out, M, out.size());

    imshow("Image", img);
    imshow("Warped", out);
    waitKey();

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

找到 4 个特定的角像素并将它们与扭曲透视一起使用 的相关文章

  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • Arduino 错误:未命名类型?

    我已经编写了一个库 但遇到错误未命名类型的问题 我已经尝试了一切 搜索了几个小时 但没有运气 库放置在arduino sketch文件夹的 libraries 文件夹中 请帮忙 我使用的是 OSX 但 Windows 上也出现同样的问题 这
  • 为什么 Rails 中的 CSRF 令牌不会阻止多个选项卡正常工作?

    在阅读了 Rails 中 CSRF 保护的工作原理后 我尝试通过执行以下操作来触发 CSRF 保护 注意 我们使用基于 cookie 的会话 访问登录页面 检查元中的 CSRF 令牌 gt abc123 打开第二个浏览器选项卡 然后访问相同
  • Homestead 无法远程访问第二个站点

    我的一个站点设置正常 但第二个站点无法远程访问 My YAML ip 192 168 10 10 memory 2048 cpus 1 provider virtualbox authorize ssh id rsa pub keys ss
  • 处理从nodejs到mongo db的连接丢失

    当nodejs和mongodb服务器之间的连接丢失时 我试图得到 连接丢失 或类似的信息 我使用本机驱动程序并具有以下代码 var mongo require mongodb var server new mongo Server host
  • 如何删除字符串中某个字符之后的所有内容?

    如何删除Python中字符串的某个字符之后的所有内容 例如 我有一个包含文件路径和一些额外字符的字符串 如何删除 zip 后的所有内容 我试过了rsplit and split 但在删除多余字符时都不包含 zip 有什么建议么 只需取出拆分
  • TypeScript 假定任何键都保证存在于记录中

    这是一些代码 declare const foo Record
  • 使用正则表达式定位响铃字符

    我注意到 Bell 有一个正则表达式字符 我却无法匹配 我读到了这个角色的内容维基百科 http en wikipedia org wiki Bell character 但我不明白如何在正则表达式中找到它
  • kdb+ 32bit 的性能表现如何

    Kx 宣布 http kx com press releases 140402 php their 免费 kdb http www kxcommunity com 32位 时间序列数据库 我们通常可以期望该数据库的每秒读 写性能如何 我确实
  • Python - UnicodeDecodeError:“charmap”编解码器无法解码位置 44 中的字节 0x81:字符映射到 <未定义>

    在 Python 3 Jupyter 笔记本上使用 pandas 我得到了 UnicodeDecodeError charmap 编解码器无法解码字节 0x81 位置 44 字符映射到 尝试读取如下所示的 json 文件时出错 Test1
  • Windows批处理脚本启动程序并退出控制台

    我有一个用于启动程序的批处理脚本 例如notepad exe 当我双击这个批处理文件时 记事本正常启动 但是黑窗cmd谁发起的notepad exe仍然在后台 我需要做什么才能启动notepad exe并使cmd窗口消失 edit 比使用更
  • Scala 如何使用我的所有核心?

    object PrefixScan sealed abstract class Tree A case class Leaf A a A extends Tree A case class Node A l Tree A r Tree A
  • Spring Boot Oauth2 资源服务器 UserDetailsS​​ervice

    尝试让 UserDetailsS ervice 为我设置的 oauth2 资源服务器工作 我能够成功验证 jwt 但我似乎没有做任何事情来让它调用 loadUserByUsername 方法 最初使用 SAML 并且它可以工作 但现在我已经
  • EMBER直接路由URL访问不加载数据

    当我直接从浏览器访问我的网址时遇到问题 它不会加载我的单一帖子信息 示例 index html posts 10052308 但当我访问 index html posts 然后单击我的一篇文章时 它会起作用 我的网址会更改为 index h
  • Linux 上的基准测试程序

    对于一项任务 我们需要使用不同的优化和参数来对我们的实现进行基准测试 有没有一种可行的方法可以在Linux命令行 我知道时间 上使用不同的参数对小程序进行基准测试 从而为我提供CSV或类似内容的时间数据 输出可能类似于 Implementa
  • ggplot2中的两列分组

    是否可以按两列分组 于是叉积就画出来了 经过geom point and geom smooth 例如 frame lt data frame series lt rep c a b 6 sample lt rep c glass wate
  • 如何使用反应导航在导航抽屉中添加部分分隔符

    假设我的抽屉导航中有五个项目 我想在三个项目之后添加分隔符 如何使用反应导航添加它 正如提到的 vonovak 你可以通过使用来实现这一点contentComponent允许完全定制抽屉 为此 您需要创建自定义组件来覆盖默认抽屉 代码示例
  • 确定哪个元素具有焦点[重复]

    这个问题在这里已经有答案了 可能的重复 如何判断html页面的哪个元素获得焦点 https stackoverflow com questions 483741 how to determine which html page elemen
  • 何时从容器管理的安全性转向 Apache Shiro、Spring Security 等替代方案?

    我正在尝试保护使用 JSF2 0 构建的应用程序的安全 我很困惑人们什么时候会选择使用 Shiro Spring Security 或 owasp 的 esapi 等安全替代方案 而放弃容器管理的安全性 看过一些相关问题 https sta
  • 使用卡尔曼滤波器跟踪位置和速度

    我正在使用卡尔曼滤波器 恒定速度模型 来跟踪物体的位置和速度 我测量对象的 x y 并跟踪 x y vx vy 这是有效的 但是如果在传感器读数 x y vx vy 上添加 20 mm 的高斯噪声 即使该点没有移动 只是噪声也会发生波动 对
  • 找到 4 个特定的角像素并将它们与扭曲透视一起使用

    我正在使用 OpenCV 我想知道如何构建一个简单版本的透视变换程序 我有一张平行四边形的图像 它的每个角都由具有特定颜色的像素组成 该像素在图像中没有其他位置 我想遍历所有像素并找到这 4 个像素 然后我想将它们用作新图像中的角点 以扭曲