Skip to content

Commit efba857

Browse files
committed
planning のユニットテスト追加
1 parent fe9150d commit efba857

File tree

1 file changed

+83
-140
lines changed

1 file changed

+83
-140
lines changed

modules/ximgproc/test/test_sparse_table_morphology.cpp

Lines changed: 83 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -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)); }
3837
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)); }
3941
Mat kn1Zero() { return Mat::zeros(1, 1, CV_8UC1); }
4042
Mat kn1One() { return Mat::ones(1, 1, CV_8UC1); }
4143
Mat knEmpty() { return Mat(); }
4244
Mat knZeros() { return Mat::zeros(5, 5, CV_8UC1); }
4345
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); }
4847
Mat 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

Comments
 (0)