青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

OpenCV模板匹配算法詳解

http://www.cnblogs.com/zhaoweiwei/p/OpenVC_matchTemplate.html

1 理論介紹

模板匹配是在一幅圖像中尋找一個(gè)特定目標(biāo)的方法之一,這種方法的原理非常簡(jiǎn)單,遍歷圖像中的每一個(gè)可能的位置,比較各處與模板是否“相似”,當(dāng)相似度足夠高時(shí),就認(rèn)為找到了我們的目標(biāo)。OpenCV提供了6種模板匹配算法:

  1. 平方差匹配法CV_TM_SQDIFF
  2. 歸一化平方差匹配法CV_TM_SQDIFF_NORMED
  3. 相關(guān)匹配法CV_TM_CCORR
  4. 歸一化相關(guān)匹配法CV_TM_CCORR_NORMED
  5. 相關(guān)系數(shù)匹配法CV_TM_CCOEFF
  6. 歸一化相關(guān)系數(shù)匹配法CV_TM_CCOEFF_NORMED

用T表示模板圖像,I表示待匹配圖像,切模板圖像的寬為w高為h,用R表示匹配結(jié)果,匹配過程如下圖所示:

上述6中匹配方法可用以下公式進(jìn)行描述:

2 示例代碼

下面給出方法6的python代碼

 歸一化相關(guān)系數(shù)匹配法

代碼58行中的N就是公式(6)中的w*h,由于python代碼運(yùn)行速度比較慢,代碼的58、59行相當(dāng)于對(duì)公式(6)的分子分母都進(jìn)行了平方操作,并且分子分母都乘以了N方,以減小計(jì)算量,所以代碼61行的ret相當(dāng)于公式(6)中的R(x,y)的平方,

為了更快的進(jìn)行算法驗(yàn)證,用上述代碼進(jìn)行驗(yàn)證時(shí)請(qǐng)盡量選用較小的匹配圖像及模板圖像,下圖顯示了我的匹配結(jié)果(待匹配圖像295x184模板69x46用了十幾分鐘):

3 OpenCV源碼

較新版本的OpenCV庫(kù)中的模板匹配已經(jīng)進(jìn)行了較多的算法改進(jìn),直接看新版本中的算法需要了解很多相關(guān)理論知識(shí),所以我們結(jié)合OpenCV0.9.5的源碼進(jìn)行講解,該版本的源碼基本上是C風(fēng)格代碼更容易進(jìn)行理解(如果要對(duì)

OpenCV源碼進(jìn)行研究,建議用該版本進(jìn)行入門),仍以歸一化相關(guān)系數(shù)匹配法為例進(jìn)行分析。

復(fù)制代碼
  1 /*   2 * pImage: 待匹配圖像   3 * image: 待匹配圖像寬(width*depth并已4字節(jié)對(duì)齊)   4 * roiSize: 待匹配圖像尺寸   5 * pTemplate: 模板圖像   6 * templStep: 模板圖像寬   7 * templSize: 模板圖像尺寸   8 * pResult: 匹配結(jié)果   9 * resultStep: 匹配結(jié)果寬  10 * pBuffer: 中間結(jié)果數(shù)據(jù)緩存  11 */  12 IPCVAPI_IMPL( CvStatus, icvMatchTemplate_CoeffNormed_32f_C1R,  13               (const float *pImage, int imageStep, CvSize roiSize,  14                const float *pTemplate, int templStep, CvSize templSize,  15                float *pResult, int resultStep, void *pBuffer) )  16 {  17     float *imgBuf = 0;              // 待匹配圖像相關(guān)數(shù)據(jù)  18     float *templBuf = 0;            // 模板圖像數(shù)據(jù)  19     double *sumBuf = 0;             // 待匹配圖像遍歷塊單行和  20     double *sqsumBuf = 0;           // 待匹配圖像遍歷塊單行平方和  21     double *resNum = 0;             // 模板圖像和待匹配圖像遍歷塊內(nèi)積  22     double *resDenom = 0;           // 待匹配圖像遍歷塊累加和及待匹配圖像遍歷塊平方累加和  23     double templCoeff = 0;          // 模板圖像均分差倒數(shù)  24     double templSum = 0;            // 模板圖像累加和  25   26     int winLen = templSize.width * templSize.height;  27     double winCoeff = 1. / (winLen + DBL_EPSILON);          // + DBL_EPSILON 加一個(gè)小整數(shù)防止分母為零  28   29     CvSize resultSize = cvSize( roiSize.width - templSize.width + 1,  30                                 roiSize.height - templSize.height + 1 );  31     int x, y;  32   33     // 計(jì)算并為imgBuf、templBuf、sumBuf、sqsumBuf、resNum、resDenom分配存儲(chǔ)空間  34     CvStatus result = icvMatchTemplateEntry( pImage, imageStep, roiSize,  35                                              pTemplate, templStep, templSize,  36                                              pResult, resultStep, pBuffer,  37                                              cv32f, 1, 1,  38                                              (void **) &imgBuf, (void **) &templBuf,  39                                              (void **) &sumBuf, (void **) &sqsumBuf,  40                                              (void **) &resNum, (void **) &resDenom );  41   42     if( result != CV_OK )  43         return result;  44   45     imageStep /= sizeof_float;  46     templStep /= sizeof_float;  47     resultStep /= sizeof_float;  48   49     /* calc common statistics for template and image */  50     {  51         const float *rowPtr = (const float *) imgBuf;  52         double templSqsum = icvCrossCorr_32f_C1( templBuf, templBuf, winLen );          // 模板圖像平方累加和  53   54         templSum = icvSumPixels_32f_C1( templBuf, winLen );                             // 模板圖像累加和  55         templCoeff = (double) templSqsum - ((double) templSum) * templSum * winCoeff;   // 模板圖像均方差的平方  56         templCoeff = icvInvSqrt64d( fabs( templCoeff ) + FLT_EPSILON );                 // 模板圖像均方差倒數(shù)  57   58         for( y = 0; y < roiSize.height; y++, rowPtr += templSize.width )  59         {  60             sumBuf[y] = icvSumPixels_32f_C1( rowPtr, templSize.width );                 // 待匹配圖像按模板圖像寬度求每行之和(遍歷位置第一列)  61             sqsumBuf[y] = icvCrossCorr_32f_C1( rowPtr, rowPtr, templSize.width );       // 待匹配圖像按模板圖像寬度求每行平方之和(遍歷位置第一列)  62         }  63     }  64   65     /* main loop - through x coordinate of the result */  66     for( x = 0; x < resultSize.width; x++ )  67     {  68         double sum = 0;  69         double sqsum = 0;  70         float *imgPtr = imgBuf + x;                                                      // 待匹配圖像起始位置  71   72         /* update sums and image band buffer */                                          // 如果不是第1列需重新更新sumBuf,更新后sumBuf為遍歷位置第x列每行之和(行寬為模板圖像寬)  73         if( x > 0 )  74         {  75             const float *src = pImage + x + templSize.width - 1;  76             float *dst = imgPtr - 1;  77             float out_val = dst[0];  78   79             dst += templSize.width;  80   81             for( y = 0; y < roiSize.height; y++, src += imageStep, dst += templSize.width )  82             {  83                 float in_val = src[0];  84   85                 sumBuf[y] += in_val - out_val;  86                 sqsumBuf[y] += (in_val - out_val) * (in_val + out_val);  87                 out_val = dst[0];  88                 dst[0] = (float) in_val;  89             }  90         }  91   92         for( y = 0; y < templSize.height; y++ )                                          // 求遍歷位置第x列,第1行處遍歷塊累加和sum及平方累加和sqsum  93         {  94             sum += sumBuf[y];  95             sqsum += sqsumBuf[y];  96         }  97   98         for( y = 0; y < resultSize.height; y++, imgPtr += templSize.width )  99         { 100             double res = icvCrossCorr_32f_C1( imgPtr, templBuf, winLen );               // 求模板圖像和待匹配圖像y行x列處遍歷塊的內(nèi)積 101  102             if( y > 0 )                                                                 // 如果不是第1行需更新遍歷塊累加和sum及平方累加和sqsum 103             { 104                 sum -= sumBuf[y - 1]; 105                 sum += sumBuf[y + templSize.height - 1]; 106                 sqsum -= sqsumBuf[y - 1]; 107                 sqsum += sqsumBuf[y + templSize.height - 1]; 108             } 109             resNum[y] = res; 110             resDenom[y] = sum; 111             resDenom[y + resultSize.height] = sqsum; 112         } 113  114         for( y = 0; y < resultSize.height; y++ ) 115         { 116             double sum = ((double) resDenom[y]); 117             double wsum = winCoeff * sum; 118             double res = ((double) resNum[y]) - wsum * templSum; 119             double nrm_s = ((double) resDenom[y + resultSize.height]) - wsum * sum; 120  121             res *= templCoeff * icvInvSqrt64d( fabs( nrm_s ) + FLT_EPSILON ); 122             pResult[x + y * resultStep] = (float) res; 123         } 124     } 125  126     return CV_OK; 127 }
復(fù)制代碼

以上代碼是歸一化相關(guān)系數(shù)法核心函數(shù)icvMatchTemplate_CoeffNormed_32f_C1R的源碼,我已經(jīng)在源碼中進(jìn)行了詳細(xì)的注釋,讀者需自己再進(jìn)行理解,需要進(jìn)一步說(shuō)明的是:

代碼118行res就是計(jì)算公式(6)的分子部分,代碼56行templCoeff就是計(jì)算公式(6)分母的左半部分,代碼121行icvInvSqrt64d函數(shù)就是在計(jì)算公式(6)分母的右半部分,該行res的最終結(jié)果正是公式(6)中的R(x,y)。

4 結(jié)束語(yǔ)

OpenCV0.9.5源碼下載:http://download.csdn.net/detail/weiwei22844/9547820

參考文章:http://blog.sina.com.cn/s/blog_4ae371970101aejw.html

              http://blog.csdn.net/liyuanbhu/article/details/49837661

posted on 2017-08-30 17:36 zmj 閱讀(1479) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲区一区二| 99在线|亚洲一区二区| 亚洲国产日韩欧美综合久久| 狠狠色丁香婷婷综合影院| 国产精品免费一区二区三区在线观看| 欧美激情精品久久久| 欧美成人a视频| 欧美日韩国产综合新一区| 欧美视频网址| 国产真实乱子伦精品视频| 悠悠资源网亚洲青| 亚洲精品久久久久久一区二区| 亚洲大胆人体视频| 日韩一级网站| 欧美一级在线播放| 久久综合伊人77777尤物| 欧美jizz19性欧美| 亚洲国产高清一区| 欧美高清不卡| 亚洲一区欧美一区| 欧美成人第一页| 欧美另类videos死尸| 久久久久www| 久久午夜激情| 一个色综合av| 91久久久久久国产精品| 欧美+亚洲+精品+三区| 一区二区av在线| 欧美sm极限捆绑bd| 在线观看中文字幕不卡| 亚洲校园激情| 欧美激情导航| 一区二区精品在线| 亚洲小视频在线观看| 欧美性大战久久久久| 猛干欧美女孩| 国产农村妇女毛片精品久久麻豆 | 欧美在线在线| 亚洲国产精品成人| 欧美国产国产综合| 玖玖玖国产精品| 亚洲欧美www| 日韩视频永久免费| 性色一区二区| 亚洲欧美日韩一区| 中文日韩在线视频| 中文国产一区| 久久久久九九九九| 国产欧美 在线欧美| 欧美色网在线| 亚洲欧美精品| 亚洲日本成人女熟在线观看| 欧美激情精品久久久久| 久久嫩草精品久久久精品一| 久久经典综合| 欧美一区二粉嫩精品国产一线天| 久久欧美肥婆一二区| 国产伦理精品不卡| 亚洲日本成人网| 久久这里只有| 99国产一区| 精品1区2区3区4区| 亚洲国产成人在线| 久久久一本精品99久久精品66| 99re在线精品| 一本综合久久| 国产香蕉97碰碰久久人人| 亚洲国产精品小视频| 欧美久久一区| 久久综合国产精品台湾中文娱乐网| 狠狠色伊人亚洲综合成人| 久久免费国产精品| 欧美xxxx在线观看| 99视频日韩| 欧美不卡在线| 亚洲第一视频| 亚洲国产美国国产综合一区二区 | 亚洲一区二区三区成人在线视频精品 | 亚洲精品小视频| 欧美国产日韩免费| 欧美激情成人在线| 亚洲网站在线看| 久久精品日韩| 久久美女性网| 亚洲人成毛片在线播放女女| 欧美91福利在线观看| 欧美成人中文| 午夜一级在线看亚洲| 久久精品91久久久久久再现| 亚洲国产欧美日韩另类综合| 亚洲精品日韩一| 国产伦精品一区二区三区视频孕妇 | 欧美日韩国产小视频在线观看| 一区二区三区高清| 性色av一区二区三区| 亚洲精品一区二区在线| 亚洲私人影院| 91久久精品日日躁夜夜躁国产| 一本色道久久加勒比88综合| 韩日精品视频| 一区二区三区鲁丝不卡| 韩国精品一区二区三区| 亚洲精品中文字幕女同| 好吊成人免视频| 一本一本久久a久久精品牛牛影视| 国产麻豆午夜三级精品| 欧美激情久久久| 国产麻豆一精品一av一免费| 91久久久久久国产精品| 狠狠色丁香久久婷婷综合丁香| 亚洲精品一区中文| 韩国一区电影| 欧美亚洲一级| 欧美一激情一区二区三区| 欧美精品国产一区二区| 狼人天天伊人久久| 国产精品网曝门| 99视频精品全国免费| 亚洲人成毛片在线播放| 久久久水蜜桃av免费网站| 欧美一级视频免费在线观看| 欧美激情二区三区| 久久免费视频一区| 国产偷国产偷亚洲高清97cao| 亚洲片区在线| 亚洲精品久久久蜜桃| 久久一区中文字幕| 欧美亚洲免费高清在线观看| 欧美三级韩国三级日本三斤| 亚洲成人在线视频网站| 在线国产精品播放| 免费欧美网站| 亚洲人成人77777线观看| 亚洲精品影院| 欧美日韩蜜桃| 亚洲网站在线观看| 午夜免费日韩视频| 欧美日韩三级视频| 亚洲毛片在线观看| 亚洲视频一区二区在线观看| 国产欧美日韩亚洲精品| 亚洲午夜av电影| 一区二区三区色| 欧美三级日本三级少妇99| 日韩视频免费观看| 亚洲一区二区三区午夜| 国产精品黄视频| 亚洲香蕉成视频在线观看| 亚洲男人av电影| 国产精品影视天天线| 午夜精品剧场| 欧美91视频| 99视频一区| 国产精品丝袜久久久久久app| 午夜久久99| 久久久久免费观看| 亚洲国产99| 欧美日韩一区视频| 欧美一区2区三区4区公司二百| 蜜桃av一区二区在线观看| 亚洲理论在线观看| 欧美亚洲第一区| 欧美呦呦网站| 亚洲精品国产系列| 久久成人免费| 亚洲精品久久久久久下一站| 欧美乱人伦中文字幕在线| 免费视频一区| 亚洲一区二区三区免费视频| 国产揄拍国内精品对白| 欧美精品一区二区蜜臀亚洲| 亚洲欧美日韩天堂一区二区| 亚洲成色777777在线观看影院| 亚洲免费在线精品一区| 亚洲第一黄色网| 国产伦精品一区二区三区视频孕妇| 老司机凹凸av亚洲导航| 一本一本久久a久久精品综合妖精| 久久综合狠狠综合久久综青草| 亚洲视频免费| 亚洲欧洲精品一区二区精品久久久| 久久久久国色av免费观看性色| 国产精品国产成人国产三级| 久久久久一区二区三区四区| 一本色道久久99精品综合| 欧美77777| 久久精品在线视频| 亚洲欧美日韩国产综合| 亚洲高清在线视频| 欧美在线视频一区| 亚洲午夜av| 亚洲破处大片| 亚洲第一色中文字幕| 久久久久久一区| 欧美一区二区三区免费看| 一本色道久久综合精品竹菊| 亚洲电影免费在线| 国产亚洲一区二区精品| 国产精品免费网站在线观看| 欧美精品综合|