@@ -34,23 +34,24 @@ Mat im(int type)
3434
3535 return img;
3636}
37- Mat kn5 () { return getStructuringElement (cv::MorphShapes::MORPH_ELLIPSE, Size (5 , 5 )); }
3837Mat 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 )); }
3941Mat kn1Zero () { return Mat::zeros (1 , 1 , CV_8UC1); }
4042Mat kn1One () { return Mat::ones (1 , 1 , CV_8UC1); }
4143Mat knEmpty () { return Mat (); }
4244Mat knZeros () { return Mat::zeros (5 , 5 , CV_8UC1); }
4345Mat 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 ); }
4847Mat knRnd (int size, int density)
4948{
5049 Mat rndMat (size, size, CV_8UC1);
5150 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);
5455 return rndMat;
5556}
5657
@@ -201,7 +202,7 @@ TEST(ximgproc_StMorph_ex, regression_hitmiss) { ex_rgr(im(CV_8UC1), MORPH_HITMIS
201202
202203#pragma region power2RectCovering
203204
204- void p2RCov (InputArray kernel)
205+ std::vector<Rect> p2RCov (InputArray kernel)
205206{
206207 std::vector<Rect> p2Rects = stMorph::genPow2RectsToCoverKernel (kernel);
207208 Mat expected = kernel.getMat ();
@@ -212,98 +213,16 @@ void p2RCov(InputArray kernel)
212213 actual (rect).setTo (1 );
213214 }
214215 assertArraysIdentical (expected, actual);
216+ return p2Rects;
215217}
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)
229219{
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 ;
304223 resize (kernel * 255 , kernel, Size (), rate, rate, InterpolationFlags::INTER_NEAREST);
305224 cvtColor (kernel, kernel, cv::COLOR_GRAY2BGR);
306- Scalar color[20 ]{
225+ Scalar color[colors ]{
307226 Scalar (83 , 89 , 73 ), Scalar (49 , 238 , 73 ), Scalar (220 , 192 , 189 ), Scalar (174 , 207 , 34 ),
308227 Scalar (144 , 169 , 187 ), Scalar (137 , 94 , 76 ), Scalar (42 , 11 , 215 ), Scalar (113 , 11 , 204 ),
309228 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)
313232 for (int i = 0 ; i < rects.size (); i++)
314233 {
315234 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 );
324243 }
325- // imshow("kernel", kernel);
326-
244+ # if 0
245+ imshow("Map", kernel);
327246 waitKey();
328247 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);
329260}
330261
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
344263
264+ #pragma region planning
265+
266+ void VisualizePlanning (std::vector<std::vector<bool >> map, std::vector<stMorph::StStep> res)
267+ {
345268 int g = 30 ;
346269 int r = map.size ();
347270 int c = map[0 ].size ();
@@ -365,43 +288,63 @@ TEST(ximgproc_StMorph_dev, PLANNING)
365288 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 );
366289 }
367290 }
368- // imshow("Map", m);
369-
291+ # if 0
292+ imshow("Map", m);
370293 waitKey();
371294 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);
372305}
306+ TEST (ximgproc_StMorph_private, planning2){ feture_planning (knRnd (14 , 20 )); }
373307
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 ),
375313 int iterations = 1,
376314 BorderTypes bdrType = BorderTypes::BORDER_CONSTANT, Scalar& bdrVal = Scalar::all(DBL_MAX))
377315{
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);
380318}
381- void cvErode (InputArray src, InputArray kernel, Point anchor = Point(-1 , -1 ),
319+ void stErode (InputArray src, InputArray kernel, Point anchor = Point(-1 , -1 ),
382320 int iterations = 1,
383321 BorderTypes bdrType = BorderTypes::BORDER_CONSTANT, Scalar& bdrVal = Scalar::all(DBL_MAX))
384322{
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);
387325}
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))
398329{
399- cvDilate (im (CV_8UC3), kn51 ());
330+ Mat tmp;
331+ dilate (src, tmp, kernel, anchor, iterations, bdrType, bdrVal);
400332}
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))
402336{
403- cvErode (im (CV_8UC3), kn51 ());
337+ Mat tmp;
338+ erode (src, tmp, kernel, anchor, iterations, bdrType, bdrVal);
404339}
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 ()); }
405348
406349#pragma endregion
407350
0 commit comments