OpenCV Android 使用最大轮廓的边缘创建新图像

2024-01-28

我能够检测图像中最大的正方形/矩形(绿色)。但是,我想将图像中检测到的最大正方形/矩形转换为新图像(存储在新的 Mat 中)。

这是该函数的返回图像,其上有最大的矩形/正方形:http://img153.imageshack.us/img153/9308/nn4w.png http://img153.imageshack.us/img153/9308/nn4w.png

到目前为止,这是我的代码:

private Mat findLargestRectangle(Mat original_image) {
    Mat imgSource = original_image;

    //convert the image to black and white
    Imgproc.cvtColor(imgSource, imgSource, Imgproc.COLOR_BGR2GRAY);

    //convert the image to black and white does (8 bit)
    Imgproc.Canny(imgSource, imgSource, 50, 50);

    //apply gaussian blur to smoothen lines of dots
    Imgproc.GaussianBlur(imgSource, imgSource, new Size(5, 5), 5);

    //find the contours
    List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
    Imgproc.findContours(imgSource, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

    double maxArea = -1;
    int maxAreaIdx = -1;
    MatOfPoint temp_contour = contours.get(0); //the largest is at the index 0 for starting point
    MatOfPoint2f approxCurve = new MatOfPoint2f();
    Mat largest_contour = contours.get(0);
    List<MatOfPoint> largest_contours = new ArrayList<MatOfPoint>();
    for (int idx = 0; idx < contours.size(); idx++) {
        temp_contour = contours.get(idx);
        double contourarea = Imgproc.contourArea(temp_contour);
        //compare this contour to the previous largest contour found
        if (contourarea > maxArea) {
            //check if this contour is a square
            MatOfPoint2f new_mat = new MatOfPoint2f( temp_contour.toArray() );
            int contourSize = (int)temp_contour.total();
            Imgproc.approxPolyDP(new_mat, approxCurve, contourSize*0.05, true);
            if (approxCurve.total() == 4) {
                maxArea = contourarea;
                maxAreaIdx = idx;
                largest_contours.add(temp_contour);
                largest_contour = temp_contour;
            }
        }
    }
    MatOfPoint temp_largest = largest_contours.get(largest_contours.size()-1);
    largest_contours = new ArrayList<MatOfPoint>();
    largest_contours.add(temp_largest);

    Imgproc.cvtColor(imgSource, imgSource, Imgproc.COLOR_BayerBG2RGB);
    Imgproc.drawContours(imgSource, largest_contours, -1, new Scalar(0, 255, 0), 1);

    //create the new image here using the largest detected square

    Toast.makeText(getApplicationContext(), "Largest Contour: ", Toast.LENGTH_LONG).show();

    return imgSource;
}

变量最大轮廓是一个 MatOfPoint 列表,但只包含最大的轮廓,也存储在最大轮廓多变的。如何根据最大轮廓制作新图像?

我在 Android 中使用 OpenCV,几乎没有关于检测图像的教程,但不完全是关于如何使用 Imgproc.warpPerspective()

Thanks!


您所需要的只是找到该轮廓的角点。您可以使用极值点 http://opencvpython.blogspot.com/2012/06/contours-3-extraction.html方法。

您应该简单地找出具有最小 x 和最小 y(这是您的左上角)、最小 x 最大 y(这是您的左下角)的点,依此类推。

在C++中,有一个名为algoritm它有最小/最大方法。例如最小元素 http://www.cplusplus.com/reference/algorithm/min_element/将帮助您找到具有最小 x 或 y 的点。不要忘记包含标题。

有了 4 个点后,就可以使用透视变换了。

首先输入您的积分这个方法 http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html#getperspectivetransform。目的地应该是

Point2f dest[4] = {(0,0),(image.width,0),(0,image.height),(image.height,image.width)}

对于你的情况。您从此方法获得的矩阵(M)将使用以下方法将您的点转换为目的地另一种方法 http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html#warpperspective.

祝你好运。

编辑:关于第二个想法;由于您的轮廓不是平行四边形,因此您的极值点为 min x = left left,min y = topleft,依此类推。那么找到最小元素就更容易了。

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

OpenCV Android 使用最大轮廓的边缘创建新图像 的相关文章

  • 如何自定义 Firebase 身份验证 ui

    我正在使用 Firebase Auth Ui 进行号码验证 我有一些要求 需要更改国家旋转器下拉项目的文本和背景颜色 我正在使用下面的样式 但它不会改变下拉菜单的背景颜色或项目的文本颜色 style name FirebaseUI Coun
  • 处理 SavedInstances 并恢复活动

    基本上我的应用程序有 2 个活动 说 A 和 B A 启动 B Activity B 播放音乐并且还有通知 情况 1 当视图仍在活动 B 上时 我按主页按钮 然后单击通知 活动 B 将打开 其视图完好无损并播放音乐 因为在清单中我使用 an
  • 如何在 Android 中的 Chrome 或 Firefox 等特定浏览器的 Web 视图中加载应用程序

    我是 Android 新手 我正在做一个应用程序 我需要在平板电脑上的 Web 视图中加载现有的应用程序 在平板电脑中 当我使用 Web 视图加载应用程序时 我的应用程序将加载到默认浏览器中 如何在平板电脑上的 Web 视图中的特定浏览器
  • animation.start() 或animation.startNow() 不会立即开始动画

    我有一个奇怪的问题 有时应该淡出我的控件 ImageButton 的动画不会立即启动 我使用淡出动画来隐藏它 然后在 myListener 的末尾 onAnimationEnd 中 我将新资源作为按钮上的图像 我的应用程序代码中的某处 An
  • adb 今天无法连接到 VirtualBox 中的 Android-x86

    我在 VirtualBox 中成功安装了 Android x86 v3 2 eeepc 一段时间 这是帮助我在 Android 上调试 USB 主机应用程序的好方法 此类配置的安装是 安装VirtualBox 将 Android x86 v
  • 使用全局变量从内部函数获取空字符串

    请帮助我解决一些小问题 我确信你能做到 D 我试图在 firestore 文档 user cases information 上设置一个字段 其中包含一个字段 case number 首先我声明这个全局变量 private String c
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • RecyclerView 单击将数据传递到新活动

    我正在制作一个包含三个选项卡的应用程序 每个选项卡都有一个带有两个文本的 recyclerview 我希望用户能够单击任何 recyclerview 项目 并且该项目中的文本应传递到新活动 这是应用程序外观的图像 https i stack
  • FileObserver 不适用于 Android 6.0 Marshmallow (API 23) 中的外部存储

    我有一个应用程序可以观察外部存储上的公共目录FileObserver 它运行良好Lollipop设备 我想添加对Marshmallow 所以我用它设置了一台 Nexus 9 平板电脑 在 Marshmallow 设备上 它失败 在 Loll
  • 如何去掉android状态栏的电池图标?

    我通过去掉背景图像来删除 Android 中显示网络 电池和时间信息的状态栏 但图标仍然存在 我也想知道如何删除电池图标 不是用于应用程序 而是用于框架开发 提前致谢 你试过打电话吗 getWindow setFlags WindowMan
  • 绘制平滑曲线

    我想创建更平滑的曲线 而不仅仅是线角 这是我现在画的图 这是我的代码 case FREEHAND float pts float ptk ptk new float 2 imageMatrix invert inv if mCurrentS
  • 错误膨胀类 android.support.design.widget.NavigationView [启动时崩溃]

    该应用程序应该有一个导航抽屉 可以从左侧拉出并显示各种活动 但是一旦将导航栏添加到 XML Activity homescreen 文档中 应用程序一启动就会崩溃 主屏幕 java package com t99sdevelopment c
  • Android 应用程序不需要任何特殊访问权限

    当我开始安装时myapp apk 我得到下面的屏幕 我的应用程序需要位置 外部存储权限 上述权限应该根据需要向用户请求 即在需要这些权限的代码之前 现在 当安装应用程序时 我会看到一个屏幕 上面显示应用程序不需要任何特殊访问权限 如下图所示
  • Android Lollipop 中应用程序外部配置文件和内部配置文件之间的数据传输

    相关问题安卓工作版 我的应用程序是一个设备管理员特权应用程序 现在我修改了创建托管工作配置文件并将其自身设置为配置文件所有者的代码 问题是 如果我upgrade我的应用程序 它成为设备管理员的配置文件所有者 现在将会有两份我的应用程序 一个
  • Android Studio - 无法解析符号“firebase”

    我目前正在将应用程序升级到新的 Firebase 版本 我按照指南进行操作 包括classpath com google gms google services 3 0 0 在我的项目 build gradle 的依赖项中以及compile
  • Android:是否可以在可绘制选择器中使用字符串/枚举?

    问题 Q1 有人设法让自定义字符串 枚举属性在 xml 选择器中工作吗 我通过以下 1 获得了一个布尔属性 但不是字符串属性 编辑 感谢您的回答 目前 android 仅支持布尔选择器 原因请参阅已接受的答案 我计划实现一个复杂的自定义按钮
  • Recyclerview项目点击涟漪效果[重复]

    这个问题在这里已经有答案了 我正在尝试添加Ripple影响到RecyclerView的项目 我在网上查了一下 但找不到我需要的东西 我努力了android background归因于RecyclerView本身并将其设置为 android
  • 我想要有条件的登录导航,没有 MAIN 片段或按钮

    我正在使用 Android Jetpack 导航组件 实时数据和 Firebase 我希望工作流程就像用户打开应用程序时一样 然后根据登录 注销状态导航到登录 配置文件片段 而不需要任何主片段或按钮 请 我的应用程序中没有主要片段 用户启动
  • PhoneGap Build Android 不显示闪屏

    这是我的 config xml 中与启动屏幕相关的代码
  • 连接到具有相同 SSID 的最强接入点(信号最强的接入点)

    我正在编写一个程序来始终连接到最强的接入点 我的意思是信号最强的接入点 首先 我扫描所有可用的 WiFi 网络 然后限制它们仅查看具有相同 SSID 的网络 这样我就可以看到一个网络的所有AP 当我连接到该网络时 它没有连接到最强的信号 但

随机推荐

  • 在算术运算中将 NaN 视为零?

    这是我正在努力解决的问题的一个简单例子 In 1 import pandas as pd In 2 import numpy as np In 3 test pd DataFrame np random randn 4 4 columns
  • 类的实例方法与模块方法

    我正在阅读 Ruby 模块方法的解释以及它们与类的实例方法有何不同 这是我正在阅读的解释 请记住 与实例方法不同 模块方法需要 在模块本身上定义 您如何访问该模块 记起 在模块定义中 self 指的是模块 定义的 因此 您需要使用 self
  • 如何使用 PHP 获取 MongoID 的字符串值?

    完成插入后 我想使用 json encode 将对象传递给客户端 问题是 id 值不包括在内 widget array text gt Some text this gt mongo gt db gt insert widget If I
  • imagemagick - 查找透明png轮廓的坐标(不是边框)

    虽然视觉轮廓很容易完成 但 imagemagick 是否可以输出透明图像轮廓的坐标 请注意 通过轮廓 我不仅仅指边界框边框 而是指任意形状的透明图像几何体周围的实际轮廓 假设您从这张具有透明背景的图像开始 您可以提取透明度并找到边缘 如下所
  • 上传大量文件时节点脚本导致系统冻结

    我有一个脚本 它是一个更大的电子程序的一部分 该脚本是一个循环 它从应用程序的临时目录中读取文件 然后将所有文件上传到 S3 这对于小型文件集效果很好 但对于较大的文件集 它会导致计算机冻结并重新启动并导致系统崩溃 Macbook pro
  • 如何使用新的 xml 属性并兼容旧版 Android 版本?

    我已经向我的应用程序添加了小部件功能 该功能与旧版本的 Android 回到 1 6 兼容 Android 3 1 中的小部件支持 xml 标签调整大小模式这是一个非常有用的功能 我希望允许用户调整他们的小部件的大小 但我仍然希望向后兼容
  • Flutter:我想在运行时将字体应用于整个应用程序文本

    我的应用程序中有语言选择设置 根据语言选择英语或阿拉伯语 我想使用不同的字体系列 我在 MaterialApp 内完成了它 但它不会实现我的目标 override Widget build BuildContext context retu
  • Phonegap/Cordova 构建错误 - Apple Mach-O 链接器错误:没有这样的文件或目录:libCordova.a

    创建新的 Cordova 2 1 0 项目并使用以前的 PhoneGap 应用程序中的一些代码更新 www 文件夹后 我收到错误 clang error no such file or directory Users peterbanjo
  • NoSQL 数据库中的全文搜索 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 这里有人有部署真正的在线系统的经验吗 该系统在任何 NoSQL 数据库中进行全文搜索 例如 全文搜索在 MongoDB Riak 和
  • PullToRefreshListView$InternalListViewSDK9 中的 IllegalStateException

    我在应用程序的两个活动中使用 PullToRefresh 库 我知道 这个库已被弃用 但它非常有用 它不仅可以处理来自顶部的刷新手势 还可以处理来自底部的刷新手势 但它有一个问题 应用程序很少因以下日志而崩溃 java lang Illeg
  • 如何在 Java 中格式化字符串

    原始问题 但如何格式化这样的字符串 第 1 步 共 2 步 通过使用 Java 替换变量 在 C 中这很容易 看一眼字符串格式 http download oracle com javase 6 docs api java lang Str
  • 将 float 转换或转换为 nvarchar?

    我需要从数据类型 float 的一列中进行选择 并将其作为 nvarchar 插入到另一列中 我尝试投射它 cast Column Name as nvarchar 50 结果是9 07235e 009而不是 10 位数字 电话号码 有谁知
  • Java 中覆盖方法的更广泛的参数类型

    下面的代码破坏了什么面向对象原则 不是 Java OO 原则 而是通用 OO 原则 class GeneralArg class Arg extends GeneralArg class A public void test Arg a c
  • 如何从数据库服务器插入带有时间戳的 MongoDB 文档

    在 Oracle 中 我可以简单地这样做 INSERT INTO myTable VALUES someValue SYSTIMESTAMP 这会将两个值插入到 myTable 中 其中之一是基于数据库服务器时间的时间戳 对于 MongoD
  • Grails 挂在命令行上

    我刚刚下载了 Grails 2 0 1 创建了一个新项目 然后尝试按照文档添加 mysql 连接器 但 Grails 在命令提示符下挂起 没有任何消息 我尝试以详细和堆栈跟踪模式执行 但它什么也没打印 我尝试清理并重新执行 但所有 grai
  • Jenkins Pipelines:如何从共享变量脚本使用 withCredentials()

    我想用一个withCredentials 块在共享变量 vars 脚本中而不是直接在 Jenkins 管道中 因为这是特定库的较低级别语义 并且根据具体情况可能需要也可能不需要 然而 withCredentials 或者 至少 它的签名 似
  • 如何在 OpenCV + Visual C++ 中测量对比度

    以前的问题是 如何在 OpenCV 中选择最佳对比度的图像 但根据 Rook 的建议 我正在更改它 我将在我的项目中使用 OpenCV Visual Studio 2010 我只是想知道 OpenCV 如何让这对我来说更容易 我从视频中提取
  • SQL Server - 缺少索引 - 什么会使用索引?

    我正在使用 SQL Server 2008 我们正在使用 DMV 来查找丢失的索引 然而 在创建新索引之前 我试图找出哪个 proc query 需要该索引 我想要获得最多的信息 以便我可以对我的索引做出明智的决定 有时 SQL Serve
  • 将 List 转换为分隔字符串列表 [重复]

    这个问题在这里已经有答案了 可能的重复 从 List 返回字符串的最优雅的方式 https stackoverflow com questions 1334072 most elegant way to return a string fr
  • OpenCV Android 使用最大轮廓的边缘创建新图像

    我能够检测图像中最大的正方形 矩形 绿色 但是 我想将图像中检测到的最大正方形 矩形转换为新图像 存储在新的 Mat 中 这是该函数的返回图像 其上有最大的矩形 正方形 http img153 imageshack us img153 93