OpenCV模板匹配和透明度 [英] OpenCV template matching and transparency

查看:1425
本文介绍了OpenCV模板匹配和透明度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

OpenCV在模板匹配期间处理图像透明度的方式是什么?



问题是模板图像需要有透明部分,因为在原始图像中



我尝试了所有的方法,没有一个产生正面结果(例如原始图像中的模板位置未被正确检测)。



编辑:我知道这是必要的例子。



。 p>

PS。这是什么游戏?


What's the way OpenCV handles transparency in image during template matching?

The problem is that the template image needs to have transparent parts, because in the original image there could be anything at those places.

I tried all of the methods, and none of them yielded positive results (e.g. position of template in original image wasn't detected correctly).

Edit: OK, I see that is necessary to provide examples.

Original image

Template image

As you can see, it's nearly impossible to match such template to image like that. The "background" around the object could have any color (like this, or white, brown...)

Sobel on grayscaled image & template + cvConvertScaleAbs

Additional original image

Edit 2: misha's solution works even with a bit of obstacles around (the "transparency" works). Example:

Template match sucessful

Edit 3 - multiple occurences:

I've made a quick and dirty solution of finding multiple occurences of a template, however when template is not found I get a "lot" of false positives. Mainly because of my implementation:

  • iterate over image data
  • if (imageData[y, x, 0] >= maxValue * 0.95f) then it counts [x,y] as a match (maxValue is from cvMinMaxLoc)

It works for images, when there's at least one positive match, however results in awful situation for images, on which there isn't such template.

解决方案

It doesn't seem like OpenCV handles alpha the way you want it to.

You have two options:

  1. Write your own cross-correlation method that will use the alpha channel
  2. Transform your images so your alpha channel becomes irrelevant

Since the first option is straightforward, I will explore the second option here. I'm going to re-use the sample code I provided to a similar question earlier. If you apply cross-correlation directly to your images, the background interferes with the template matching (in particular, light background parts). If you play around with color channels, you will find that matching in the blue channel gives the correct result. This depends on the image content and isn't a consistent way to solve the problem.

Another option is to perform edge detection (e.g. Sobel) on the image and template, and perform cross-correlation then. Here are the edge detected images (I used the Sobel edge detector on the Luma channel in GIMP, and then some intensity stretching).

As you can see, the alpha channel here has become irrelevant, as most of the terrain has become zero intensity and will not contribute to the cross-correlation calculation. So now cross-correlation can be directly applied, giving the desired result:

misha@misha-desktop:~/Desktop/stackoverflow$ python cross-correlation.py map-blue.png building-maskz-blue.png 
(163, 244)

Finally, here's another related question.

PS. What game is this?

这篇关于OpenCV模板匹配和透明度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆