|
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;
}
|
|