@@ -34,23 +34,24 @@ Mat im(int type)
34
34
35
35
return img;
36
36
}
37
- Mat kn5 () { return getStructuringElement (cv::MorphShapes::MORPH_ELLIPSE, Size (5 , 5 )); }
38
37
Mat kn4 () { return getStructuringElement (cv::MorphShapes::MORPH_ELLIPSE, Size (4 , 4 )); }
38
+ Mat kn5 () { return getStructuringElement (cv::MorphShapes::MORPH_ELLIPSE, Size (5 , 5 )); }
39
+ Mat kn51 () { return getStructuringElement (cv::MorphShapes::MORPH_ELLIPSE, Size (51 , 51 )); }
40
+ Mat knBig () { return getStructuringElement (cv::MorphShapes::MORPH_RECT, Size (201 , 201 )); }
39
41
Mat kn1Zero () { return Mat::zeros (1 , 1 , CV_8UC1); }
40
42
Mat kn1One () { return Mat::ones (1 , 1 , CV_8UC1); }
41
43
Mat knEmpty () { return Mat (); }
42
44
Mat knZeros () { return Mat::zeros (5 , 5 , CV_8UC1); }
43
45
Mat knOnes () { return Mat::ones (5 , 5 , CV_8UC1); }
44
- Mat knBig () { return getStructuringElement (cv::MorphShapes::MORPH_RECT, Size (201 , 201 )); }
45
- Mat knAsymm (){
46
- return (Mat_<uchar>(5 , 5 ) << 0 ,0 ,0 ,0 ,0 , 0 ,0 ,1 ,0 ,0 , 0 ,1 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 , 0 ,0 ,1 ,0 ,0 );
47
- }
46
+ Mat knAsymm (){ return (Mat_<uchar>(5 , 5 ) << 0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ); }
48
47
Mat knRnd (int size, int density)
49
48
{
50
49
Mat rndMat (size, size, CV_8UC1);
51
50
theRNG ().state = getTickCount ();
52
- randu (rndMat, 0 , density + 1 );
53
- cv::min (rndMat, 1 , rndMat);
51
+ randu (rndMat, 2 , 102 );
52
+ density++;
53
+ rndMat.setTo (0 , density < rndMat);
54
+ rndMat.setTo (1 , 1 < rndMat);
54
55
return rndMat;
55
56
}
56
57
@@ -201,7 +202,7 @@ TEST(ximgproc_StMorph_ex, regression_hitmiss) { ex_rgr(im(CV_8UC1), MORPH_HITMIS
201
202
202
203
#pragma region power2RectCovering
203
204
204
- void p2RCov (InputArray kernel)
205
+ std::vector<Rect> p2RCov (InputArray kernel)
205
206
{
206
207
std::vector<Rect> p2Rects = stMorph::genPow2RectsToCoverKernel (kernel);
207
208
Mat expected = kernel.getMat ();
@@ -212,98 +213,16 @@ void p2RCov(InputArray kernel)
212
213
actual (rect).setTo (1 );
213
214
}
214
215
assertArraysIdentical (expected, actual);
216
+ return p2Rects;
215
217
}
216
- TEST (ximgproc_StMorph_private, feature_P2RCov_rnd1) { p2RCov (knRnd (1000 , 1 )); }
217
- TEST (ximgproc_StMorph_private, feature_P2RCov_rnd2) { p2RCov (knRnd (1000 , 1 )); }
218
- TEST (ximgproc_StMorph_private, feature_P2RCov_rnd3) { p2RCov (knRnd (1000 , 2 )); }
219
- TEST (ximgproc_StMorph_private, feature_P2RCov_rnd4) { p2RCov (knRnd (1000 , 2 )); }
220
- TEST (ximgproc_StMorph_private, feature_P2RCov_rnd5) { p2RCov (knRnd (1000 , 3 )); }
221
- TEST (ximgproc_StMorph_private, feature_P2RCov_rnd6) { p2RCov (knRnd (1000 , 3 )); }
222
- TEST (ximgproc_StMorph_private, feature_P2RCov_kn5) { p2RCov (kn5 ()); }
223
-
224
- #pragma endregion
225
-
226
- #pragma region morph_dev
227
-
228
- TEST (ximgproc_StMorph_dev, compare_with_original_erode)
218
+ void VisualizeCovering (Mat& kernel, const std::vector<Rect>& rects)
229
219
{
230
- // preparation
231
- int kRadius = 15 ;
232
- // Size sz(200, 150);
233
- Size sz = szVGA;
234
- int type = CV_8UC3;
235
-
236
- int kSize = kRadius * 2 + 1 ;
237
- Point anchor (kRadius , kRadius );
238
- Mat src (sz, type);
239
- Mat expected (sz, type);
240
- Mat actual (sz, type);
241
- Size kernelSize (kSize , kSize );
242
- Mat kernel = getStructuringElement (cv::MorphShapes::MORPH_RECT, kernelSize, Point (kRadius , kRadius ));
243
-
244
- src.setTo (240 );
245
- putText (src, " A" , Point (sz.height / 5 * 1 , sz.height / 20 * 15 ), HersheyFonts::FONT_HERSHEY_TRIPLEX, 10 , Scalar (255 , 40 , 40 ), 30 , LineTypes::FILLED);
246
- putText (src, " B" , Point (sz.height / 5 * 2 , sz.height / 20 * 16 ), HersheyFonts::FONT_HERSHEY_TRIPLEX, 10 , Scalar (20 , 255 , 0 ), 30 , LineTypes::FILLED);
247
- putText (src, " C" , Point (sz.height / 5 * 3 , sz.height / 20 * 17 ), HersheyFonts::FONT_HERSHEY_TRIPLEX, 10 , Scalar (10 , 10 , 255 ), 30 , LineTypes::FILLED);
248
-
249
- cv::TickMeter timer;
250
-
251
- // original
252
- timer.start ();
253
- cv::erode (src, expected, kernel); // 482ms for Elipse, kSize = 101
254
- timer.stop ();
255
- double originalTime = timer.getTimeMilli ();
256
- timer.reset ();
257
-
258
- // proposal
259
- timer.start ();
260
- stMorph::erode (src, actual, kernel); // 217ms for Elipse, kSize = 101
261
- timer.stop ();
262
- double proposalTime = timer.getTimeMilli ();
263
-
264
- // assertion
265
- Mat diff;
266
- cv::absdiff (expected, actual, diff);
267
-
268
- #if 0
269
- putText(expected, std::to_string(originalTime), cv::Point(10, 20), HersheyFonts::FONT_HERSHEY_TRIPLEX, 1, Scalar(250, 40, 40), 1, LineTypes::FILLED);
270
- putText(actual, std::to_string(proposalTime), cv::Point(10, 20), HersheyFonts::FONT_HERSHEY_TRIPLEX, 1, Scalar(250, 40, 40), 1, LineTypes::FILLED);
271
- Mat con;
272
- double rate = 300.0 / src.cols;
273
- cv::hconcat(src, expected, con);
274
- cv::hconcat(con, actual, con);
275
- cv::resize(con, con, Size(), rate, rate, InterpolationFlags::INTER_NEAREST);
276
- cv::resize(diff, diff, Size(), rate, rate, InterpolationFlags::INTER_NEAREST);
277
- imshow("Bordered source", con);
278
- imshow("diff", diff);
279
- waitKey();
280
- destroyAllWindows();
281
- #endif
282
-
283
- double min, max;
284
- cv::minMaxLoc (diff, &min, &max);
285
- CV_Assert (max == 0 );
286
- }
287
-
288
- TEST (ximgproc_StMorph_dev, POW2RECT_COVERING)
289
- {
290
- uchar ary[]{
291
- 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ,
292
- 1 , 1 , 0 , 1 , 1 , 1 , 1 , 1 ,
293
- 1 , 0 , 0 , 1 , 0 , 1 , 0 , 1 ,
294
- 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 ,
295
- 0 , 1 , 0 , 1 , 0 , 1 , 1 , 1 ,
296
- 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
297
- 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ,
298
- 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
299
- };
300
- Mat kernel (8 , 8 , CV_8UC1, ary);
301
- std::vector<Rect> rects = stMorph::genPow2RectsToCoverKernel (kernel);
302
-
303
- int rate = 20 ;
220
+ const int rate = 20 ;
221
+ const int fluct = 5 ;
222
+ const int colors = 20 ;
304
223
resize (kernel * 255 , kernel, Size (), rate, rate, InterpolationFlags::INTER_NEAREST);
305
224
cvtColor (kernel, kernel, cv::COLOR_GRAY2BGR);
306
- Scalar color[20 ]{
225
+ Scalar color[colors ]{
307
226
Scalar (83 , 89 , 73 ), Scalar (49 , 238 , 73 ), Scalar (220 , 192 , 189 ), Scalar (174 , 207 , 34 ),
308
227
Scalar (144 , 169 , 187 ), Scalar (137 , 94 , 76 ), Scalar (42 , 11 , 215 ), Scalar (113 , 11 , 204 ),
309
228
Scalar (71 , 124 , 8 ), Scalar (192 , 38 , 8 ), Scalar (82 , 201 , 8 ), Scalar (70 , 7 , 112 ),
@@ -313,35 +232,39 @@ TEST(ximgproc_StMorph_dev, POW2RECT_COVERING)
313
232
for (int i = 0 ; i < rects.size (); i++)
314
233
{
315
234
Rect rect = rects[i];
316
- Point lt ((rect.x ) * rate + i % 11 , (rect.y ) * rate + i % 11 );
317
- Point lb ((rect.x ) * rate + i % 11 , (rect.y + (1 << rect.height )) * rate - 11 + i % 11 );
318
- Point rb ((rect.x + (1 << rect.width )) * rate - 11 + i % 11 , (rect.y + (1 << rect.height )) * rate - 11 + i % 11 );
319
- Point rt ((rect.x + (1 << rect.width )) * rate - 11 + i % 11 , (rect.y ) * rate + i % 11 );
320
- cv::line (kernel, lt, lb, color[i % 20 ], 2 );
321
- cv::line (kernel, lb, rb, color[i % 20 ], 2 );
322
- cv::line (kernel, rb, rt, color[i % 20 ], 2 );
323
- cv::line (kernel, rt, lt, color[i % 20 ], 2 );
235
+ Point lt ((rect.x ) * rate + i % fluct , (rect.y ) * rate + i % fluct );
236
+ Point lb ((rect.x ) * rate + i % fluct , (rect.y + (1 << rect.height )) * rate - fluct + i % fluct );
237
+ Point rb ((rect.x + (1 << rect.width )) * rate - fluct + i % fluct , (rect.y + (1 << rect.height )) * rate - fluct + i % fluct );
238
+ Point rt ((rect.x + (1 << rect.width )) * rate - fluct + i % fluct , (rect.y ) * rate + i % fluct );
239
+ cv::line (kernel, lt, lb, color[i % colors ], 1 );
240
+ cv::line (kernel, lb, rb, color[i % colors ], 1 );
241
+ cv::line (kernel, rb, rt, color[i % colors ], 1 );
242
+ cv::line (kernel, rt, lt, color[i % colors ], 1 );
324
243
}
325
- // imshow("kernel", kernel);
326
-
244
+ # if 0
245
+ imshow("Map", kernel);
327
246
waitKey();
328
247
destroyAllWindows();
248
+ #endif
249
+ }
250
+ TEST (ximgproc_StMorph_private, feature_P2RCov_rnd1) { p2RCov (knRnd (1000 , 1 )); }
251
+ TEST (ximgproc_StMorph_private, feature_P2RCov_rnd10) { p2RCov (knRnd (1000 , 10 )); }
252
+ TEST (ximgproc_StMorph_private, feature_P2RCov_rnd30) { p2RCov (knRnd (1000 , 30 )); }
253
+ TEST (ximgproc_StMorph_private, feature_P2RCov_rnd50) { p2RCov (knRnd (1000 , 50 )); }
254
+ TEST (ximgproc_StMorph_private, feature_P2RCov_rnd80) { p2RCov (knRnd (1000 , 80 )); }
255
+ TEST (ximgproc_StMorph_private, feature_P2RCov_rnd90) { p2RCov (knRnd (1000 , 90 )); }
256
+ TEST (ximgproc_StMorph_private, feature_P2RCov_visualize) {
257
+ Mat kernel = knRnd (50 , 70 );
258
+ auto rects = p2RCov (kernel);
259
+ VisualizeCovering (kernel, rects);
329
260
}
330
261
331
- TEST (ximgproc_StMorph_dev, PLANNING)
332
- {
333
- std::vector<std::vector<bool >> map{
334
- std::vector<bool >{0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 },
335
- std::vector<bool >{0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 },
336
- std::vector<bool >{0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 },
337
- std::vector<bool >{0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 },
338
- std::vector<bool >{0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 },
339
- std::vector<bool >{0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 },
340
- std::vector<bool >{0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 },
341
- std::vector<bool >{1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 },
342
- };
343
- auto res = stMorph::planSparseTableConstr (map);
262
+ #pragma endregion
344
263
264
+ #pragma region planning
265
+
266
+ void VisualizePlanning (std::vector<std::vector<bool >> map, std::vector<stMorph::StStep> res)
267
+ {
345
268
int g = 30 ;
346
269
int r = map.size ();
347
270
int c = map[0 ].size ();
@@ -365,43 +288,63 @@ TEST(ximgproc_StMorph_dev, PLANNING)
365
288
cv::line (m, Point (edge.dimCol * g + g / 2 , edge.dimRow * g + g / 2 ), Point ((edge.dimCol + 1 ) * g + g / 2 , edge.dimRow * g + g / 2 ), Scalar (100 , 100 , 100 ), 2 );
366
289
}
367
290
}
368
- // imshow("Map", m);
369
-
291
+ # if 0
292
+ imshow("Map", m);
370
293
waitKey();
371
294
destroyAllWindows();
295
+ #endif
296
+ }
297
+ void feture_planning (const Mat& mat)
298
+ {
299
+ std::vector<std::vector<bool >> map (mat.rows , std::vector<bool >(mat.cols , false ));
300
+ for (int r = 0 ; r < mat.rows ; r++) for (int c = 0 ; c < mat.cols ; c++)
301
+ map[r][c] = (mat.ptr <uchar>(r, c)[0 ] == 1 );
302
+
303
+ auto res = stMorph::planSparseTableConstr (map);
304
+ VisualizePlanning (map, res);
372
305
}
306
+ TEST (ximgproc_StMorph_private, planning2){ feture_planning (knRnd (14 , 20 )); }
373
307
374
- void cvDilate (InputArray src, InputArray kernel, Point anchor = Point(-1 , -1 ),
308
+ #pragma endregion
309
+
310
+ #pragma region morph_comp
311
+
312
+ void stDilate (InputArray src, InputArray kernel, Point anchor = Point(-1 , -1 ),
375
313
int iterations = 1,
376
314
BorderTypes bdrType = BorderTypes::BORDER_CONSTANT, Scalar& bdrVal = Scalar::all(DBL_MAX))
377
315
{
378
- Mat actual ;
379
- dilate (src, actual , kernel, anchor, iterations, bdrType, bdrVal);
316
+ Mat tmp ;
317
+ stMorph:: dilate (src, tmp , kernel, anchor, iterations, bdrType, bdrVal);
380
318
}
381
- void cvErode (InputArray src, InputArray kernel, Point anchor = Point(-1 , -1 ),
319
+ void stErode (InputArray src, InputArray kernel, Point anchor = Point(-1 , -1 ),
382
320
int iterations = 1,
383
321
BorderTypes bdrType = BorderTypes::BORDER_CONSTANT, Scalar& bdrVal = Scalar::all(DBL_MAX))
384
322
{
385
- Mat actual ;
386
- erode (src, actual , kernel, anchor, iterations, bdrType, bdrVal);
323
+ Mat tmp ;
324
+ stMorph:: erode (src, tmp , kernel, anchor, iterations, bdrType, bdrVal);
387
325
}
388
- Mat kn51 () { return getStructuringElement (cv::MorphShapes::MORPH_ELLIPSE, Size (51 , 51 )); }
389
- TEST (ximgproc_StMorph_dev, big_stDilate)
390
- {
391
- dilate_ftr (im (CV_8UC3), kn51 ());
392
- }
393
- TEST (ximgproc_StMorph_dev, big_stEerode)
394
- {
395
- erode_ftr (im (CV_8UC3), kn51 ());
396
- }
397
- TEST (ximgproc_StMorph_dev, big_cvDilate)
326
+ void cvDilate (InputArray src, InputArray kernel, Point anchor = Point(-1 , -1 ),
327
+ int iterations = 1,
328
+ BorderTypes bdrType = BorderTypes::BORDER_CONSTANT, Scalar& bdrVal = Scalar::all(DBL_MAX))
398
329
{
399
- cvDilate (im (CV_8UC3), kn51 ());
330
+ Mat tmp;
331
+ dilate (src, tmp, kernel, anchor, iterations, bdrType, bdrVal);
400
332
}
401
- TEST (ximgproc_StMorph_dev, big_cvErode)
333
+ void cvErode (InputArray src, InputArray kernel, Point anchor = Point(-1 , -1 ),
334
+ int iterations = 1,
335
+ BorderTypes bdrType = BorderTypes::BORDER_CONSTANT, Scalar& bdrVal = Scalar::all(DBL_MAX))
402
336
{
403
- cvErode (im (CV_8UC3), kn51 ());
337
+ Mat tmp;
338
+ erode (src, tmp, kernel, anchor, iterations, bdrType, bdrVal);
404
339
}
340
+ TEST (ximgproc_StMorph_comp, 51_stDilate) { stDilate (im (CV_8UC3), kn51 ()); }
341
+ TEST (ximgproc_StMorph_comp, 51_stEerode) { stErode (im (CV_8UC3), kn51 ()); }
342
+ TEST (ximgproc_StMorph_comp, 51_cvDilate) { cvDilate (im (CV_8UC3), kn51 ()); }
343
+ TEST (ximgproc_StMorph_comp, 51_cvErode) { cvErode (im (CV_8UC3), kn51 ()); }
344
+ TEST (ximgproc_StMorph_comp, 5_stDilate) { stDilate (im (CV_8UC3), knOnes ()); }
345
+ TEST (ximgproc_StMorph_comp, 5_stEerode) { stErode (im (CV_8UC3), knOnes ()); }
346
+ TEST (ximgproc_StMorph_comp, 5_cvDilate) { cvDilate (im (CV_8UC3), knOnes ()); }
347
+ TEST (ximgproc_StMorph_comp, 5_cvErode) { cvErode (im (CV_8UC3), knOnes ()); }
405
348
406
349
#pragma endregion
407
350
0 commit comments