回答編集履歴

3

コード誤り修正

2019/06/05 15:25

投稿

thkana
thkana

スコア7645

test CHANGED
@@ -64,11 +64,11 @@
64
64
 
65
65
  exit:
66
66
 
67
- for ( int h=0; h<img3.height; h++)
67
+ for ( int h=0; h<im3.height; h++)
68
68
 
69
69
  {
70
70
 
71
- for (int w=0; w<img3.width; w++) {
71
+ for (int w=0; w<im3.width; w++) {
72
72
 
73
73
  if ( im1.get(ww+w, hh+h)!= im3.get(w, h)) {
74
74
 

2

サンプルプログラム追加

2019/06/05 15:25

投稿

thkana
thkana

スコア7645

test CHANGED
@@ -23,3 +23,115 @@
23
23
 
24
24
 
25
25
  それをどうしたいのか、具体的に説明してみていただけませんか。
26
+
27
+
28
+
29
+ ---
30
+
31
+ img1とimg2が別になっている意味が質問の範囲からは読み取れませんけど...
32
+
33
+ その他も、考えていることに対して未整理のままプログラムを組んでいるように見受けられます。
34
+
35
+ とりあえずimg3との比較を行う分を関数に切り出して少し見通しがよくならないかとやってみました。
36
+
37
+ サンプル画は'フリー素材 猫'でググったところから適当に引っ張ったものです。
38
+
39
+ ```Processing
40
+
41
+ PImage img1, img2, img3;
42
+
43
+ final int BORDER=5;
44
+
45
+
46
+
47
+ void setup() {
48
+
49
+ img1=loadImage("https://www.pakutaso.com/shared/img/thumb/tomcatDSC09085_TP_V.jpg");
50
+
51
+ img2=img1.get();
52
+
53
+ img3=img1.get(720, 400, 300, 300);
54
+
55
+ surface.setSize(img1.width + img3.width, img1.height);
56
+
57
+ }
58
+
59
+
60
+
61
+ boolean isMatch(PImage im1, PImage im3, int ww, int hh) {
62
+
63
+ boolean flag=true;
64
+
65
+ exit:
66
+
67
+ for ( int h=0; h<img3.height; h++)
68
+
69
+ {
70
+
71
+ for (int w=0; w<img3.width; w++) {
72
+
73
+ if ( im1.get(ww+w, hh+h)!= im3.get(w, h)) {
74
+
75
+ flag=false;
76
+
77
+ break exit;
78
+
79
+ }
80
+
81
+ }
82
+
83
+ }
84
+
85
+ return flag;
86
+
87
+ }
88
+
89
+
90
+
91
+ void draw() {
92
+
93
+ int mx=0, my=0;
94
+
95
+ boolean flag=true;
96
+
97
+ image(img1, 0, 0);
98
+
99
+ image(img3, img1.width, 0);
100
+
101
+ exit:
102
+
103
+ for (my=0; my<img1.height-img3.height; my++) {
104
+
105
+ for (mx=0; mx<img1.width-img3.width; mx++) {
106
+
107
+ flag=isMatch(img1, img3, mx, my);
108
+
109
+ if (flag) {
110
+
111
+ break exit;
112
+
113
+ }
114
+
115
+ }
116
+
117
+ }
118
+
119
+ if (flag) {
120
+
121
+ noFill();
122
+
123
+ stroke(255, 0, 0);
124
+
125
+ strokeWeight(BORDER);
126
+
127
+ rect(mx, my, img3.width, img3.height);
128
+
129
+ }
130
+
131
+ noLoop();
132
+
133
+ }
134
+
135
+ ```
136
+
137
+ 意外と遅くないような気も。一致/不一致が見極められた即ループを抜けるようにしたのが効いているのかしら。

1

補足修正

2019/06/05 14:22

投稿

thkana
thkana

スコア7645

test CHANGED
@@ -11,3 +11,15 @@
11
11
  プログラムの進行でmx, myがどう変化しているのかをプログラムを追ってトレースして行けば「なぜそうなるか」は明らかになると思います。
12
12
 
13
13
  実行速度については、ピクセルを一つ一つgetして比較いく方法では遅いのは仕方ないと思います。せめて、loadPixels()で一気に画素配列を得て処理するとか、画像のままblend()関数で差分を求めるとかすれば改善されるかと思います。
14
+
15
+
16
+
17
+ ---
18
+
19
+ ということでじっと眺めてみたけど...何をしたいのかイマイチ。
20
+
21
+ > img1、img2が元画像でimg2上に四角を描き、img3はimg1から切り抜いた画像
22
+
23
+
24
+
25
+ それをどうしたいのか、具体的に説明してみていただけませんか。