OpenCV 仅围绕大轮廓绘制矩形?

2024-05-10

第一次发帖,希望我以正确的方式放置代码。

我正在尝试检测和计算视频中的车辆,因此,如果您查看下面的代码,我会在阈值处理和膨胀后找到图像的轮廓,然后我使用 drawContours 和矩形在检测到的轮廓周围绘制一个框。

我试图在 drawContours/rectangle if 语句上放置一个过滤器,如果矩形的面积不大于 40,000,则不绘制它。

现在,如果您查看我所附的图片,您会发现在较大的矩形内部绘制了一些矩形,但我并不想这样做。

这些矩形的面积小于 40,000,但出于某种原因绘制它们。

我打算使用矩形来计算图像上的汽车数量,但如果这不是最好的方法,我愿意接受建议。

Thanks.

using namespace cv;
using namespace std;

int main()
{
    VideoCapture TestVideo;                 //Declare video capture
    Mat frame;                              //declare Mat as frame to grab

    TestVideo.open("FroggerHighway.mp4");           //open the test video from the project directory

    if (!TestVideo.isOpened())              //If its not open declare the error
        {
            cout << "Video did not open." << endl;
            waitKey(0);
        }

    if (TestVideo.get(CV_CAP_PROP_FRAME_COUNT) < 1)     //If the frame count is less than 1, basically an error checker
        {
            cout << "Video file must have at least one frame." << endl;
            waitKey(0);
        }

    TestVideo.read(frame);                              //read the first frame
    Mat frameGray = Mat::zeros(frame.size(), CV_8UC1);  //Convert frame source to gray
    cvtColor(frame, frameGray, CV_BGR2GRAY); 

    Mat frame2 = Mat::zeros(frameGray.size(), frameGray.type());    //Intermediate frame
    Mat framediff;                                                  //Frame differencing
    Mat thresh;
    Mat element;                                                    //Element used for morphOps (dilation)
    Mat dil;    

    while (TestVideo.isOpened() & waitKey(30) != 27)                //while the video is open, show the frame, press escape to end video
        {
        absdiff(frameGray, frame2, framediff);                      //take absolute difference of both frames
        threshold(framediff, thresh, 22, 255, CV_THRESH_BINARY);    //If absdiff is greater than 22, turn it white. 

        namedWindow("Gray", CV_WINDOW_NORMAL);                      //Display gray video
        imshow("Gray", frameGray);
            
        namedWindow("FrameDiff", CV_WINDOW_NORMAL);                 //Show frame difference before threshold/dilation
        imshow("FrameDiff", framediff);

        namedWindow("Threshold", CV_WINDOW_NORMAL);                 //Show thresholded video
        imshow("Threshold", thresh);

        element = getStructuringElement(MORPH_CROSS,                //morphOps dilation
            Size(2 * 5 + 1, 2 * 5 + 1),
            Point(5, 5));
        dilate(thresh, dil, element, Point(-1, -1), 1, 1, 1);

        namedWindow("Dilation", CV_WINDOW_NORMAL);                  //Show dilated video. 
        imshow("Dilation", dil);

        //Apply findCountours function to draw countours and count the objects.
        vector<vector<Point> > contours;        //Not sure what this does but it works
        findContours(dil, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);    //(outout image, hierarchy, and 2 ways to calculate it)
        vector<vector<Point> > contours_poly(contours.size());      //Also not sure what this does
        vector<Rect> boundRect(contours.size());            //This is used to approximate a polygon to fit the contours it calculated I think

        Mat output = Mat::zeros(dil.rows, dil.cols, CV_8UC3);   
        int counter = 0;                                    //Used to count # of rectangle drawn

        for (int i = 0; i < contours.size(); i++)
        {
            approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true);  //Approximates a polygon to fit the contours calculated ?
            boundRect[i] = boundingRect(Mat(contours_poly[i]));    //for each approximation, a bounding rectangle is sorted around the contour ?

            if ((boundRect[i].x * boundRect[i].y) > 40000)          //If the bounding rectangle has an area less than 40,000 then just ignore it completely
            {
                counter = counter + 1;
                drawContours(output, contours, i, Scalar(255, 255, 255), -3);   //(input, countors, contour to be drawn, color of it, thickness (negative fills image));
                rectangle(output, boundRect[i].tl(), boundRect[i].br(), Scalar(0, 0, 255), 2, 8, 0); //Draws the actual rectangle around the contours
            }
        }

        cout << "Rectangles Drawn: " << counter << endl;

        namedWindow("Output", CV_WINDOW_NORMAL);
        imshow("Output", output);

            if (((TestVideo.get(CV_CAP_PROP_POS_FRAMES) + 1) < TestVideo.get(CV_CAP_PROP_FRAME_COUNT)) & (waitKey(30) != 27))   //Move the frame count up 1, show the frame
            {
                TestVideo.read(frame);
                frameGray.copyTo(frame2);                   //MUST USE copyTo, or clone! Can't do frame2 = frameGray*
                cvtColor(frame, frameGray, CV_BGR2GRAY);
            }
            else
            {
                cout << "End of Video" << endl;
                waitKey(0);
                break;
            }

            waitKey(30);        //wait 30ms between showing each frame
        }

    return (0);
}

你正在乘以x and y坐标来获得矩形的面积,你应该乘以width and height.

//If the bounding rectangle has an area less than 40,000 then just ignore it completely
if ((boundRect[i].width * boundRect[i].height) > 40000)          
{
// code here
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV 仅围绕大轮廓绘制矩形? 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 在搜索 List 时,为什么 Enumerable.Any(Func predicate) 比带有 if 语句的 foreach 慢

    最近有件事引起了我的好奇心 Why is the Enumerable Any Func
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 以编程方式检查页面是否需要基于 web.config 设置进行身份验证

    我想知道是否有一种方法可以检查页面是否需要基于 web config 设置进行身份验证 基本上如果有这样的节点
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • IronPython:没有名为 json 的模块

    我安装了 IronPython 我的 python 文件如下所示 import sys print sys version import json 运行它的代码 var p Python CreateEngine var scope p C
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 在非活动联合成员上使用“std::addressof”是否定义明确[重复]

    这个问题在这里已经有答案了 下面的代码是尝试实现constexpr的版本offsetof在 C 11 中 它可以在 gcc 7 2 0 和 clang 5 0 0 中编译 这取决于申请std addressof工会非活跃成员的成员 这是明确
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • BRISK 特征检测器检测零个关键点

    下面显示的 Brisk 探测器没有给我任何关键点 有人可以提出一个问题吗 我将尝试用一些代码解释我在下面所做的事情 include opencv2 features2d features2d hpp using namespace cv u
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 转到定义:“无法导航到插入符号下的符号。”

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我今天突然开始在我的项目中遇到一个问题 单击 转到定义 会出现一个奇怪的错误 无法导航到
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • OpenSSL:无需 SSL_read() / SSL_write() 即可执行加密/解密

    我已经用 C 语言编写了一个基于事件的网络库 现在我想通过 OpenSSL 添加 SSL TLS 支持 而不是使用SSL read and SSL write 我宁愿让 OpenSSL 只执行传出 传入数据的加密 解密 让我自己传输 接收数
  • 有没有用 Javascript 编写的开源 JSDoc 解析器?

    我正在寻找一个可以在我的项目中使用的 JSDoc 解析器 我正在寻找可以传递 JSDoc 注释并接收该注释含义的结构化描述的东西 我见过的大多数工具似乎都能够将 JSDoc 注释转换为 HTML 或其他格式 我正在寻找能够提供可用于输入其他
  • 使用 NSCoder 编码 CGPoint 结构

    如何编码和解码CGPoint结构使用NSCoder 编码 CGPoint point point from somewhere NSValue pointValue NSValue value point withObjCType enco
  • 为什么在 C++ 类中的数据成员上使用像 m_ 这样的前缀?

    许多 C 代码使用语法约定来标记数据成员 常见的例子包括 m memberName对于公共成员 在所有使用公共成员的情况下 memberName对于私人会员或所有会员 其他人尝试强制使用this gt member每当使用数据成员时 根据我
  • 如何在不打开邮件的情况下加载 Gmail 插件

    我们需要开发 gmail 插件来读取已检查的邮件消息并处理内容 我们使用以下应用程序 json oauthScopes https www googleapis com auth gmail addons execute https www
  • 提升shared_from_this<>()

    有人可以用几句话概括一下如何提升shared from this lt gt 应该使用智能指针 特别是从使用绑定函数在 io service 中注册处理程序的角度来看 编辑 一些回复要求提供更多背景信息 基本上 我正在寻找 陷阱 即人们使用
  • 智能感知不显示评论

    如果我在 Visual Studio 2010 中输入类似的内容数据集1 我得到所有可用方法和属性的列表 智能感知 这很好用 但是 如果我在此列表中选择一个方法或属性 我不会得到 if 的描述 例如 如果我有类似的东西 public cla
  • 为什么spring boot 1.5.3 jar无法识别src/main/resources/META-INF/resources/中的jsp文件

    我使用了spring boot jsp 我想构建一个可执行的jar 如下这个帖子 http www logicbig com tutorials spring framework spring boot boot serve dynamic
  • 在 C++ 中什么时候首选传递指针而不是引用传递?

    我可以想象一种情况 其中输入参数可以为 NULL 以便首选传递指针而不是传递引用 有人可以添加更多案例吗 在传递的对象实际上将被修改的情况下 有些人更喜欢传递指针 当对象通过引用传递时 它们使用 pass by const referenc
  • 会话过期后如何重定向到登录页面?

    我有三个 JSF 2 0 Web 模块 当会话过期时我需要重定向到登录页面 我已经尝试过使用HttpSessionListener 它正在调用sessionDestroyed 事件方法 但我无法在那里转发 重定向请求 我认为这是因为没有Ht
  • 你能测试一下 mixin 是否存在吗?

    Sass 快速提问 希望如此 你能测试 mixin 是否存在吗 例如 if thumbnail mixin else define mixin 理想情况下我会使用 unless 但这只存在于叉子上 我知道你可以覆盖 mixin 但我想更多的
  • iOS 中的视频可以进行反卷积吗?

    我想拍摄击球手挥动棒球的镜头 但球棒很模糊 视频为 30 fps 通过研究 我发现反卷积似乎是最小化运动模糊的方法 但我不知道是否或如何在我的 iOS 应用程序后处理中实现它 我希望有人能给我指出正确的方向 比如如何在 iOS 中应用反卷积
  • QGraphicsView 和 eventFilter

    这个问题已经困扰我两天多了 所以我想我应该问一下 我在Win7上使用Qt 4 5 3 用VC2008编译 我有 MyGraphicsView 继承 QGraphicsView 和 MyFilter 继承 QObject 类 当我将 MyFi
  • 当 QML 对象不可见时防止 QML 属性绑定?

    我正在开发一个具有大量属性绑定的 QML 应用程序 数百个对象被跟踪并以不同的形式显示 例如 Qt3D QCanvas 当我在应用程序的单独页面上时 x y 位置和相对大小的属性绑定仍在发生 我怎样才能阻止他们 我知道我可以根据属性是否可视
  • 无法构建项目输出组内容文件

    目前 我正在尝试使用 Visual Studio 2010 为我们的 ASP net4 Silverlight Web 应用程序之一创建一个 WebSetup 项目 我根据创建了安装项目this http weblogs asp net s
  • 为什么 getch 不可移植?

    是什么使得 getch 本质上无法作为标准 C 函数包含在内 对于控制台界面来说 它是如此直观和优雅 如果没有它 要求输入单个字符总是会产生误导 因为用户可以输入多个键 更糟糕的是 您经常需要确保在读取控制台输入后清除标准输入 这甚至不是作
  • 集成 Windows 身份验证可以在 Firefox 中使用吗?

    如果我的 ASP NET 应用程序是使用 Windows 集成身份验证为 ADFS 设置的 我知道这可以在 IE 中工作 但是它可以在 Firefox 中工作吗 我在网络上看到一些内容表明存在问题 您需要在每个客户端浏览器中设置解决方法 h
  • 在 Haskell 中增长数组

    我想在 Haskell 中实现以下 命令式 算法 给定一个序列对 e0 s0 e1 s1 e2 s2 en sn 其中 e 和 s 部分不一定是自然数不同的是 在每个时间步都会随机选择该序列的一个元素 例如 ei si 并根据 ei si
  • 曲线/路径骨架二值图像处理

    我正在尝试开发一个可以处理图像骨架的路径 曲线的代码 我想要一个来自两点之间骨架的点向量 该代码在添加一些点后结束 我没有找到解决方案 include opencv2 highgui highgui hpp include opencv2
  • OpenCV 仅围绕大轮廓绘制矩形?

    第一次发帖 希望我以正确的方式放置代码 我正在尝试检测和计算视频中的车辆 因此 如果您查看下面的代码 我会在阈值处理和膨胀后找到图像的轮廓 然后我使用 drawContours 和矩形在检测到的轮廓周围绘制一个框 我试图在 drawCont