打开CV tic tac toe X / O检测

时间:2016-06-03 17:52:45

标签: c++ opencv

我做了一个程序来制作图形界面,而有人在播放tic tac toe(在视频上)。问题是如何确定X或O?我试图使用轮廓区域,但有时它不是一条闭合线,所以它给出了一些小的最大轮廓区域。我尝试的另一个想法是使用层次结构,如果它超过3,则它是O,但它会产生一些不好的结果。我也不能使用它可以吃掉我的物体。我的代码:

time.Time{sec:-31550760, nsec:0, loc:(*time.Location)(0x1811e0)}
time.Time{sec:-31546800, nsec:0, loc:(*time.Location)(0x1811e0)}
time.Time{sec:-31590000, nsec:0, loc:(*time.Location)(0x1811e0)}
time.Time{sec:-31547100, nsec:0, loc:(*time.Location)(0x1811e0)}
time.Time{sec:-31590360, nsec:0, loc:(*time.Location)(0x1811e0)}
time.Time{sec:-31575600, nsec:0, loc:(*time.Location)(0x1811e0)}
parsing time "23:00am": hour out of range

这些是我的细胞:

one two

2 个答案:

答案 0 :(得分:2)

最好的方法是计算其中一个图像的底部投影,然后确定它是X还是O: 底部投影只是一个整数数组,其中索引i中的每个单元格包含图像中从下到上直到第一个非黑色像素的列i中的像素数。

对于X图像,您将获得包含升序序列然后降序序列的投影, 对于O图像,您将得到一个递减序列,然后是递增序列。

计算投影只需将每列中的像素数相加,直到达到非黑色像素为止, 由于图像中的噪声,您需要从投影数组中省略单元格i中的值,如果它比单元格i-1中的值大或小2或更多,也需要省略更高的值。从投影数组开始和结束,因为它们可能是完整列的总和(从下到上的总和)。

记得从投影中删除所有第一个和最后一个值 - 只留下低于高度/ 2的值 检查序列:

    private bool IsDescending(int[] proj,int len)
    {
            for (int i = 0; i < len-1; i++)
            {
                if (proj[i] < proj[i + 1])
                    return false;
            }
            return true;
    }
    private bool IsAscending(int[] proj,int len)
    {
            for (int i = 0; i < len-1; i++)
            {
                if (proj[i] > proj[i + 1])
                    return false;
            }
            return true;
    }
祝你好运。

答案 1 :(得分:1)

我过去常常通过比较检测到的轮廓,以及我已经看到哪个轮廓最接近的轮廓(最佳匹配)。

如何?有一个OpenCV功能,它为我们这样做。它需要几个轮廓,它返回一个显示其相似性的指标(我认为是双值[0到1])。因此,如果您已经有两个X和O图像,并且检测到一个形状,那么您只需在已有的每个图像上调用该函数,它将返回两个值。然后,您只需比较这两个值,看它是O还是X(值越小,轮廓越相似)。

此处:检查 3部分。匹配形状 http://docs.opencv.org/3.1.0/d5/d45/tutorial_py_contours_more_functions.html#gsc.tab=0