我对OpenCV和整个CV还是很陌生。我正在尝试创建一个状态检测器,该检测器可以让我在特定游戏中从屏幕上提取信息。该功能的预处理几乎已经完成,但是到目前为止,我一直使用颜色作为提取有用信息的主要方法。我希望捕获屏幕上是否存在此红色盾牌形状: ()
防护罩的形状总是这样,但是是半透明的,因此不能进行颜色测试。
经过大量的搜索和学习,我还没有尝试过解决方案,对于这个问题,我不确定从哪里开始。
我有一张图片processedImage
,并且想提取一个简单的布尔值来描述此形状是否存在。
任何帮助将不胜感激。
谢谢。
答案 0 :(得分:0)
我认为最好的解决方案是检测屏蔽图像的边缘。您可以通过以下一些图像处理技术来做到这一点:
也许是这样的:
edges = cv2.Canny(img,100,200) #img is your image
将为您工作,但是如果使用彩色图像不起作用,则可以尝试先使用以下方法转换为灰度:
grey = cv2.cvtColor(screen, cv2.COLOR_RGB2GRAY) #screen is your image
然后执行边缘检测算法。 显然,一旦找到形状,就必须对其进行定义(可能需要通过调整Canny参数或执行其他技术(例如HoughLines)),但是首先考虑一下诸如此类的东西
然后围绕这些假设制定算法!我认为您可能想定义一个函数并使其具有return True
或return False
,然后可以调用此函数以“获取图像是否存在的布尔值”
因为您没有在问一个明确的问题,我认为这个答案就足够了,但是如果需要详细说明,请随时发表评论!否则,如果这回答了您的问题,则可以单击帖子旁边的复选标记来接受它:)
答案 1 :(得分:0)
由于您知道屏蔽层始终是红色的,因此将图像转换为HSV并使用色相通道对图像进行阈值/滞后处理并获得红色区域
img = cv2.imread(img_path)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
m = cv2.split(hsv)
plt.imshow(m[1])
在此处绘制饱和度通道仅出于可视化目的。一旦获得此信息,也许可以使用某种template matching algorithm来获取位置。