OpenCV - 如何在场景中裁剪出卡车的后部?

3

目前我正在处理许多长得大致相似的图像,就像这样:

enter image description here

我想像这样剪裁出卡车的后部:

enter image description here

以下是一些让此任务具有挑战性的因素:

  • 卡车的颜色可能不同
  • 场景可能是白天或黑夜
  • 背景可以变化很大(树木、灌木、道路、天空等)

但以下条件可对我有所帮助:

  • 卡车总是占据图像中的大部分
  • 相机的分辨率和质量至少与此示例图像一样好
  • 如果在晚上,卡车的后部将会有一个洪灾灯或类似的光源照亮

到目前为止,我很难找到有效的解决方案。以下是我尝试过的一些方法:

  • 使用高斯模糊/腐蚀/膨胀/开启/关闭等方法(在获取单通道之前和之后都可以使用)
  • 将图像转换为灰度图像
  • 分离B、G、R通道
  • 分离H、S、V通道
  • 分离L、A、B通道
  • 对于上述的每个通道,我都尝试了以下几种方法:
  • cv::threshold()
  • cv::adaptiveThreshold()
  • cv::Canny()
  • cv::floodFill()
  • cv::watershed()

但以上方法都没有产生任何有希望的结果。

请问是否有其他替代方法或方向?也许我错过了一些有用的预处理步骤?我不确定接下来该做什么。


在卡车的后部,有哪些特定的功能可以注册?例如公司标志或左侧的编号? - Herr von Wurst
不幸的是,拖车可以属于众多公司中的任何一家。商标可能不同,编号也可能随处可见。 - cdahms
1
听起来像是机器学习的工作。 - alkasm
如果您能发布更多的样本图像(以了解图像的多样性),那就太好了。 - GaneshTata
你尝试过使用深度学习目标检测API来解决这个问题吗?比较结果应该很快。 - pratsJ
3个回答

4

我过去尝试过类似的事情。

由于图像可能会因照明、背景等因素而高度变化,因此设置阈值和检测线并不适用于所有图像。

解决方法:

采用深度学习模型。 最初使用约1000个图像来训练您的模型。输入为图像,输出为裁剪区域的坐标。

由于您将获得矩形的坐标作为输出,请使用这些坐标来裁剪该区域。 有关详细信息,请查看


感谢您的回复,我不知道为什么有些混蛋会对您的回答进行负评。越想越觉得图像的变异性足以需要深度学习方法。我想我会尝试让TensorFlow在这方面发挥作用,看看我能得出什么结果。那个链接也非常有帮助。 - cdahms
非常感谢您:)很高兴您发现这有帮助。 - janu777
这是一个很好的例子,可以提供实际有用的答案而不包含代码。在 Stack Overflow 上有一个趋势,即对没有代码的答案进行投票降权,希望管理员能够注意到这一点。 - Totoro

0
一个简单的方法是在进行Canny边缘检测后执行Hough线检测(cv::HoughLines),并选择使用检测到的近似水平和垂直线条形成的最大矩形。
虽然基于阈值的方法可能适用于某些图像,但它们忽略了高级信息,例如容器背面的矩形形状。 此页面有一个可用的示例,可以作为起点。
如果需要更多细节,我会编辑问题。

HoughLines() 和 HoughLinesP() 都需要二进制图像,因此我必须按照我在帖子中提到的其中一种方式将其转换为单通道图像,然后进行二值化处理以使用其中任何一个。正如 janu777 所提到的,图像中可能存在太多的变异性,以至于无法获得 4 条干净、一致的线条。也许我应该在原始帖子中进一步澄清这一点。 - cdahms
要获取霍夫线,您需要一个二进制图像,但它不是通过阈值处理创建的。最好使用Canny边缘检测来创建它。与阈值处理相比,边缘检测对光照变化更具鲁棒性。我更新了答案以反映这一点。 - Totoro
谢谢,但我在原帖中已经提到了我尝试过cv::threshold、cv::adaptiveThreshold和cv::Canny()。 - cdahms

0

首先,你真的需要自动裁剪吗?

如果你的大量图片少于10000张,那么你应该手动处理。 如果数量超过了这个数字并且随着时间增加,那么你应该开发软件。

其次,根据你的条件,简单的阈值处理将永远不会奏效。对于一个简单的阈值来说,它太复杂了。

在我看来,最简单的方法是首先分割你的图像,然后切掉面积最大的分割部分。 你也可以使用更复杂的方法,比如训练一个检测器来检测卡车。(SSD目前是最好的物体检测器)


是的,我需要自动裁剪卡车,这些图像将来自视频摄像机,当卡车通过时(为避免提及任何公司特定信息,我不想详细说明)。感谢您的建议,似乎需要采用深度学习方法。 - cdahms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接