婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > OpenCV-Python實現(xiàn)多模板匹配

OpenCV-Python實現(xiàn)多模板匹配

熱門標(biāo)簽:地圖標(biāo)注自己和別人標(biāo)注區(qū)別 ai電銷機(jī)器人的優(yōu)勢 商家地圖標(biāo)注海報 打電話機(jī)器人營銷 海外網(wǎng)吧地圖標(biāo)注注冊 騰訊地圖標(biāo)注沒法顯示 孝感營銷電話機(jī)器人效果怎么樣 聊城語音外呼系統(tǒng) 南陽打電話機(jī)器人

模板匹配的作用在圖像識別領(lǐng)域作用可大了。那什么是模板匹配?

模板匹配,就是在一幅圖像中尋找另一幅模板圖像最匹配(也就是最相似)的部分的技術(shù)。

多模板匹配

在上一篇的實戰(zhàn)中,我們通過人物眼睛的子圖,找出了其在圖像中出現(xiàn)位置。但是,有些情況下,并不僅僅只有一次,比如我們講解傅里葉變換時,曾介紹一張草原的獅子圖。如果匹配某個草,可能單個圖像內(nèi)會有很多,這個時候就要找出多個匹配結(jié)果。

而函數(shù)cv2.minMaxLoc()僅僅能找出最值,無法給出所有匹配區(qū)域的位置信息。所以,要想匹配多個結(jié)果,就需要進(jìn)行如下4個步驟:

獲取匹配位置的集合

首先,Numpy庫中的函數(shù)where()能夠獲取模板匹配位置的集合。對于不同的輸入,其返回值是不同的。

  • 當(dāng)輸入是一維數(shù)組時,返回值是一維索引,只是一組索引數(shù)組。
  • 當(dāng)輸入是二維數(shù)組時,返回的是匹配值的位置索引,因此會有兩組索引數(shù)組表示返回值的位置。

比如,我們的灰度圖像一般都是二維數(shù)組。下面,我們來查找一個二維數(shù)組中,值大于8的元素索引:

import numpy as np

img = np.array([[2, 4, 6, 8, 10], [9, 60, 10, 30, 4], [55, 21, 11, 7, 5]])
result = np.where(img > 5)
print(result)

運(yùn)行之后,控制臺會輸出如下內(nèi)容:


如果你對Numpy不是很了解的化。下面博主在將數(shù)據(jù)轉(zhuǎn)換以下,基本上都能看懂了。轉(zhuǎn)換之后,格式如下:


第一行為大于5的值的X坐標(biāo),第二行為大于5的值的Y坐標(biāo)。那么上面大于5的數(shù)組索引為:[0,2],[0,3],[0,4],[1,0],[1,1],[1,2],[1,3],[2,0],[2,1],[2,2],[2,3]。你可以回溯對比看看是不是一致的。

通過np.where()函數(shù)可以找出在cv2.matchTemplate()函數(shù)的返回值中,哪些位置上的值是大于閾值threshold的。具體操作代碼如下:

loc=np.where(res>threshold)

循環(huán)

因為我們找到的原圖對應(yīng)的模板圖像不止一個,要處理多個值,肯定會用到循環(huán)。因此,在獲取匹配值的索引后,可以采用如下語句遍歷所有匹配的位置,對這些位置做標(biāo)記:

for i in 匹配位置集合:
	標(biāo)記匹配位置

在循環(huán)中使用zip()

函數(shù)zip()用可迭代的對象作為參數(shù),將對象中對應(yīng)的元素打包成一個個元組,然后返回由這些元組組成的列表。

例如,我們獲取的索引為x,y,z。下面我們使用zip()將它們打包成元組。代碼如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = np.array([[2, 4, 6, 8, 10], [9, 60, 10, 30, 4], [55, 21, 11, 7, 5]])
result = np.where(img > 5)
for i in zip(*result):
    print(i)

這里我們還是使用上面的值,輸出結(jié)果如下:


這里自動將我們剛才滿足條件的索引打包成了元素格式。是不是比剛才的控制臺輸出結(jié)果更加的直觀呢?

替換坐標(biāo)

我們上面得到的結(jié)果是符合條件的索引:(行號,列號),但我們需要繪制匹配位置的矩形,需要的是(列號,行號)。

所以,在使用cv2.rectangle()繪制矩形前,要先將函數(shù)numpy.where()得到的位置索引行列互換,行列互換可以通過如下代碼實現(xiàn):

import numpy as np

img = np.array([[2, 4, 6, 8, 10], [9, 60, 10, 30, 4], [55, 21, 11, 7, 5]])
result = np.where(img > 5)
for i in zip(*result[::-1]):
    print(i)

運(yùn)行之后,輸出結(jié)果如下:

實戰(zhàn)多模板匹配

既然我們已經(jīng)了解了標(biāo)記繪制多個模板位置的4個步驟。下面,我們直接將上面的代碼整理以下,即可完成多模板的匹配。具體代碼如下所示:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread("34.jpg", 0)
template = cv2.imread("4_1.jpg", 0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.9
loc = np.where(res >= 0.9)
for i in zip(*loc[::-1]):
    cv2.rectangle(img, i, (i[0] + w, i[1] + h), 255, 1)
plt.imshow(img, cmap="gray")
plt.axis("off")
plt.show()

這里的代碼與上面4個步驟一摸一樣,具體就不做過多的講解了。運(yùn)行之后,多個模板也就匹配完成。


附錄:

模板圖


原圖

實例:基于opencv的多目標(biāo)模板匹配

利用opencv進(jìn)行多目標(biāo)模板匹配,只要是利用其matchTemplate函數(shù),但在多目標(biāo)(這里是討論目標(biāo)圖片中不同大小模板的匹配),以下貼出代碼和圖片,供大家參考:

#include opencv2\core\core.hpp>
#include opencv2\highgui\highgui.hpp>
#include opencv2\imgproc\imgproc.hpp>
#include iostream>
#include math.h>

using namespace std;
using namespace cv;

Point getNextMinLoc(Mat result, Point minLoc, int maxValue, int templatW, int templatH);

int main(void)
{
 Mat src = imread("1_2.png");
 Mat srcCopy = src.clone();
 
 Mat temp = imread("1_4.png");
 Mat result;

 if (src.empty() || temp.empty())
 {
  cout  "打開圖片失敗"  endl;
  return 0;
 }

 vectorMat> templat;
 vectorfloat> minV;
 vectorPoint> minL;

 int srcW, srcH, templatW, templatH, resultH, resultW;
 srcW = src.cols;
 srcH = src.rows;
 templat.push_back(temp);
 double minValue, maxValue;
 Point minLoc, maxLoc;

 for (int i=0;i10;i++)
 {
  cout  i  ": ";
  templatW = templat[i].cols;
  templatH = templat[i].rows;

  if (srcW  templatW || srcH  templatH)
  {
   cout  "模板不能比原圖大"  endl;
   return 0;
  }

  resultW = srcW - templatW + 1;
  resultH = srcH - templatH + 1;

  result.create(Size(resultW, resultH), CV_32FC1);
  matchTemplate(src, templat[i], result, CV_TM_SQDIFF_NORMED);

  minMaxLoc(result, minValue, maxValue, minLoc, maxLoc);

  cout  "min1: "  minValue  endl;
  if (minValue=0.070055)
  {
   rectangle(srcCopy, minLoc, Point(minLoc.x + templatW, minLoc.y + templatH), Scalar(0, 0, 255), 2, 8, 0);

   Point new_minLoc;
   new_minLoc = getNextMinLoc(result, minLoc, maxValue, templatW, templatH);
   
   float *data = result.ptrfloat>(new_minLoc.y);

   cout  "min2: "  data[new_minLoc.x]  " ";
   if (data[new_minLoc.x]=0.5)
   {
    cout  "進(jìn)這個函數(shù)了:"  i  ":"  new_minLoc.x;
    cout  " "  new_minLoc.y;
    rectangle(srcCopy, new_minLoc, Point(new_minLoc.x + templatW, new_minLoc.y + templatH),
     Scalar(0, 255, 0), 2, 8, 0);
    new_minLoc = getNextMinLoc(result, new_minLoc, maxValue, templatW, templatH);
   }

   float *data1 = result.ptrfloat>(new_minLoc.y);
   cout  "min3: "  data1[new_minLoc.x]  " "  endl;
   if (data1[new_minLoc.x] = 0.4)
   {
    
    rectangle(srcCopy, new_minLoc, Point(new_minLoc.x + templatW, new_minLoc.y + templatH),
     Scalar(255, 0, 0), 2, 8, 0);
   }
  }
  cout  "#"  endl;
  Mat temp_templat;
  resize(templat[i], temp_templat, Size(templat[i].cols / 1.1, templat[i].rows / 1.1));
  templat.push_back(temp_templat);
 }

 imshow("結(jié)果", srcCopy);
 waitKey(0);
 return 0;
}

Point getNextMinLoc(Mat result, Point minLoc, int maxValue, int templatW, int templatH)
{
 //imshow("result", result);
 //cout  "maxvalue: "  maxValue  endl;
 int startX = minLoc.x - templatW / 3;
 int startY = minLoc.y - templatH / 3;
 int endX = minLoc.x + templatW / 3;
 int endY = minLoc.y + templatH / 3;
 if (startX  0 || startY  0)
 {
  startX = 0;
  startY = 0;
 }
 if (endX > result.cols - 1 || endY > result.rows - 1)
 {
  endX = result.cols - 1;
  endY = result.rows - 1;
 }
 int y, x;
 for (y = startY; y  endY; y++)
 {
  for (x = startX; x  endX; x++)
  {
   float *data = result.ptrfloat>(y);
   
   data[x] = maxValue;
  }
 }
 double new_minValue, new_maxValue;
 Point new_minLoc, new_maxLoc;
 minMaxLoc(result, new_minValue, new_maxValue, new_minLoc, new_maxLoc);
 //imshow("result_end", result);
 return new_minLoc;
}

以下是結(jié)果圖:

到此這篇關(guān)于OpenCV-Python實現(xiàn)多模板匹配的文章就介紹到這了,更多相關(guān)OpenCV 多模板匹配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • opencv-python圖像配準(zhǔn)(匹配和疊加)的實現(xiàn)
  • Opencv Python實現(xiàn)兩幅圖像匹配
  • Python使用Opencv實現(xiàn)圖像特征檢測與匹配的方法
  • Python和OpenCV進(jìn)行多尺度模板匹配實現(xiàn)
  • OpenCV-Python模板匹配人眼的實例
  • python基于OpenCV模板匹配識別圖片中的數(shù)字
  • Python開發(fā)之基于模板匹配的信用卡數(shù)字識別功能
  • Python+Opencv實現(xiàn)圖像匹配功能(模板匹配)

標(biāo)簽:揚(yáng)州 撫州 迪慶 聊城 牡丹江 六盤水 楊凌 南寧

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《OpenCV-Python實現(xiàn)多模板匹配》,本文關(guān)鍵詞  OpenCV-Python,實現(xiàn),多,模板,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《OpenCV-Python實現(xiàn)多模板匹配》相關(guān)的同類信息!
  • 本頁收集關(guān)于OpenCV-Python實現(xiàn)多模板匹配的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    老汉av免费一区二区三区| 国产视频一区二区在线观看| 国产91精品一区二区麻豆亚洲| 奇米影视7777精品一区二区| 偷窥国产亚洲免费视频| 午夜精品一区二区三区免费视频| 亚洲国产精品自拍| 日本午夜一区二区| 麻豆一区二区99久久久久| 精品伊人久久久久7777人| 久久99精品国产.久久久久久| 日本女优在线视频一区二区| 免费在线观看视频一区| 韩国女主播成人在线| 国产成人a级片| 91丨porny丨国产入口| 欧美三级电影在线看| 日韩视频免费观看高清在线视频| 久久女同精品一区二区| 国产精品国产精品国产专区不片| 亚洲麻豆国产自偷在线| 日本中文字幕一区| 粉嫩绯色av一区二区在线观看| 成人黄色在线网站| 欧美日韩日日夜夜| 久久久久99精品国产片| 一区二区三区在线免费播放| 奇米在线7777在线精品 | 欧美精品色综合| 日韩精品在线网站| 亚洲视频在线观看一区| 午夜视黄欧洲亚洲| 成人三级伦理片| 欧美午夜精品久久久| 久久久高清一区二区三区| 日韩理论片在线| 蜜臀av一区二区在线免费观看| 国产成人丝袜美腿| 91精品久久久久久蜜臀| 国产精品初高中害羞小美女文| 午夜精品免费在线| 成人av资源网站| 日韩一级二级三级| 亚洲男人都懂的| 国产91精品在线观看| 日韩欧美专区在线| 一区二区三区精品视频在线| 国产米奇在线777精品观看| 欧美亚洲高清一区| 国产精品理伦片| 久久99精品国产麻豆婷婷| 欧美日韩在线一区二区| 亚洲欧美日韩国产手机在线| 精品无人区卡一卡二卡三乱码免费卡| 色综合天天综合网天天狠天天 | 97se亚洲国产综合自在线不卡| 7777精品伊人久久久大香线蕉超级流畅 | 国产成人精品三级| 日韩一区二区在线看| 亚洲成av人片观看| 91看片淫黄大片一级在线观看| 久久久久久久久一| 老司机一区二区| 欧美一级专区免费大片| 亚洲超碰97人人做人人爱| 在线亚洲人成电影网站色www| 欧美激情在线免费观看| 国产精品一区二区黑丝| 久久综合九色欧美综合狠狠| 综合久久久久久久| 色综合中文综合网| 色综合色狠狠天天综合色| 国产欧美精品一区二区色综合朱莉| 日韩av不卡一区二区| 日韩一区二区三区四区五区六区| 亚洲国产精品久久不卡毛片| 欧美亚洲国产bt| 性久久久久久久久久久久| 欧美日韩黄色一区二区| 午夜电影网一区| 日韩一卡二卡三卡四卡| 国模娜娜一区二区三区| 久久精品在线观看| 成人国产电影网| 亚洲欧洲av另类| 日本精品免费观看高清观看| 亚洲一区在线视频观看| 这里只有精品免费| 国产美女精品在线| 成人欧美一区二区三区在线播放| 色一区在线观看| 亚洲成人www| 日韩女同互慰一区二区| 国产精品99久久久久久有的能看| 国产精品久久毛片| 欧美性猛交xxxxxx富婆| 精品亚洲aⅴ乱码一区二区三区| 欧美精品一区二区在线播放| 成人免费福利片| 日日夜夜免费精品| 久久久久久久综合色一本| 在线免费观看日韩欧美| 另类小说欧美激情| 亚洲欧美日韩中文字幕一区二区三区 | 亚洲男人天堂av| 91精品国产91久久久久久最新毛片 | 久久综合狠狠综合久久综合88| 国产福利视频一区二区三区| 一区二区三区中文在线| 日韩欧美国产麻豆| av欧美精品.com| 日韩精品电影在线| 国产精品久久毛片| 日韩午夜小视频| 91福利视频久久久久| 国产精品自拍av| 偷拍与自拍一区| 亚洲丝袜制服诱惑| 欧美激情在线一区二区| 91精品欧美综合在线观看最新| 99天天综合性| 国产呦精品一区二区三区网站| 亚洲午夜在线电影| 国产精品毛片久久久久久| 日韩一区二区精品葵司在线| 欧洲视频一区二区| 99久久婷婷国产综合精品 | 一区二区三区在线不卡| 久久精品一二三| 欧美一级欧美三级在线观看| 色久优优欧美色久优优| 成人教育av在线| 激情综合网av| 美女视频一区二区三区| 日韩精品福利网| 午夜久久久影院| 午夜伊人狠狠久久| 亚洲最大色网站| 亚洲欧美一区二区三区国产精品 | 91精品国产高清一区二区三区| 色婷婷精品久久二区二区蜜臂av | 日韩电影在线免费| 亚洲国产成人va在线观看天堂| 18成人在线观看| 日韩一区日韩二区| 亚洲视频一区二区免费在线观看| 国产嫩草影院久久久久| 中文字幕国产一区| 亚洲欧洲99久久| 亚洲免费观看高清| 亚洲制服欧美中文字幕中文字幕| 一区二区三区免费| 午夜精品久久久| 免费高清视频精品| 久久国产尿小便嘘嘘| 国产乱码字幕精品高清av| 国产一区在线观看视频| 风间由美一区二区av101| 99久久国产综合精品麻豆| 99久久精品费精品国产一区二区| 日本乱人伦aⅴ精品| 欧美在线观看视频一区二区三区| 欧美日韩激情一区二区三区| 日韩欧美在线1卡| 久久久国产一区二区三区四区小说| 国产三级精品在线| 亚洲精品中文字幕乱码三区| 亚洲不卡一区二区三区| 久久黄色级2电影| 成人国产精品免费观看视频| 欧美三片在线视频观看| 亚洲精品一区二区三区福利| 欧美激情综合五月色丁香 | 紧缚捆绑精品一区二区| 成人一区二区三区中文字幕| 在线精品观看国产| 欧美一区二区观看视频| 欧美激情艳妇裸体舞| 亚洲国产一区二区三区| 国产精品白丝av| 欧美色大人视频| 欧美激情一区二区三区不卡 | 91麻豆123| 日韩免费视频一区二区| 亚洲色图视频网站| 久久99精品久久久久婷婷| 色婷婷综合五月| 精品噜噜噜噜久久久久久久久试看| 国产精品看片你懂得| 免费av成人在线| 色先锋久久av资源部| 久久精品无码一区二区三区| 亚洲午夜私人影院| av毛片久久久久**hd| 精品成人免费观看| 视频一区视频二区在线观看| 成人ar影院免费观看视频| 精品国产乱码久久久久久免费 | 91在线小视频| 国产亚洲欧美一区在线观看|