Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitb7b8183

Browse files
author
Alex
committed
fix drawDetectedCornersCharuco, drawDetectedMarkers, drawDetectedDiamonds added tests
1 parent757d296 commitb7b8183

File tree

4 files changed

+101
-24
lines changed

4 files changed

+101
-24
lines changed

‎modules/objdetect/misc/python/test/test_objdetect_aruco.py‎

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,5 +394,53 @@ def test_charuco_match_image_points(self):
394394
self.assertEqual(2,img_points.shape[2])
395395
np.testing.assert_array_equal(chessboard_corners,obj_points[:, :, :2].reshape(-1,2))
396396

397+
deftest_draw_detected_markers(self):
398+
detected_points= [[[0,0], [10,0], [10,10], [0,10]]]
399+
img=np.zeros((20,20),dtype=np.uint8)
400+
401+
points1=np.array(detected_points)
402+
img=cv.aruco.drawDetectedMarkers(img,points1,borderColor=255)
403+
# check that the marker borders are painted
404+
self.assertEqual(img[10,10],255)
405+
406+
img.fill(0)
407+
# add extra dimension in Python to create Nx4 Mat with 2 channels
408+
points2=np.array(detected_points).reshape(-1,4,1,2)
409+
img=cv.aruco.drawDetectedMarkers(img,points2,borderColor=255)
410+
# check that the marker borders are painted
411+
self.assertEqual(img[10,10],255)
412+
413+
deftest_draw_detected_charuco(self):
414+
detected_points= [[0,0], [10,0], [10,10], [0,10]]
415+
img=np.zeros((20,20),dtype=np.uint8)
416+
417+
points1=np.array(detected_points)
418+
img=cv.aruco.drawDetectedCornersCharuco(img,points1,cornerColor=255)
419+
# check that the charuco corners are painted
420+
self.assertTrue(np.max(img)>0)
421+
422+
img.fill(0)
423+
# add extra dimension in Python to create Nx4 Mat with 2 channels
424+
points2=np.array(detected_points).reshape(-1,1,2)
425+
img=cv.aruco.drawDetectedCornersCharuco(img,points2,cornerColor=255)
426+
# check that the charuco corners are painted
427+
self.assertTrue(np.max(img)>0)
428+
429+
deftest_draw_detected_diamonds(self):
430+
detected_points= [[[0,0], [10,0], [10,10], [0,10]]]
431+
img=np.zeros((20,20),dtype=np.uint8)
432+
433+
points1=np.array(detected_points)
434+
img=cv.aruco.drawDetectedDiamonds(img,points1,borderColor=255)
435+
# check that the diamonds corners are painted
436+
self.assertEqual(img[10,10],255)
437+
438+
img.fill(0)
439+
# add extra dimension in Python to create Nx4 Mat with 2 channels
440+
points2=np.array(detected_points).reshape(-1,4,1,2)
441+
img=cv.aruco.drawDetectedDiamonds(img,points2,borderColor=255)
442+
# check that the diamonds corners are painted
443+
self.assertEqual(img[10,10],255)
444+
397445
if__name__=='__main__':
398446
NewOpenCVTests.bootstrap()

‎modules/objdetect/src/aruco/aruco_detector.cpp‎

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1315,24 +1315,26 @@ void drawDetectedMarkers(InputOutputArray _image, InputArrayOfArrays _corners,
13151315
int nMarkers = (int)_corners.total();
13161316
for(int i =0; i < nMarkers; i++) {
13171317
Mat currentMarker = _corners.getMat(i);
1318-
CV_Assert(currentMarker.total() ==4 && currentMarker.type() == CV_32FC2);
1318+
CV_Assert(currentMarker.total() * currentMarker.channels() ==8 &&
1319+
(currentMarker.channels() ==2 || currentMarker.cols ==2));
1320+
currentMarker.convertTo(currentMarker, CV_32SC2);
13191321

13201322
// draw marker sides
13211323
for(int j =0; j <4; j++) {
1322-
Point2f p0, p1;
1323-
p0 = currentMarker.ptr<Point2f>(0)[j];
1324-
p1 = currentMarker.ptr<Point2f>(0)[(j +1) %4];
1324+
Point p0, p1;
1325+
p0 = currentMarker.ptr<Point>(0)[j];
1326+
p1 = currentMarker.ptr<Point>(0)[(j +1) %4];
13251327
line(_image, p0, p1, borderColor,1);
13261328
}
13271329
// draw first corner mark
1328-
rectangle(_image, currentMarker.ptr<Point2f>(0)[0] -Point2f(3,3),
1329-
currentMarker.ptr<Point2f>(0)[0] +Point2f(3,3), cornerColor,1, LINE_AA);
1330+
rectangle(_image, currentMarker.ptr<Point>(0)[0] -Point(3,3),
1331+
currentMarker.ptr<Point>(0)[0] +Point(3,3), cornerColor,1, LINE_AA);
13301332

13311333
// draw ID
13321334
if(_ids.total() !=0) {
1333-
Point2fcent(0,0);
1335+
Pointcent(0,0);
13341336
for(int p =0; p <4; p++)
1335-
cent += currentMarker.ptr<Point2f>(0)[p];
1337+
cent += currentMarker.ptr<Point>(0)[p];
13361338
cent = cent /4.;
13371339
stringstream s;
13381340
s <<"id=" << _ids.getMat().ptr<int>(0)[i];

‎modules/objdetect/src/aruco/charuco_detector.cpp‎

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -507,20 +507,26 @@ void drawDetectedCornersCharuco(InputOutputArray _image, InputArray _charucoCorn
507507
InputArray _charucoIds, Scalar cornerColor) {
508508
CV_Assert(!_image.getMat().empty() &&
509509
(_image.getMat().channels() ==1 || _image.getMat().channels() ==3));
510-
CV_Assert((_charucoCorners.getMat().total() == _charucoIds.getMat().total()) ||
511-
_charucoIds.getMat().total() ==0);
512-
513-
size_t nCorners = _charucoCorners.getMat().total();
510+
CV_Assert((_charucoCorners.total() == _charucoIds.total()) ||
511+
_charucoIds.total() ==0);
512+
CV_Assert(_charucoCorners.channels() ==2 || _charucoCorners.cols() ==2);
513+
514+
Mat charucoCorners;
515+
_charucoCorners.getMat().convertTo(charucoCorners, CV_32SC2);
516+
Mat charucoIds;
517+
if (!_charucoIds.empty())
518+
charucoIds = _charucoIds.getMat();
519+
size_t nCorners = charucoCorners.total();
514520
for(size_t i =0; i < nCorners; i++) {
515-
Point2f corner =_charucoCorners.getMat().at<Point2f>((int)i);
521+
Point corner =charucoCorners.at<Point>((int)i);
516522
// draw first corner mark
517-
rectangle(_image, corner -Point2f(3,3), corner +Point2f(3,3), cornerColor,1, LINE_AA);
523+
rectangle(_image, corner -Point(3,3), corner +Point(3,3), cornerColor,1, LINE_AA);
518524
// draw ID
519525
if(!_charucoIds.empty()) {
520-
int id =_charucoIds.getMat().at<int>((int)i);
526+
int id =charucoIds.at<int>((int)i);
521527
stringstream s;
522528
s <<"id=" << id;
523-
putText(_image, s.str(), corner +Point2f(5, -5), FONT_HERSHEY_SIMPLEX,0.5,
529+
putText(_image, s.str(), corner +Point(5, -5), FONT_HERSHEY_SIMPLEX,0.5,
524530
cornerColor,2);
525531
}
526532
}
@@ -540,25 +546,27 @@ void drawDetectedDiamonds(InputOutputArray _image, InputArrayOfArrays _corners,
540546
int nMarkers = (int)_corners.total();
541547
for(int i =0; i < nMarkers; i++) {
542548
Mat currentMarker = _corners.getMat(i);
543-
CV_Assert(currentMarker.total() ==4 && currentMarker.type() == CV_32FC2);
549+
CV_Assert(currentMarker.total()*currentMarker.channels() ==8
550+
&& (currentMarker.channels() ==2 || currentMarker.cols ==2));
551+
currentMarker.convertTo(currentMarker, CV_32SC2);
544552

545553
// draw marker sides
546554
for(int j =0; j <4; j++) {
547-
Point2f p0, p1;
548-
p0 = currentMarker.at< Point2f>(j);
549-
p1 = currentMarker.at< Point2f>((j +1) %4);
555+
Point p0, p1;
556+
p0 = currentMarker.at<Point>(j);
557+
p1 = currentMarker.at<Point>((j +1) %4);
550558
line(_image, p0, p1, borderColor,1);
551559
}
552560

553561
// draw first corner mark
554-
rectangle(_image, currentMarker.at< Point2f>(0) -Point2f(3,3),
555-
currentMarker.at< Point2f>(0) +Point2f(3,3), cornerColor,1, LINE_AA);
562+
rectangle(_image, currentMarker.at<Point>(0) -Point(3,3),
563+
currentMarker.at<Point>(0) +Point(3,3), cornerColor,1, LINE_AA);
556564

557565
// draw id composed by four numbers
558566
if(_ids.total() !=0) {
559-
Point2fcent(0,0);
567+
Pointcent(0,0);
560568
for(int p =0; p <4; p++)
561-
cent += currentMarker.at< Point2f>(p);
569+
cent += currentMarker.at<Point>(p);
562570
cent = cent /4.;
563571
stringstream s;
564572
s <<"id=" << _ids.getMat().at< Vec4i >(i);

‎modules/objdetect/test/test_charucodetection.cpp‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,25 @@ TEST(Charuco, testmatchImagePoints)
689689
}
690690
}
691691

692+
TEST(Charuco, testDrawDetected) {
693+
vector<vector<Point2f>> detected_float = {{Point2f(0.f,0.f),Point2f(10.f,0.f),Point2f(10.f,10.f),Point2f(0.f,10.f)}};
694+
vector<vector<Point2d>> detected_double = {{Point2d(0.,0.),Point2d(10.,0.),Point2d(10.,10.),Point2d(0.,10.)}};
695+
vector<vector<Point2d>> detected_int = {{Point(0,0),Point(10,0),Point2d(10,10),Point2d(0,10)}};
696+
Mat img =Mat::zeros(20,20, CV_8UC1);
697+
698+
EXPECT_NO_THROW(aruco::drawDetectedMarkers(img, detected_float));
699+
EXPECT_NO_THROW(aruco::drawDetectedCornersCharuco(img, detected_float[0]));
700+
EXPECT_NO_THROW(aruco::drawDetectedDiamonds(img, detected_float));
701+
702+
EXPECT_NO_THROW(aruco::drawDetectedMarkers(img, detected_double));
703+
EXPECT_NO_THROW(aruco::drawDetectedCornersCharuco(img, detected_double[0]));
704+
EXPECT_NO_THROW(aruco::drawDetectedDiamonds(img, detected_double));
705+
706+
EXPECT_NO_THROW(aruco::drawDetectedMarkers(img, detected_int));
707+
EXPECT_NO_THROW(aruco::drawDetectedCornersCharuco(img, detected_int[0]));
708+
EXPECT_NO_THROW(aruco::drawDetectedDiamonds(img, detected_int));
709+
}
710+
692711
typedef testing::TestWithParam<cv::Size> CharucoBoard;
693712
INSTANTIATE_TEST_CASE_P(/**/, CharucoBoard, testing::Values(Size(3,2), Size(3,2), Size(6,2), Size(2,6),
694713
Size(3,4), Size(4,3), Size(7,3), Size(3,7)));

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp