【问题标题】:Detect cards/rectangles on white table with OpenCV in Python?在 Python 中使用 OpenCV 检测白桌上的卡片/矩形?
【发布时间】:2012-04-10 16:09:55
【问题描述】:

我一直在试图弄清楚如何检测桌子上的牌,然后只提取牌的图像。在做了一些阅读之后,我认为最好使用 cv.Canny 进行边缘检测,因为卡片将是白桌上唯一的东西。然后,根据检测到的边缘从图像的矩形切口中获取卡片图像。

但我不确定如何从 Canny 信息中获取边缘信息(坐标)。我可以获取 Canny 信息并将其存储到 IplImage,但我不确定如何获取在卡片周围创建矩形并剪切图像所需的信息。

import cv

cam = cv.CaptureFromCAM(0)

while True:
    capture = cv.QueryFrame(cam)

    #apply mask to block out white background
    grey = cv.CreateImage(cv.GetSize(capture), 8, 1)
    masked_image = cv.CreateImage(cv.GetSize(capture), 8, 3)
    cv.CvtColor(capture, grey, cv.CV_BGR2GRAY)
    cv.Threshold(grey, grey, 100, 255, cv.CV_THRESH_BINARY)
    cv.Zero(masked_image)
    cv.Not(grey, grey)
    cv.Copy(capture, masked_image, grey)

    #detect corners
    corners = cv.CreateImage(cv.GetSize(masked_image), 8, 1)
    #cv.CornerHarris(masked_image, corners, ?)
    cv.Canny(grey, corners, 900, 890)
    cv.ShowImage('b_window', corners)
    cv.WaitKey(2)

【问题讨论】:

标签: python image opencv detection


【解决方案1】:

假设卡/矩形的边缘在 Canny 操作后突出,您可以使用带有 CV_RETR_EXTERNAL、CV_CHAIN_APPROX_SIMPLE 的 findContours 找到外部轮廓,以检索用 4 个点编码的矩形轮廓。请注意,透视失真并不重要,因为它会编码 4 个外部点,而与透视无关。

测试轮廓(范围内角度的凸面)。 karlphillip 做了一个很好的例子: https://stackoverflow.com/a/8863060/3475075

如果检测到图像中的其他轮廓,则使用 contourArea() 检索最大的矩形(面积最大的轮廓)

如果您需要知道哪个点是左上角、右上角等,一个简单的确定方法是计算 x 和 y 值的和和差:

  • 左上角的和最小
  • 右下角的和最大
  • 右上角的点差异最小
  • 左下角差异最大

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      您应该发布更多详细信息以帮助缩小建议范围。例如,是图像开销,还是会有投影失真?是否有统一的照明?有多少张卡?卡会重叠吗?一般来说,边缘检测器只是物体检测的第一步。

      不过,如果您的问题受到高度限制,您或许可以设置阈值、过滤连接的组件、使用霍夫变换或使用颜色信息。

      【讨论】:

      • 它们将被布置在白色背景上,没有投影失真,均匀照明,希望尽可能多的卡片(十几个?),它们不会重叠。我已经在数据库中找到了我正在寻找的图像(卡片扫描),并带有一个完美的散列(pHash),所以我只需要一个与卡片扫描相同/相似的图像。如果我能以某种方式获得检测到的卡片/边缘的每个角的实际 x,y 坐标,那么我想我可以从那里得到它。
      猜你喜欢
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 2020-07-02
      • 2017-12-02
      • 1970-01-01
      • 2018-05-03
      相关资源
      最近更新 更多