如何使用OpenCV或其他库从图像中检测电视屏幕?

时间:2014-06-23 10:45:08

标签: c++ image opencv image-processing

我现在已经有一段时间了,但是找不到合适的解决方案。

我使用OpenCV进行图像处理,我的工作流程是这样的:

  1. 拍了一张电视的照片。
  2. 将图像分割为R,G,B平面 - 我也开始使用H,S,V进行测试,看起来有点看好。
  3. 对于每个平面,范围值为0到255
  4. 的阈值图像
  5. 降低噪音,用精确检测边缘,找到轮廓并近似它。
  6. 选择包含图像中心的轮廓(我可以假设图像的中心位于电视屏幕内)
  7. 使用convexHull和HougLines过滤和细化无效轮廓。
  8. 选择具有特定区域的轮廓(区域在图像的10%-90%之间)。
  9. 仅保留仅有4个点的轮廓。
  10. 但这太慢了(在每个通道上循环(RGB),然后循环为阈值等等)并且因为它没有检测到很多电视而不是很好。

    我的基本代码是OpenCV框架的squares.cpp示例。

    电视屏幕检测的主要问题是:

    1. 半暗半亮的图像或屏幕上有许多暗/亮项目。
    2. 屏幕上与电视框架颜色相同的元素。
    3. 模糊的电视边缘(在某些情况下)。
    4. 我也在矩形检测中搜索了许多SO问题/答案,但都是关于检测暗背景上的白页或对比背景上的固定颜色对象。

      我的最终目标是在Android / iOS上实现此功能,以实现近乎实时的电视屏幕检测。我的代码在Galaxy Nexus上最多需要4秒钟。

      希望有人能提供帮助。提前谢谢!

      更新1:只使用canny和houghlines,不起作用,因为可能有很多行,选择正确的行可能非常困难。我认为应首先对图像进行某种“清洁”。

      更新2 question是最接近问题的地方之一,但对于电视屏幕,它无效。

1 个答案:

答案 0 :(得分:4)

希望这些观点提供一些见解:

1)

如果您可以通过前景和背景正确分割图像,则可以轻松地在前景周围设置边界框。图形切割是分割图像的非常强大的方法。 OpenCV似乎为它提供了易于使用的实现。因此,例如,您提供了一些覆盖“前景”和“背景”像素的笔触,并且您的图像将转换为最佳切片以分割两者的图形。这是一个有趣的例子:

http://docs.opencv.org/trunk/doc/py_tutorials/py_imgproc/py_grabcut/py_grabcut.html

这是我用一个快速的东西来说明它的有效性: Example of what this library can do

2)

如果您决定继续沿着边缘检测路线行进,那么在尝试拟合物体周围的边界框或轮廓之前,请考虑使用“数学形态学”来“清理”您检测到的线条。

http://en.wikipedia.org/wiki/Mathematical_morphology

3)

您可以在包含电视的数据集中进行训练,并使用中提琴算法进行对象检测。传统上它用于人脸检测,但您可以根据足够的数据对电视进行调整。例如,您可以通过脚本下载带有电视的客厅图像作为您的正面课程,而没有电视的客厅则作为您的负面课程。

http://en.wikipedia.org/wiki/Viola%E2%80%93Jones_object_detection_framework http://docs.opencv.org/trunk/doc/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html

4)

你可以使用互相关进行图像配准,就像这个漂亮的MATLAB示例所示:

http://www.mathworks.com/help/images/examples/registering-an-image-using-normalized-cross-correlation.html

对于可以在搜索图像上滑动的模板电视图像,您可以获得一堆电视图片并创建“Eigenscreens”,类似于Eigenfaces用于面部识别并生成平均电视图像:

http://jeremykun.com/2011/07/27/eigenfaces/

5)

看来OpenCV有很多有趣的工具来描述形状和结构特征,这似乎主要是你感兴趣的东西。值得一看,如果你还没有看到这个:

http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html

祝你好运。