python - Python Bot 的基本计算机视觉技术。

标签 python opencv computer-vision bots

在读完计算机视觉书籍的几个章节后,我决定应用这些方法为游戏创建一些原始机器人。我选择了Fling几乎没有动力,我需要做的就是找到球。球可能有 5 种不同的颜色,并且它们可以指向 4 个方向中的任何一个(取决于眼睛的位置)。我裁剪了 field 中的每个 block ,这样我就可以检查每个 block 是否包含球。我的问题是我无法正确找到球。

enter image description here

我的第一次尝试如下。我将每个球的 RGB 颜色相加并得到 [R, G, B] 数组。然后我将字段中每个 block 的 RGB 颜色相加。如果方 block 的数组与球的数组有相似的 [R, G, B],我建议这个方 block 有一个球。 问题是很难找到“相似性”的好的值(value)。即使是不同的空 block ,这些总和也会有很大差异。

其次,我尝试使用具有 matchTemplateopenCV 模块 功能。此函数将图像与另一个源图像匹配,并与 minMaxLoc 函数一起返回一个值 maxLoc。如果 maxLoc 接近 1,则图像可能在源图像中。我制作了所有可能的球变体(总共 20 个),并在整个 field 上传球。这个功能运作良好,但不幸的是它有时会错过 field 中的一些球或为一个球分配两种不同类型的球(比如绿色和黄色)。我试图通过匹配球而不是整个 field 而是每个 block 来改进过程(这种方法的优点是它检查每个 block 并且应该检测 field 中正确数量的球,当与整个 field 匹配时只为每个 block 提供一个位置球的颜色。如果有两个相同颜色的球 matchTemplate 会丢失关于第二个球的信息)。令人惊讶的是它仍然有假阴性\阳性。

可能有更简单的方法来解决这个问题(也许是我还不知道的库)但现在我找不到。欢迎任何建议。

最佳答案

这些球的颜色看起来非常不同。您最初描述的问题似乎与图像中出现的一些更精细、随机的细节有关 - 特别是在背景和球的不同阴影/姿势中。

在此基础上,我认为您可以通过应用一组预处理步骤“折叠”图像中的颜色范围来显着简化任务。

有许多更有原则的方法可以实现准确的颜色分割(更正式地说,这是你想要实现的)——但从更务实的角度来看,这里有一些快速的' n'肮脏的黑客。

因此,例如,我们可以先平滑图像以减少高频分量...

enter image description here

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

enter image description here

之前,最后用 mean shift filtering step 对它进行后处理...

enter image description here

这是 Python 中的代码,使用 OpenCV 绑定(bind),按顺序执行所有这些操作:

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)

关于python - Python Bot 的基本计算机视觉技术。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15685894/

相关文章:

python - 使用 python 和 boto3 删除 S3 对象时出现问题

python - 检测连续图像的非/最小变化像素的最快方法

image-processing - opencv形态膨胀过滤器作为最大过滤器

python - 如何从实验室图像中删除 L channel

python - 跟踪对对象实例的引用

python - 运行 Python unittest,以便在成功时不打印任何内容,仅在失败时打印 AssertionError()

opencv - 将pcl xyzrgb(a)点云转换成云的不同角度的图像

python - 在opencv-python中检测星形

image - 如何处理 .mp4 中两个图像的熵

opencv - 在实时 OpenCV 应用程序中去除红外摄像机图像中的太阳光反射