gpt4 book ai didi

c++ - 使用 Opencv 如何在消除框内打印的对象的同时检测图像中的框?

转载 作者:行者123 更新时间:2023-11-28 02:43:43 24 4
gpt4 key购买 nike

我正在尝试在 qt 中开发框排序应用程序并使用 opencv。我想测量盒子的宽度和长度。

Input Image

如上图所示,我只想检测最外面的线(即盒子边缘),这将给我盒子的宽度和长度,而不管盒子内打印的是什么。

我尝试了什么:

  1. 首先,我尝试使用 Findcontours() 并选择了具有最大面积的轮廓,但外边缘的轮廓多次未被封闭(在 canny 输出的某处损坏),因此未被检测到作为轮廓。

  2. Hough line transform 给了我太多行,我不知道如何只从中得到我感兴趣的四行。

  3. 我尝试了我的算法,

    将图像转换为灰度。

    取一列图像,将每个像素与该列的下一个连续像素进行比较,如果该值的差异大于某个像素属于边缘的阈值(比如 100),则将其存储在数组中。对所有列执行此操作,它会给出平行于 x 轴的框的上线。

    按照相同的步骤,但是从最后一列和最后一行(即从下到上),它会给出平行于 x 轴的下线。

    同样找到平行于 y 轴的线。现在我有四个点阵列,每一侧一个。

现在,如果盒子的放置方式使其边与 X 轴和 Y 轴完全平行,这会给我很好的结果。如果盒子稍微朝某个方向放置,它会给我很明显的对角线,如下图所示。

Wrong Output

如下图所示,我从所有四个点阵列(负责绘制对角线)中删除了前 10 个点和后 10 个点并绘制了线,当框倾斜得更多以及测量值时,这将不起作用会出错。

enter image description here

现在我的问题是,

在 opencv 中有没有更简单的方法来仅获取框的外边缘(矩形)并获取尺寸,忽略框上打印的任何内容以及朝向任何方向?

我不一定要求纠正/改进我的算法,但也欢迎提出任何建议。抱歉发了这么大的帖子。

最佳答案

我建议采取以下步骤:

1:通过使用cv::inRange() ( documentation ) 选择背景颜色制作蒙版图像。然后使用 cv::not() 反转这个掩码。这只会给你盒子。

2:如果您不担心阴影、深度效应会使您的测量不准确,您可以立即继续尝试再次使用 cv::findContours()。您选择最大的轮廓并将其存储在 cv::rotatedRect 中。

3:这个 cv::rotatedRect 将为您提供一个 rotatedRect.size,它以像素为单位定义框的宽度和高度

关于c++ - 使用 Opencv 如何在消除框内打印的对象的同时检测图像中的框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25082372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com