簡體   English   中英

OpenCV“特定於坐標”的匹配模板

[英]OpenCV “coordinate specific” match template

我有一張需要盡快檢測物體的圖像。 我也知道,我只需要檢測最靠近中心的物體即可。

AFAIK Opencv的MatchTemplate的工作原理如下(偽代碼):

for(x in width):
    for(y in height):
        value = calcSimilarity(inputImage, searchedImage, x, y)
        matched[x][y] = value

之后,我必須遍歷生成的圖像並找到最靠近中心的點,這完全是浪費。

所以我想知道我是否可以做類似的事情:

coordsGen = new CoordsGen() // a class that generates specific coords for me
while(!coordsGen.stop):
    x, y = coordsGen.next()
    value = calcSimilarity(inputImage, searchedImage, x, y)
    if(value > treshold)
        return x, y

基本上,我在這里需要的是calcSimilarity函數。 這將使我極大地優化過程。

通常,模板匹配的相似性評分方法有很多選擇。*

OpenCV具有3種可用的模板匹配模式:

  • 平方差和(歐幾里德距離)
  • 互相關
  • 皮爾遜相關系數

並且在OpenCV中,這三個版本中的每一個也具有規范/縮放版本:

  • 平方差的歸一化和
  • 歸一化互相關
  • 歸一化皮爾遜相關系數

您可以在TemplateMatchModes下看到OpenCV文檔中使用的實際公式,盡管它們與上述方法的通用公式一致。


您可以編寫與自己匹配的模板,而不必使用OpenCV。 但是,請注意,OpenCV已針對這些操作進行了優化,並且通常在模板匹配方面飛速發展。 OpenCV使用DFT執行其中一些計算,以減少計算量。 例如,請參閱:

您也可以使用OpenCV的minMaxLoc()查找最小值/最大值,而不用遍歷自己。 另外,您沒有指定如何訪問值,但並非所有查找方法都像其他方法一樣快。 請參閱如何掃描圖像以查看最快的Mat訪問操作。 劇透:原始指針。


優化的主要目的是盡早終止該功能。 但是,除非模板通常包含原始圖像的較小子集,否則我認為通常不會通過自己編碼來實現更快的速度。

如果圖像很大,減少搜索時間的更好方法是使用金字塔分辨率方法。 基本上,使模板和圖像搜索為圖像的1/2,因為圖像的1/2,圖像的1/2,圖像的1/2,依此類推。 然后,您可以在1/16或較小尺寸的小圖像上開始模板匹配,然后找到模板的一般位置。 然后,對下一個放大的圖像進行相同的操作,但是只搜索模板在前一個比例尺附近的一小部分。 然后,每次您將圖像尺寸增大到接近原始尺寸時,您只是在尋找幾個像素的細微差異以更准確地確定位置。 首先使用最小的縮放圖像找到一般位置,與原始圖像大小相比,只需花費一小部分時間即可找到一般位置,然后只需通過按比例放大就可以對其進行優化。


*請注意,OpenCV不包含其他模板匹配方法,您可能會在其他地方看到。 特別是,OpenCV具有平方差之和,但沒有絕對距離之和的方法。 相差也用作相似性度量,但在OpenCV中不存在。 無論哪種方式,互相關和平方差之和在圖像處理中都是非常常見的,除非您有特殊的圖像域,否則應該可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM