OpenCV C++/Obj-C:正确的对象检测

2023-11-24

作为某种“假日项目”,我正在玩 OpenCV,想要检测和测量东西。

当前工作流程(早期-检测):

  1. 转换为灰度(cv::cvtColor)
  2. 应用自适应阈值 (cv::adaptiveThreshold)
  3. 应用 canny 边缘检测 (cv::Canny)
  4. 查找轮廓(cv::findContours)

我的结果有点糟糕,我不确定什么是正确的方向。我已经让 cvBlob 在我当前的设置(OSX 10.7.2,Xcode 4.2.1)下工作,这是一个更好的方法吗?如果是这样,我该如何以正确的方式实施它?

或者我需要先扣除背景?我尝试过,但后来找不到轮廓

Here's my image: image to measure

And that's my output, when I draw my contours back into the first image: output

UPDATE

我让它在我的程序中工作,但我的输出看起来有点不同......

- (IBAction)processImage:(id)sender
{
    cv::Mat forground = [[_inputView image] CVMat];
    cv::Mat result = [self isolateBackground:forground];
    [_outputView setImage:[NSImage imageWithCVMat:result]];
}

- (cv::Mat)isolateBackground:(cv::Mat &)_image
{
    int rh = 255, rl = 100, gh = 255, gl = 0, bh = 70, bl = 0;
    cv::cvtColor(_image, _image, CV_RGB2HSV_FULL);
    cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
    cv::Mat bgIsolation;
    cv::inRange(_image, cv::Scalar(bl, gl, rl), cv::Scalar(bh, gh, rh), bgIsolation);
    bitwise_not(bgIsolation, bgIsolation);
    erode(bgIsolation, bgIsolation, cv::Mat());
    dilate(bgIsolation, bgIsolation, element);
    return bgIsolation;
}

这可能是一种黑客行为,但由于这是一个“假日项目”,所以我无论如何都会发布它:)

您是否尝试过隔离背景,然后反转蒙版(这会假设任何非背景的东西都是对象,但它可能适合您想要的效果)。

Below is the result I got using the OpenCV inRange function: enter image description here

您可能想要平滑图像(预处理)高斯模糊消除一些锯齿。我使用了比侵蚀内核更大的膨胀内核(5x5 与 3x3)来消除一些噪声像素。平滑可能会有所帮助,调整阈值也可能使侵蚀变得不必要。但是,这应该可以帮助您开始。

最后,这是我用来查找此范围的快速小代码片段:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <vector>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    Mat src = imread("test.jpg");


    int rh = 255, rl = 100, gh = 255, gl = 0, bh = 70, bl = 0;

    string windowName = "background";
    namedWindow(windowName);

    createTrackbar("rh", windowName, &rh, 255);
    createTrackbar("rl", windowName, &rl, 255);
    createTrackbar("gh", windowName, &gh, 255);
    createTrackbar("gl", windowName, &gl, 255);
    createTrackbar("bh", windowName, &bh, 255);
    createTrackbar("bl", windowName, &bl, 255);

    // for dilation
    Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));

    Mat bgIsolation;
    int key = 0;
    do
    {
        inRange(src, Scalar(bl, gl, rl), Scalar(bh, gh, rh), bgIsolation);

        bitwise_not(bgIsolation, bgIsolation);

        erode(bgIsolation, bgIsolation, Mat());
        dilate(bgIsolation, bgIsolation, element);

        imshow(windowName, bgIsolation);
        key = waitKey(33);
    } while((char)key != 27);

    waitKey();

    return 0;
}

享受假期项目!挺有趣的 :)

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

OpenCV C++/Obj-C:正确的对象检测 的相关文章

  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 无法将项目添加到 NSMutableArray ivar

    我的目标是将字符串添加到数组中 并在我调用的方法中执行此操作 在这个方法中 我在数组中得到一个空值 但不知道为什么 我在课程开始时有这样的内容 NSMutableArray listOfEvents 以及我在每个事件上调用的方法 void
  • UITabBarController 为 TabBar 的每个 ViewController 提供不同的 Storyboard 文件

    我的团队正在开发一个具有 UITabBarController 的应用程序 我们正在使用 Storyboard 来开发界面和流程 由于我们是一个团队 所以我们不能将所有流程放在一个故事板中 因为这会导致与 SVN 同步出现问题 所以 解决方
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 使用强光混合模式时突出显示伪影

    我正在 iPhone 应用程序中使用顶部图像的 HardLight 混合模式混合两个图像 它看起来像这样 UIGraphicsBeginImageContext size sourceImage drawInRect rectangle b
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • System.ObjectDisposeException:无法访问关闭的流

    这是否确实意味着该流已被代码处置 无论是在 using 中还是通过调用 dispose 流可能已在此代码之外关闭 并且此异常仍然会发生 所以我将以我的评论作为答案 是的 流也可以从代码外部关闭 所以请确保检查System ObjectDis
  • 求0、2、4、6、8组成的递增数列中的第n个数?

    我们有一个递增序列 其中每个元素仅由偶数组成 0 2 4 6 8 我们怎样才能find the nth number in this sequence 是否有可能在 O 1 时间内找到该序列中的第 n 个数字 顺序 0 2 4 6 8 20
  • 在Rcpp中实现apply函数

    我一直在尝试在 Rcpp 中实现 apply 函数 到目前为止代码如下所示 Rcpp export NumericVector apply NumericMatrix x int dim Function f NumericVector o
  • 在 C 语言中,声明指针的正确语法是什么?

    我依稀记得之前在另一个问题的回答中看到过这个 但搜索并没有找到答案 我不记得是什么了proper声明变量为指针的方法 是吗 Type instance Or Type instance 尽管我知道两者在大多数情况下都会编译 但我相信在某些示
  • false' 在 maven 3' aria-label=''false' 在 maven 3'> 'false' 在 maven 3

    为什么 maven 3 在 pom xml 的快照存储库配置中贬值 false 其背后的动机是什么
  • 从应用程序注销后如何取消订阅 FCM 通知?

    我已经在我的应用程序中实现了 Firebase 云消息传递以用于推送通知 一切工作正常 但即使用户从应用程序注销 也会收到通知 我听说 当用户从应用程序注销时 我需要删除 FCM 令牌 所以我在注销方法中这样做了 void logout F
  • 如何为vim设置syntastic?

    所以我将存储库克隆到 vim bundle并安装了病原体 我可以确定病原体工作正常 因为我的捆绑包中的其他插件都工作正常 经过谷歌搜索一段时间后 似乎 syntastic 应该可以直接用于 c 代码 我还检查了我是否拥有指定的所有可执行文件
  • T-SQL - 什么是内联视图?

    我最近回答了这个问题如何按顺序调用用户定义的函数以与按顺序选择组一起使用 我的答案是使用内联视图来执行该功能 然后对其进行分组 在评论中 提问者没有理解我的回答 并要求提供一些网站 参考资料来帮助解释 我快速谷歌了一下 没有找到任何很好的资
  • 在 Swift 中使用 NumberFormatter 格式化大十进制数

    我这样做是为了格式化数字 但对于大数字来说失败 let formatter NumberFormatter formatter numberStyle decimal if let number formatter number from
  • 在 Eclipse 中使用 Gwt 2.7

    有gwt 2 7版本的eclipse插件吗 如果我从官方存储库安装 eclipse 插件 https dl google com eclipse plugin 4 4 它将 Google Web Toolkit SDK 2 6 0 列为唯一
  • 调整图像大小以适合 div

    如何调整图像大小以适合 div 的大小piecemaker container div div img src splash jpg alt some text div div piecemaker container display bl
  • 选择性同步 Google Drive 本地文件夹? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 Google Drive 中是否有一种方法可以对本地文件夹进行选择性同步 即将父文件夹同步到云 同时仅将某些选定的子文件夹保留在本地 例如 在我的本地电脑上project文件夹有3个
  • 搜索 ClearCase 来查找带有特定评论的签入

    我被要求提供大约 3 个月前签入 ClearCase 的详细信息 我知道评论中包含的 QC 编号 但迄今为止完全未能找到一种方法来搜索 ClearCase 以通过评论签入 有任何想法吗 布赖恩 阿格纽走在正确的轨道上 但需要注意的是 我确信
  • Conda:直接从 github 安装/升级

    我可以使用以下命令从 GitHub 安装 升级包吗conda 例如 与pip我可以 pip install git git github com scrappy scrappy master 安装scrappy直接从masterGitHub
  • python 中导入 timeit.timeit 变量

    我正在尝试使用timeit timeit 以便找出执行特定代码行需要多少时间 问题是这一行包含变量 我需要以某种方式导入它们 所以我的问题是如何导入 为了更清楚 代码看起来像这样 def func var1 aaa var2 aab t1
  • Android:使用 FLAG_SECURE 时更改窗口背景的颜色

    我有一个请求 当我的 Android 应用程序放入后台时 我会清空屏幕以隐藏敏感数据 使用以下方法很容易实现 getWindow addFlags WindowManager LayoutParams FLAG SECURE 困难的部分似乎
  • Python 如何比较“int”和“float”对象?

    文档关于数字类型指出 Python 完全支持混合算术 当二元算术运算符具有不同数值类型的操作数时 较窄 类型的操作数会扩展到另一个操作数 其中整数比浮点窄 浮点又比复数窄 混合类型的数字之间的比较使用相同的规则 以下行为支持这一点 gt g
  • Rails 5 - 对象关系阻抗以及如何构造多个继承的类/表

    EDIT我对原文进行了编辑 以便更容易理解 我了解对象关系阻抗问题 我了解 Rails STI 和多态性 Rails 方式 但它不是真正的 OO 多态性 我已经阅读了大量有关此问题的博客和问题 但仍然找不到这个问题的答案 class Per
  • 大O,你是如何计算/近似的?

    大多数拥有计算机科学学位的人肯定知道什么大O代表 它帮助我们衡量算法的扩展程度 但我很好奇 怎么办you计算或近似算法的复杂性 我将尽力在这里用简单的术语解释它 但请注意 这个主题需要我的学生几个月的时间才能最终掌握 您可以在第 2 章中找
  • OpenCV C++/Obj-C:正确的对象检测

    作为某种 假日项目 我正在玩 OpenCV 想要检测和测量东西 当前工作流程 早期 检测 转换为灰度 cv cvtColor 应用自适应阈值 cv adaptiveThreshold 应用 canny 边缘检测 cv Canny 查找轮廓