提高OpenCV中模板匹配的性能

2024-03-28 13:59:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在用python编写一个项目,它使用OpenCV来识别棋子在屏幕上棋盘上的位置。在

我已经成功地使用模板匹配功能来识别每件作品的位置。这是通过获取整个电路板的屏幕截图,并运行模板匹配函数12次(每种颜色6种类型)。现在我想提高程序的速度。我相信我可以在这里大幅提高性能:

据我所知,模板匹配算法基本上是一次一个像素地将模板图像滑动到基础图像上以寻找匹配。显然,我只希望在棋盘的64个方格中匹配,所以一次移动一个像素的图像效率非常低。有没有什么方法可以定制滑动间隔来匹配棋盘的一个方块的宽度,所以我只检查64个方块。对于如何提高速度还有其他建议吗?在

我考虑过为每种类型的棋子调用模板匹配函数64次的可能性,以匹配相同大小的每个单独正方形。我不确定这是否会更快,再加上获得64个屏幕截图也需要相当长的时间。在


Tags: 项目函数图像功能模板类型棋盘屏幕
1条回答
网友
1楼 · 发布于 2024-03-28 13:59:22

我也面临同样的挑战。在

更快的解决方案-相同大小减法的模板匹配

正如您所建议的,“为每种类型的工件调用模板匹配函数64次,以匹配相同大小的每个单独正方形”要快得多。 但你不需要得到64张截图。只有1个屏幕截图可以,然后你得到64个减法。在

full_image= cv2.imread('path_to_screenshot')
square_subtraction = full_image[yi:yf,xi:xf]

如果棋盘不总是在屏幕上的同一位置,您应该首先在全屏幕上搜索它,然后创建减法。在

最快解决方案-像素签名

也有可能每一块都有一个特定的x,y坐标的唯一像素,这将使它不同于其他11块。我称之为“像素签名”。在

如果你能找到这个签名,你可以使用像素匹配代替第一个解决方案中的模板匹配。在

这是我在一组模板上找到唯一像素的代码。在

^{pr2}$

如果您找到像素签名坐标(columnxrow),您可以使用它来获得棋盘64个正方形中每个方块的像素减法,并与模板像素签名进行比较:

full_image = cv2.imread('path_to_screenshot')
square_subtraction = full_image[yi:yf,xi:xf]
square_pixel = square_subtraction[column][row]

template = cv2.imread('path_to_template')
template_signature = template[column][row]

只需在棋盘的每一个方块上巡视,并与每一个模板进行比较,就像第一个解决方案一样,但不是模板匹配,你只需要比较像素。在

template_signature  == square_pixel 

相关问题 更多 >