我一直在试图弄清楚如何在桌子上检测卡片,然后提取卡片的图像。在做了一些阅读之后,我认为最好使用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)
答案 0 :(得分:1)
关于它的博客文章很好:
So I Suck At 24: Automating Card Games Using OpenCV and Python
该代码可在gihub上找到:https://github.com/arnabdotorg/Playing-Card-Recognition
答案 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变换或使用颜色信息。