我做了一个程序来制作图形界面,而有人在播放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
这些是我的细胞:
答案 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