テンプレートマッチング

 投稿者:しばっち  投稿日:2019年 9月26日(木)20時12分48秒
  open cvライブラリーを使用して、十進BASIC上でテンプレートマッチングを行います。

ソース画像ファイルから検索対象とするテンプレート画像ファイルを使って
その位置を検索します。



なお、実行時にはopencv_world300.dllが必要です(BASIC.EXEと同じフォルダに入れてください)

下記URLからダウンロードしてください。(imagetool.zip)

https://36.gigafile.nu/1125-n8d2d72a2da1c926a4d213cd6f41f8bd3

ダウンロード期限:2019年11月25日(月)
ダウンロードキー:設定していません


※警告
open cvは日本語パスに対応していません。



サンプル画像はソース画像、テンプレート画像、検索結果の画像(赤枠)となります。


OPTION BASE 0
FILE GETNAME F$,"ソース画像ファイル|*.jpg;*.png;*.bmp"
IF F$="" THEN STOP
CALL PICTURELOAD(F$,XSIZE,YSIZE)
SET WINDOW 0,XSIZE-1,YSIZE-1,0
DIM SRC(XSIZE,YSIZE)
ASK PIXEL ARRAY (0,0) SRC
FILE GETNAME T$,"テンプレート画像ファイル|*.jpg;*.png;*.bmp" !'検索画像
IF T$="" THEN STOP
CALL PICTURELOAD(T$,XSIZE_T,YSIZE_T)
PAUSE !'一旦停止(テンプレート画像表示)
CALL GINIT(XSIZE,YSIZE)
MAT PLOT CELLS,IN 0,0; XSIZE-1,YSIZE-1:SRC !'画像表示
CALL TEMPLATEMATCHING(F$,T$,3,XS,YS,XE,YE,LMIN,LMAX)
SET LINE WIDTH 3
CALL BOX(XS,YS,XE,YE,255,0,0)
PRINT XS;YS;XE;YE
PRINT LMIN;LMAX
END

EXTERNAL  SUB TEMPLATEMATCHING(FILENAME$,TEMPLATENAME$,SW,XS,YS,XE,YE,LMIN,LMAX)
LET XS$=REPEAT$(CHR$(0),8)
LET YS$=REPEAT$(CHR$(0),8)
LET XE$=REPEAT$(CHR$(0),8)
LET YE$=REPEAT$(CHR$(0),8)
LET LMIN$=REPEAT$(CHR$(0),8)
LET LMAX$=REPEAT$(CHR$(0),8)
LET NUM=TEMPLATEMATCHING_(FILENAME$,TEMPLATENAME$,SW,XS$,YS$,XE$,YE$,LMIN$,LMAX$)
IF NUM=-1 THEN
   PRINT "ソース画像ファイルが読めません"
   STOP
ELSEIF NUM=-2 THEN
   PRINT "テンプレート画像ファイルが読めません"
   STOP
END IF
LET LMIN=UNPACKDBL(LMIN$)
LET LMAX=UNPACKDBL(LMAX$)
LET XS=UNPACKDBL(XS$)
LET YS=UNPACKDBL(YS$)
LET XE=UNPACKDBL(XE$)
LET YE=UNPACKDBL(YE$)
!'
FUNCTION TEMPLATEMATCHING_(FILENAME$,TEMPLATENAME$,SW,XS$,YS$,XE$,YE$,LMIN$,LMAX$)
   ASSIGN ".\DLL\templatematching.dll","templatematching"
END FUNCTION
END SUB

EXTERNAL SUB GINIT(XSIZE,YSIZE)
SET BITMAP SIZE XSIZE,YSIZE
!'SET COLOR MIX(0) 0,0,0
SET COLOR MODE "NATIVE"
CLEAR
SET POINT STYLE 1
SET WINDOW 0,XSIZE-1,YSIZE-1,0
END SUB

EXTERNAL SUB PICTURELOAD(N$,XSIZE,YSIZE)
CLEAR
SET COLOR MODE "NATIVE"
SET POINT STYLE 1
IF N$="" THEN STOP
GLOAD N$
LET XSIZE=PIXELX(1)+1
LET YSIZE=PIXELY(1)+1
SET BITMAP SIZE XSIZE,YSIZE
END SUB

EXTERNAL SUB BOX(XS,YS,XE,YE,R,G,B)
SET COLOR COLORINDEX(R/255,G/255,B/255)
PLOT LINES:XS,YS;XE,YS
PLOT LINES:XE,YS;XE,YE
PLOT LINES:XE,YE;XS,YE
PLOT LINES:XS,YE;XS,YS
END SUB

----------------------------------------------------------------------------------
                            templatematching.cpp


#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgcodecs/imgcodecs.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

extern "C"  __declspec(dllexport) int templatematching(char *filename,char *templatename,int sw,double *xs,double *ys,double *xe,double *ye,double *min,double *max)
{
    Mat src,temp,result;
    Point minpt,maxpt;
    double maxval,minval;

    src=imread(filename,1);
    if (!src.data) return -1;
    temp=imread(templatename,1);
    if (!temp.data) return -2;
    switch(sw)
    {
    case 0:
        matchTemplate(src,temp,result,TM_SQDIFF); //差の2乗の合計、小さいほど良くマッチしている
        break;
    case 1:
        matchTemplate(src,temp,result,TM_SQDIFF_NORMED); // 同上の正規化
        break;
    case 2:
        matchTemplate(src,temp,result,TM_CCORR); //乗算したものの合計、大きいほど良くマッチしている
        break;
    case 3:
        matchTemplate(src,temp,result,TM_CCORR_NORMED); //同上の正規化
        break;
    case 4:
        matchTemplate(src,temp,result,TM_CCOEFF); //相関係数であり、正に大きいほど良くマッチしている
        break;
    case 5:
        matchTemplate(src,temp,result,TM_CCOEFF_NORMED); //同上の正規化
        break;
    default:
        matchTemplate(src,temp,result,TM_CCORR_NORMED);
    }
    minMaxLoc(result,&minval,&maxval,&minpt,&maxpt);
    *min=minval;
    *max=maxval;
    *xs=maxpt.x;
    *ys=maxpt.y;
    *xe=maxpt.x+temp.cols;
    *ye=maxpt.y+temp.rows;
    return 0;
}
 

戻る