使用 python 在 OpenCV 中进行透视校正

2024-03-05

我正在尝试对倾斜的矩形(信用卡)进行透视校正,该矩形在所有 4 个方向上都倾斜。我可以找到它的四个角及其各自的倾斜角度,但我找不到它必须投影的坐标的确切位置。我正在使用 cv2.getPerspectiveTransform 进行转换。

我有实际卡片(非倾斜卡片)的长宽比,我想要这样的坐标,以便保留原始长宽比。我尝试过使用边界矩形,但这会增加卡片的大小。

Any help would be appreciated.test image


这是您需要遵循的方式...

为了方便起见,我已将您的图像调整为较小的尺寸,

  • 计算源图像的四边形顶点,这里我手动查找,可以选择边缘检测,霍夫线等。
  Q1=manual calculation;
  Q2=manual calculation;
  Q3=manual calculation;
  Q4=manual calculation;
  • 通过保持宽高比来计算目标图像中的四边形顶点,在这里您可以从源图像的四边形顶点上方获取卡片的宽度,并通过乘以宽高比来计算高度。
   // compute the size of the card by keeping aspect ratio.
    double ratio=1.6;
    double cardH=sqrt((Q3.x-Q2.x)*(Q3.x-Q2.x)+(Q3.y-Q2.y)*(Q3.y-Q2.y)); //Or you can give your own height
    double cardW=ratio*cardH;
    Rect R(Q1.x,Q1.y,cardW,cardH);
  • 现在您获得了源和目标的四边形顶点,然后应用 warpPerspective。

您可以参考下面的C++代码,

   //Compute quad point for edge
    Point Q1=Point2f(90,11);
    Point Q2=Point2f(596,135);
    Point Q3=Point2f(632,452);
    Point Q4=Point2f(90,513);

    // compute the size of the card by keeping aspect ratio.
    double ratio=1.6;
    double cardH=sqrt((Q3.x-Q2.x)*(Q3.x-Q2.x)+(Q3.y-Q2.y)*(Q3.y-Q2.y));//Or you can give your own height
    double cardW=ratio*cardH;
    Rect R(Q1.x,Q1.y,cardW,cardH);

    Point R1=Point2f(R.x,R.y);
    Point R2=Point2f(R.x+R.width,R.y);
    Point R3=Point2f(Point2f(R.x+R.width,R.y+R.height));
    Point R4=Point2f(Point2f(R.x,R.y+R.height));

    std::vector<Point2f> quad_pts;
    std::vector<Point2f> squre_pts;

    quad_pts.push_back(Q1);
    quad_pts.push_back(Q2);
    quad_pts.push_back(Q3);
    quad_pts.push_back(Q4);

    squre_pts.push_back(R1);
    squre_pts.push_back(R2);
    squre_pts.push_back(R3);
    squre_pts.push_back(R4);


    Mat transmtx = getPerspectiveTransform(quad_pts,squre_pts);
    int offsetSize=150;
    Mat transformed = Mat::zeros(R.height+offsetSize, R.width+offsetSize, CV_8UC3);
    warpPerspective(src, transformed, transmtx, transformed.size());

    //rectangle(src, R, Scalar(0,255,0),1,8,0);

    line(src,Q1,Q2, Scalar(0,0,255),1,CV_AA,0);
    line(src,Q2,Q3, Scalar(0,0,255),1,CV_AA,0);
    line(src,Q3,Q4, Scalar(0,0,255),1,CV_AA,0);
    line(src,Q4,Q1, Scalar(0,0,255),1,CV_AA,0);

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

使用 python 在 OpenCV 中进行透视校正 的相关文章

随机推荐

  • 从 git 历史记录中删除文件 - 错误修订错误

    我按照 Github 上的说明进行操作 https help github com articles remove sensitive data https help github com articles remove sensitive
  • Android - RadioButton 未在初始选中状态下取消选中

    我在 RadioGroup 中有一个 RadioButton 当我设置按钮的初始状态时出现问题 机器人 检查 真 因为如果我按下单选按钮 F 单选按钮 M 不会取消选中 我能怎么做 怎么了 这是代码
  • 来自 URL 的 Facebook ID

    给定一个 Facebook 网址 例如http facebook com cnn http facebook com cnn 有什么方法可以获取该页面的ID而不需要抓取它吗 这是更好的 并且legal 使用图形 API 来执行此操作 只需执
  • 使用 MySQLdb 执行“SELECT ... WHERE ... IN ...”

    我在 Python 中执行一些 SQL 时遇到问题 尽管类似的 SQL 在mysql命令行 该表如下所示 mysql gt SELECT FROM foo fooid bar 1 A 2 B 3 C 4 D 4 rows in set 0
  • 如何在 Kubernetes 中模拟断电

    我有我的rook ceph集群运行于AWS 它加载了数据 有什么办法可以刺激一下电源 检测 失败这样我就可以测试我的集群的行为 从 Docker 你可以发送 KILL 信号 SIGPWR 电源故障 系统 V http man7 org li
  • 重试时修改源 Observable - RxJava

    如何在重试时更新可观察的源 List
  • 如何在 PHP 中获取单选按钮的值?

    我创建了一个基本网站 要求用户选择一个单选按钮 我想要一个 PHP 文件来检索所选单选按钮的值并做出相应响应 但该文件当前不产生任何输出 我现在使用的代码有什么问题吗 为什么我的 PHP 文件无法正确检索单选按钮值 索引 html
  • 如何在Lua中创建目录?

    是否可以在 lua 中创建目录 如果是这样 怎么办 有一个 系统 调用 或类似的东西 这是来自内存的 您应该能够使用它来运行任意程序 其中可能包括 mkdir 命令 EDIT 我找到了我的Lua 编程书 在第 203 页 它提到了如何使用
  • 将 JFreeChart 系列名称映射到系列索引

    我正在策划一个TimeTableXYDataset用一个StackedXYBarRenderer 不幸的是 每个系列的颜色在刷新时都会发生变化 我知道如何使用设置颜色setSeriesPaint渲染器的方法 但它采用整数系列索引作为参数 我
  • 如何在 .NET 中启用程序集绑定失败日志记录 (Fusion)

    如何在 NET 中启用程序集绑定失败日志记录 Fusion 将以下值添加到 HKEY LOCAL MACHINE SOFTWARE Microsoft Fusion Add DWORD ForceLog set value to 1 DWO
  • 获取 JCarousel 中当前项目的索引

    我正在尝试获取当前项目的索引J旋转木马 http sorgalla com jcarousel 这样我就可以向用户显示轮播中的当前位置 例如 13 20 我怎样才能做到这一点 EDIT 最终产品样品 我认为您正在寻找的是 carousel
  • 如何在 .NET 4.0 中使用 XPath 2.0 方法?

    我正在使用 NET 4 0 并且我想使用 XPath 2 0 方法 例如 Matches 1 upper case 2 lower case 3 尝试在文档中查找元素 X 路径示例 MyDocument MyNode matches MyA
  • pcap_loop 和 pcap_dispatch 区别

    pcap loop 和 pcap dispatch 到底有什么区别 该手册对这一点的描述非常好 我是板着脸说的 保证 从man pcap loop pcap loop processes packets from a live captur
  • nServiceBus、公共交通、Rhino 服务总线、其他?

    只是做一些快速的尝试 以可能使用消息传递系统来处理良好解耦的工作流系统中的文件 人们发现使用上述每个框架的优点和缺点是什么 与带有 WCF 绑定和 或非 MSMQ 解决方案的手动 MSMQ 系统相比 使用这些有哪些优势 我建议远离手动解决方
  • 在 Android 锁定任务模式下执行呼叫

    TL DR 如何在使用时拨打电话Activity startLockTask 我正在尝试在 Android 设备上设置受限环境 即通常所说的 Kiosk 模式 官方文档可以在这里找到 https developer android com
  • XPath 2.0 和/或 XSLT 2.0 是否会在 PHP 中实现?

    The question was asked but deleted by the asker before it received an answer Because I believe the question is sound and
  • 当 Java 类未在我的代码中实例化时,是否可以使用 Groovy 重写 Java 类中的方法?

    我正在开发一个 Eclipse RCP 应用程序 最近开始在其中使用 Groovy 所以我99 的代码仍然是Java 我读到可以使用 Groovy 重写方法并向 Java 类添加方法 并且我能够通过向 java lang String 添加
  • 清除 Jupyter Python 笔记本中的 MatPlotLib 图形

    我希望 MatPlotLib 中的 3D 散点图在 Jupyter Python 笔记本中交互式旋转 因此 我集成了一个滑块ipywidgets更新视角 下面的测试代码显示了我想要实现的目标 问题在于 在前一个数字下方添加了一个新数字 而不
  • 从 Programm 类开始打开一个窗口?

    我有一个控制台应用程序 所以我需要打开一个名为 UserInterface xaml 的窗口 这是一个窗口 我的班级计划我有这个 class Program STAThread static void Main string args va
  • 使用 python 在 OpenCV 中进行透视校正

    我正在尝试对倾斜的矩形 信用卡 进行透视校正 该矩形在所有 4 个方向上都倾斜 我可以找到它的四个角及其各自的倾斜角度 但我找不到它必须投影的坐标的确切位置 我正在使用 cv2 getPerspectiveTransform 进行转换 我有