@@ -190,18 +190,36 @@ TEST(CV_ArucoTutorial, can_find_diamondmarkers)
190
190
detectorParams.readDetectorParameters (fs.root ());
191
191
detectorParams.cornerRefinementMethod = aruco::CORNER_REFINE_APRILTAG;
192
192
193
- aruco::ArucoDetector detector (dictionary, detectorParams);
193
+ aruco::CharucoBoard charucoBoard (Size (3 , 3 ), 0 .4f , 0 .25f , dictionary);
194
+ aruco::CharucoDetector detector (charucoBoard, aruco::CharucoParameters (), detectorParams);
194
195
195
- vector< int > ids;
196
- vector< vector< Point2f > > corners, rejected;
196
+ vector<int > ids;
197
+ vector<vector<Point2f> > corners, diamondCorners;
198
+ vector<Vec4i> diamondIds;
197
199
const size_t N = 12ull ;
198
200
// corner indices of ArUco markers
199
201
const int goldCornersIds[N] = { 4 , 12 , 11 , 3 , 12 , 10 , 12 , 10 , 10 , 11 , 2 , 11 };
200
202
map<int , int > counterGoldCornersIds;
201
203
for (int i = 0 ; i < static_cast <int >(N); i++)
202
204
counterGoldCornersIds[goldCornersIds[i]]++;
203
205
204
- detector.detectMarkers (image, corners, ids, rejected);
206
+ const size_t diamondsN = 3 ;
207
+ // corners of diamonds with Vec4i indices
208
+ const float goldDiamondCorners[diamondsN][8 ] = {{195 .6f ,150 .9f , 213 .5f ,201 .2f , 136 .4f ,215 .3f , 122 .4f ,163 .5f },
209
+ {501 .1f ,171 .3f , 501 .9f ,208 .5f , 446 .2f ,199 .8f , 447 .8f ,163 .3f },
210
+ {343 .4f ,361 .2f , 359 .7f ,328 .7f , 400 .8f ,344 .6f , 385 .7f ,378 .4f }};
211
+ auto comp = [](const Vec4i& a, const Vec4i& b) {
212
+ if (a[0 ] < b[0 ]) return true ;
213
+ if (a[1 ] < b[1 ]) return true ;
214
+ if (a[2 ] < b[2 ]) return true ;
215
+ return a[3 ] < b[3 ];
216
+ };
217
+ map<Vec4i, const float *, decltype (comp)> goldDiamonds (comp);
218
+ goldDiamonds[Vec4i (10 , 4 , 11 , 12 )] = goldDiamondCorners[0 ];
219
+ goldDiamonds[Vec4i (10 , 3 , 11 , 12 )] = goldDiamondCorners[1 ];
220
+ goldDiamonds[Vec4i (10 , 2 , 11 , 12 )] = goldDiamondCorners[2 ];
221
+
222
+ detector.detectDiamonds (image, diamondCorners, diamondIds, corners, ids);
205
223
map<int , int > counterRes;
206
224
207
225
ASSERT_EQ (N, ids.size ());
@@ -211,7 +229,19 @@ TEST(CV_ArucoTutorial, can_find_diamondmarkers)
211
229
counterRes[arucoId]++;
212
230
}
213
231
214
- EXPECT_EQ (counterGoldCornersIds, counterRes); // check the number of ArUco markers
232
+ ASSERT_EQ (counterGoldCornersIds, counterRes); // check the number of ArUco markers
233
+ ASSERT_EQ (goldDiamonds.size (), diamondIds.size ()); // check the number of diamonds
234
+
235
+ for (size_t i = 0 ; i < goldDiamonds.size (); i++)
236
+ {
237
+ Vec4i diamondId = diamondIds[i];
238
+ ASSERT_TRUE (goldDiamonds.find (diamondId) != goldDiamonds.end ());
239
+ for (int j = 0 ; j < 4 ; j++)
240
+ {
241
+ EXPECT_NEAR (goldDiamonds[diamondId][j * 2 ], diamondCorners[i][j].x , 0 .5f );
242
+ EXPECT_NEAR (goldDiamonds[diamondId][j * 2 + 1 ], diamondCorners[i][j].y , 0 .5f );
243
+ }
244
+ }
215
245
}
216
246
217
247
}} // namespace
0 commit comments