使用Python中的OpenCV检测白色桌子上的卡片/矩形?

时间:2012-03-27 06:16:25

标签: python image opencv detection

我一直在试图弄清楚如何在桌子上检测卡片,然后提取卡片的图像。在做了一些阅读之后,我认为最好使用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)

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

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

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

如果在图像中检测到其他轮廓,则使用contourArea()

检索最大的矩形(面积最大的轮廓)

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

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

答案 2 :(得分:0)

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

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