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

OpenCV-如何在场景中裁剪卡车后部?,opencv,computer-vision,Opencv,Computer Vision,目前,我正在处理大量大致如下所示的图像: 我想把卡车后部剪成这样: 以下是我面临的一些挑战: 卡车可以是任何颜色 场景可以是白天也可以是晚上 背景可能会有很大的变化(树木、灌木丛、道路、天空、, ) 我有以下对我有利的工作: 卡车总是会填满大部分图像 相机的分辨率和质量至少会和这张照片一样好 示例图像 如果在夜间,卡车后部将相对良好地照明,并配备 泛光灯或类似产品 到目前为止,我很难找到更多的工作。以下是我尝试过的一些事情: 高斯模糊/侵蚀/膨胀/打开/关闭(两者 在到达单个通道之

目前,我正在处理大量大致如下所示的图像:

我想把卡车后部剪成这样:

以下是我面临的一些挑战:

  • 卡车可以是任何颜色
  • 场景可以是白天也可以是晚上
  • 背景可能会有很大的变化(树木、灌木丛、道路、天空、, )
我有以下对我有利的工作:

  • 卡车总是会填满大部分图像
  • 相机的分辨率和质量至少会和这张照片一样好 示例图像
  • 如果在夜间,卡车后部将相对良好地照明,并配备 泛光灯或类似产品
到目前为止,我很难找到更多的工作。以下是我尝试过的一些事情:

  • 高斯模糊/侵蚀/膨胀/打开/关闭(两者 在到达单个通道之前和之后,请参见下一个要点)
  • 转换为灰度
  • 打开B、G、R通道
  • 打开H、S、V通道
  • 打开L,A,B频道
  • 在以上10个频道中,我都尝试过:
  • cv::threshold()
  • cv::adaptiveThreshold()
  • cv::Canny()
  • cv::洪水填充()
  • cv::流域()
所有这些都没有产生一个似乎有希望的结果


有人能提供其他建议吗?不同的方向?也许我错过了另一个有用的预处理步骤?我不确定下一步该去哪里。

一个简单的方法是在执行Canny边缘检测后执行Hough线检测(cv::HoughLines),然后选择可以使用检测到的近水平线和垂直线形成的最大矩形

虽然基于阈值的方法可能适用于某些图像,但它们忽略了高级信息,如容器背部的矩形形状

有一个可以作为起点的工作示例


如果您需要更多详细信息,我将编辑此问题。

第一条评论,您真的需要自动剪切吗

如果你的大量图片少于10000张,那么你应该手工制作。 如果这个数字大于这个数字,并且可以随着时间的推移而增加,那么你应该构建这个软件

其次,在你的条件下,简单的门槛永远不会起作用。它太复杂了,一个简单的阈值无法处理它

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

我过去也尝试过类似的方法

设置阈值和检测线并不适用于所有图像,因为它们可能会随着照明、背景等的变化而变化

解决方案:

选择深度学习模式。 最初用大约1000张图片训练你的模型。输入为图像,输出为裁剪区域的坐标

因为作为一个输出,你将得到一个矩形的坐标。使用这些坐标裁剪出区域。
查看更多详细信息。

卡车后部是否有可注册的特定功能?例如,公司标志,或左边的数字?不幸的是,不,拖车可以是许多公司中的任何一家。徽标可以不同,数字可以在任何地方。听起来像是机器学习的工作。如果您可以发布更多的示例图像(以了解图像的多样性),那就太好了。您是否尝试过任何深度学习对象检测API来解决此问题?比较结果应该很快。HoughLines()和HoughLinesP()都采用二值图像,因此我必须按照我在文章中提到的方法之一转换为一个通道,然后对二值图像进行阈值选择以使用这两种方法之一。正如janu777所提到的,图像中可能存在如此多的变化,因此不可能获得4条干净、一致的线条。也许我应该在我的原始帖子中进一步澄清这一点。要获得霍夫线,你需要一个二值图像,但它不是通过阈值来创建的。最好使用Canny边缘检测创建它。边缘检测比阈值检测对光照变化更具鲁棒性。我更新了答案以反映这一点。谢谢,但我在原始帖子中已经提到,我尝试了cv::threshold、cv::adaptiveThreshold和cv::Canny()是的,我需要自动裁剪卡车,卡车经过时图像将来自摄像机(为了避免提及任何特定于公司的内容,我不想详细说明). 谢谢你的建议,似乎需要一种深入的学习方法。谢谢你的回答,我不知道为什么有些人对你的回答投了反对票。我想得越多,图像中的可变性就足够了,似乎有必要进行深入的学习。我想我会试着让TensorFlow来做这件事,看看我能想出什么。这个链接也很有帮助。非常感谢:)很高兴你发现了帮助这是一个很好的例子,它提供了一个不包含代码的真正有用的答案。现在有一种趋势,所以没有代码就投票否决答案,我希望主持人能注意这一点。