HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
1227
InoueSoftware画像比較モジュールを作った3解決


InoueSoftware

リンク

2016/12/27(Tue) 17:06:12|NO.77735

画像比較モジュールとサンプルを作ってみた。
精度を変更して処理速度も変えることが出来ます。
色の誤差範囲を指定することも出来ます。

#module
#define global COMPIMAGE_DEFAULT_ACCURACY 1//精度の初期値 #define global COMPIMAGE_MATCH 1//一致 #define global COMPIMAGE_MISMATCH 0//不一致 #define global COMPIMAGE_PARAMETERERROR -1//引数がおかしいです #define global COMPIMAGE_UNKNOWN -2//不明 //画像を比較する //CompImage p1, p2, p3, p4, p5, p6 // p1 CompSrcWndID 比較元ウィンドウID // p2 CompDestWndID 比較先ウィンドウID // p3 ResultWndID 結果画像描画先ウィンドウID(-1で使用しない) // p4 Interruption 不一致と判断した場合は処理を中断するか否か(TRUE=1/FALSE=0) // p5 RangeofError 誤差の範囲(0~100 推奨) // p6 Accuracy 正確さ(1~20 推奨) #deffunc CompImage int CompSrcWndID, int CompDestWndID, int ResultWndID, int Interruption, int _RangeofError, int _Accuracy randomize Accuracy = _Accuracy RangeofError = limit(_RangeofError,0,127) if (Accuracy==0):_Accuracy = COMPIMAGE_DEFAULT_ACCURACY _ID = ginfo_sel _Color = ginfo_r,ginfo_g,ginfo_b dim Ifs,3 dim Point,2 dim ColorSrcWnd,3 dim ColorDestWnd,3 ret = COMPIMAGE_UNKNOWN //画像のサイズを比べる gsel CompSrcWndID Point = ginfo_winx,ginfo_winy gsel CompDestWndID if ((Point(0) != ginfo_winx) || (Point(1) != ginfo_winy)):return COMPIMAGE_MISMATCH//不一致 //ドットを比べる if (ResultWndID != -1):gsel ResultWndID:pos 0,0:gcopy CompSrcWndID,0,0,Point(0),Point(1) gsel CompSrcWndID LoopMax = (ginfo_winx/Accuracy)*(ginfo_winy/Accuracy) dim Point,2 repeat LoopMax,0 //ドットの色取得 gsel CompSrcWndID pget Point(0),Point(1) ColorSrcWnd = ginfo_r,ginfo_g,ginfo_b //color 255,0,0:pset Point(0),Point(1) gsel CompDestWndID pget Point(0),Point(1) ColorDestWnd = ginfo_r,ginfo_g,ginfo_b //color 255,0,0:pset Point(0),Point(1) //比較 Ifs(0) = ((ColorDestWnd(0) >= limit(abs(ColorSrcWnd(0)-RangeofError),0,255)) && (ColorDestWnd(0) <= limit(abs(ColorSrcWnd(0)+RangeofError),0,255)) || (ColorDestWnd(0) == ColorSrcWnd(0))) Ifs(1) = ((ColorDestWnd(1) >= limit(abs(ColorSrcWnd(1)-RangeofError),0,255)) && (ColorDestWnd(1) <= limit(abs(ColorSrcWnd(1)+RangeofError),0,255)) || (ColorDestWnd(1) == ColorSrcWnd(1))) Ifs(2) = ((ColorDestWnd(2) >= limit(abs(ColorSrcWnd(2)-RangeofError),0,255)) && (ColorDestWnd(2) <= limit(abs(ColorSrcWnd(2)+RangeofError),0,255)) || (ColorDestWnd(2) == ColorSrcWnd(2))) if (Ifs(0) && Ifs(1) && Ifs(2)){ //一致 if ((cnt == LoopMax-1) && (ret != COMPIMAGE_MISMATCH)):ret = COMPIMAGE_MATCH:break if (ResultWndID != -1):gsel ResultWndID:color 0,255,0:pset Point(0),Point(1) }else{ //不一致 ret = COMPIMAGE_MISMATCH if (ResultWndID != -1):gsel ResultWndID:color 255,0,0:pset Point(0),Point(1) if (Interruption):break } gsel CompSrcWndID //座標移動 Point += Accuracy if Point(0)>ginfo_winx{ Point(0) = 0 Point(1) += Accuracy } loop gsel CompSrcWndID Point = ginfo_winx,ginfo_winy if (ResultWndID != -1):gsel ResultWndID:pos 0,0:gmode 3,,,18:gcopy CompSrcWndID,0,0,Point(0),Point(1):gmode 0 gsel _ID color _Color(0),_Color(1),_Color(2) return ret #global //画像サイズが同じ画像を指定してください #include "user32.as" screen 3//結果画像用 title "結果ウィンドウ" screen 0 sdim Size, 2 objsize 160, 26 button "比較元画像選択...", *SrcImageSel button "比較先画像選択...", *DestImageSel button "比較開始", *Comparison RangeofError = 1:Accuracy = 2:Interruption = 0 mes "色の誤差(0~127):" input RangeofError mes "正確さ(処理速度に影響):" input Accuracy chkbox "不一致と判断した場合\n比較をやめる", Interruption SetWindowLong objinfo_hwnd(stat), -16, 0x50002003 buffer 1 buffer 2 stop *SrcImageSel dialog "bmp;*.jpg;*.png", 16 if (stat == 0):stop gsel 1 picload refstr, 0 Size = ginfo_winx, ginfo_winy gsel 0 pos 200, 0:gzoom 100, 100, 1, 0, 0, Size(0), Size(1), 1//サムネイル color 255, 255, 255:boxf 300, 0, ginfo_winx, 20 color 0, 0, 0:pos 300,0:mes getpath(refstr, 8) stop *DestImageSel dialog "bmp;*.jpg;*.png", 16 if (stat == 0):stop gsel 2 picload refstr, 0 Size = ginfo_winx, ginfo_winy gsel 0 pos 200, 100:gzoom 100, 100, 2, 0, 0, Size(0), Size(1), 1//サムネイル color 255, 255, 255:boxf 300, 100, ginfo_winx, 120 color 0, 0, 0:pos 300,100:mes getpath(refstr, 8) stop *Comparison CompImage 1, 2, 3, Interruption, RangeofError, Accuracy if (stat == COMPIMAGE_MATCH):dialog "一致":else{ dialog "不一致" } stop



この記事に返信する


sakura

リンク

2016/12/31(Sat) 10:48:03|NO.77772

InoueSoftwareさん
すばらしいです。動かして見たら、「科捜研の女」に出てくる画像(防犯カメラの映像)の
判定に使われているシーンを思い出しました。
不一致の場合の不一致率%見たいなことができると良いですね。



スペース

リンク

2016/12/31(Sat) 15:58:41|NO.77782

>>sakuraさん
https://goo.gl/J5jrFn
実はこんなものが・・・



sakura

リンク

2016/12/31(Sat) 17:22:16|NO.77783

スペースさん、情報提供ありがとうございます。

個人的な見解ですが、InoueSoftwareさんのモジュールのサンプルの方が完成度が高く
もう少しチューニングすれば実用性があると思います。



ONION software Copyright 1997-2021(c) All rights reserved.