@@ -60,6 +60,19 @@ function isValidSearch(needle: cv.Mat, haystack: cv.Mat): boolean {
60
60
return ( needle . cols <= haystack . cols ) && ( needle . rows <= haystack . rows ) ;
61
61
}
62
62
63
+ function createResultForInvalidSearch ( currentScale : number ) {
64
+ return new ScaledMatchResult ( 0 ,
65
+ currentScale ,
66
+ new Region (
67
+ 0 ,
68
+ 0 ,
69
+ 0 ,
70
+ 0
71
+ ) ,
72
+ new Error ( "The provided image sample is larger than the provided search region" )
73
+ )
74
+ }
75
+
63
76
export default class TemplateMatchingFinder implements FinderInterface {
64
77
private initialScale = [ 1.0 ] ;
65
78
private scaleSteps = [ 0.9 , 0.8 , 0.7 , 0.6 , 0.5 ] ;
@@ -94,72 +107,15 @@ export default class TemplateMatchingFinder implements FinderInterface {
94
107
const matchResults = this . initialScale . map (
95
108
async ( currentScale ) => {
96
109
if ( ! isValidSearch ( needle , haystack ) ) {
97
- return new ScaledMatchResult ( 0 ,
98
- currentScale ,
99
- new Region (
100
- 0 ,
101
- 0 ,
102
- 0 ,
103
- 0
104
- ) ,
105
- new Error ( "The provided image sample is larger than the provided search region" )
106
- ) ;
110
+ return createResultForInvalidSearch ( currentScale ) ;
107
111
}
108
112
const matchResult = await matchImages ( haystack , needle ) ;
109
113
return new ScaledMatchResult ( matchResult . confidence , currentScale , matchResult . location ) ;
110
114
}
111
115
) ;
116
+
112
117
if ( matchRequest . searchMultipleScales ) {
113
- const scaledNeedleResult = this . scaleSteps . map (
114
- async ( currentScale ) => {
115
- const scaledNeedle = await scaleImage ( needle , currentScale ) ;
116
- if ( ! isValidSearch ( scaledNeedle , haystack ) ) {
117
- return new ScaledMatchResult ( 0 ,
118
- currentScale ,
119
- new Region (
120
- 0 ,
121
- 0 ,
122
- 0 ,
123
- 0
124
- ) ,
125
- new Error ( "The provided image sample is larger than the provided search region" )
126
- ) ;
127
- }
128
- const matchResult = await matchImages ( haystack , scaledNeedle ) ;
129
- return new ScaledMatchResult (
130
- matchResult . confidence ,
131
- currentScale ,
132
- matchResult . location ,
133
- ) ;
134
- }
135
- ) ;
136
- const scaledHaystackResult = this . scaleSteps . map (
137
- async ( currentScale ) => {
138
- const scaledHaystack = await scaleImage ( haystack , currentScale ) ;
139
- if ( ! isValidSearch ( needle , scaledHaystack ) ) {
140
- return new ScaledMatchResult ( 0 ,
141
- currentScale ,
142
- new Region (
143
- 0 ,
144
- 0 ,
145
- 0 ,
146
- 0
147
- ) ,
148
- new Error ( "The provided image sample is larger than the provided search region" )
149
- ) ;
150
- }
151
- const matchResult = await matchImages ( scaledHaystack , needle ) ;
152
- return new ScaledMatchResult (
153
- matchResult . confidence ,
154
- currentScale ,
155
- scaleLocation (
156
- matchResult . location ,
157
- currentScale
158
- )
159
- ) ;
160
- }
161
- ) ;
162
- matchResults . push ( ...scaledHaystackResult , ...scaledNeedleResult ) ;
118
+ matchResults . push ( ...this . searchMultipleScales ( needle , haystack ) )
163
119
}
164
120
165
121
return Promise . all ( matchResults ) . then ( results => {
@@ -200,4 +156,39 @@ export default class TemplateMatchingFinder implements FinderInterface {
200
156
}
201
157
} ) ;
202
158
}
159
+
160
+ private searchMultipleScales ( needle : cv . Mat , haystack : cv . Mat ) {
161
+ const scaledNeedleResult = this . scaleSteps . map (
162
+ async ( currentScale ) => {
163
+ const scaledNeedle = await scaleImage ( needle , currentScale ) ;
164
+ if ( ! isValidSearch ( scaledNeedle , haystack ) ) {
165
+ return createResultForInvalidSearch ( currentScale ) ;
166
+ }
167
+ const matchResult = await matchImages ( haystack , scaledNeedle ) ;
168
+ return new ScaledMatchResult (
169
+ matchResult . confidence ,
170
+ currentScale ,
171
+ matchResult . location ,
172
+ ) ;
173
+ }
174
+ ) ;
175
+ const scaledHaystackResult = this . scaleSteps . map (
176
+ async ( currentScale ) => {
177
+ const scaledHaystack = await scaleImage ( haystack , currentScale ) ;
178
+ if ( ! isValidSearch ( needle , scaledHaystack ) ) {
179
+ return createResultForInvalidSearch ( currentScale ) ;
180
+ }
181
+ const matchResult = await matchImages ( scaledHaystack , needle ) ;
182
+ return new ScaledMatchResult (
183
+ matchResult . confidence ,
184
+ currentScale ,
185
+ scaleLocation (
186
+ matchResult . location ,
187
+ currentScale
188
+ )
189
+ ) ;
190
+ }
191
+ ) ;
192
+ return [ ...scaledHaystackResult , ...scaledNeedleResult ] ;
193
+ }
203
194
}
0 commit comments