Ser*_*nov 2 python opencv bots computer-vision
完成计算机视觉书籍的几个章节后,我决定应用这些方法为游戏创建一些原始的机器人.我选择的Fling几乎没有任何动态,我需要做的就是找球.球可以有5种不同的颜色,也可以指向4个方向中的任何一个(取决于眼睛的位置).我裁剪了场上的每个区块,这样我就可以检查每个区块是否包含一个球.我的问题是我无法正确找到球.

我的第一次尝试是跟随.我将每个球的RGB颜色相加并得到[R,G,B]数组.然后我为场中的每个块求和RGB颜色.如果block的数组与球的数组有类似的[R,G,B],我建议这个数据块有一个球.问题是很难找到"相似性"的良好价值.即使是不同的空块也会显着地变化.
其次,我尝试使用具有matchTemplate函数的openCV模块.此函数将图像与另一个源图像匹配,并且minMaxLoc函数返回值maxLoc.如果maxLoc接近1,则图像可能位于源图像中.我做了所有可能的球变化(总共20个),并将它们传递给整个场地.这个功能运作良好但不幸的是它有时会错过场上的一些球或为一个球分配两种不同类型的球(比如绿色和黄色).我尝试通过匹配球而不是整个场而不是每个块来改进过程(这种方法的优势在于它检查每个块并且应该在场中检测到正确数量的球,当与整个场匹配时只为每个块提供一个位置球的颜色.如果有两个相同颜色的球匹配模板失去关于第二球的信息).令人惊讶的是,它仍有假阴性和阳性.
可能有更容易的方法来解决这个问题(也许是一个我还不知道的图书馆)但是现在我找不到一个.欢迎任何建议.
球的颜色看起来非常明显.您最初描述的问题似乎与图像中存在的一些更精细,随机的细节有关 - 特别是在背景和球的不同阴影/姿势中.
在此基础上,我想说通过应用一组预处理步骤"折叠"图像中的颜色范围,可以显着简化任务.
有任意数量的原则性的方式来实现精确的色彩分割(这是更正式,你想实现什么,) -但采取了更加务实的看法,这里有几个quick'n'dirty黑客.
因此,例如,我们可以初步平滑图像以减少更高频率的组件......

然后,转换为标准化的RGB表示...

之前,最后用平均移位滤波步骤对其进行分色...

下面是Python中的代码,使用OpenCV绑定,按顺序完成所有这些操作:
import cv
# get orginal image
orig = cv.LoadImage('fling.png')
# show original
cv.ShowImage("orig", orig)
# blur a bit to remove higher frequency variation
cv.Smooth(orig,orig,cv.CV_GAUSSIAN,5,5)
# normalise RGB
norm = cv.CreateImage(cv.GetSize(orig), 8, 3)
red = cv.CreateImage(cv.GetSize(orig), 8, 1)
grn = cv.CreateImage(cv.GetSize(orig), 8, 1)
blu = cv.CreateImage(cv.GetSize(orig), 8, 1)
total = cv.CreateImage(cv.GetSize(orig), 8, 1)
cv.Split(orig,red,grn,blu,None)
cv.Add(red,grn,total)
cv.Add(blu,total,total)
cv.Div(red,total,red,255.0)
cv.Div(grn,total,grn,255.0)
cv.Div(blu,total,blu,255.0)
cv.Merge(red,grn,blu,None,norm)
cv.ShowImage("norm", norm)
# posterize simply with mean shift filtering
post = cv.CreateImage(cv.GetSize(orig), 8, 3)
cv.PyrMeanShiftFiltering(norm,post,20,30)
cv.ShowImage("post", post)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2270 次 |
| 最近记录: |