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

Commit42d97fa

Browse files
fix matchImagePoints
1 parenta9d02f0 commit42d97fa

File tree

3 files changed

+16
-10
lines changed

3 files changed

+16
-10
lines changed

‎modules/objdetect/include/opencv2/objdetect/aruco_board.hpp‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,11 @@ class CV_EXPORTS_W_SIMPLE Board {
6161
* image points and object points to call solvePnP()
6262
*
6363
* @param detectedCorners List of detected marker corners of the board.
64-
* For CharucoBoard class you can set list of charuco corners.
64+
* Board/GridBoard/CharucoBoard support std::vector<std::vector<Point2f>> or std::vector<Mat> for marker corners.
65+
* CharucoBoard support std::vector<Point2f> or Mat for charuco corners.
6566
* @param detectedIds List of identifiers for each marker or list of charuco identifiers for each corner.
6667
* For CharucoBoard class you can set list of charuco identifiers for each corner.
68+
* Board/GridBoard/CharucoBoard support std::vector<int> or Mat.
6769
* @param objPoints Vector of vectors of board marker points in the board coordinate space.
6870
* @param imgPoints Vector of vectors of the projections of board marker corner points.
6971
*/

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -369,20 +369,29 @@ void CharucoBoardImpl::calcNearestMarkerCorners() {
369369
}
370370

371371
voidCharucoBoardImpl::matchImagePoints(InputArrayOfArrays detectedCorners, InputArray detectedIds,
372-
OutputArray _objPoints, OutputArray imgPoints)const {
372+
OutputArray _objPoints, OutputArray imgPoints)const {
373+
// detectedCorners can includes aruco marker corners as vector<vector<Point2f>> or vector<Mat>.
374+
// Any Mat in vector<Mat> must have 4 rows for 4 corners for one marker.
373375
if (detectedCorners.kind() == _InputArray::STD_VECTOR_VECTOR ||
374-
detectedCorners.isMatVector()|| detectedCorners.isUMatVector())
376+
(detectedCorners.isMatVector()&& detectedCorners.total() >0ull && detectedCorners.getMat(0).total() ==4ull))
375377
Board::Impl::matchImagePoints(detectedCorners, detectedIds, _objPoints, imgPoints);
378+
// detectedCorners can includes charuco corners as vector<Point2f> or Mat.
379+
// Python bindings could add extra dimension to detectedCorners and therefore vector<Mat> case is additionally
380+
// processed.
376381
else {
377-
CV_Assert(detectedCorners.isMat() || detectedCorners.isVector());
382+
CV_Assert(detectedCorners.isMat() || detectedCorners.isVector() || detectedCorners.isMatVector());
383+
CV_Assert(detectedIds.total() == detectedCorners.total());
378384
size_t nDetected = detectedCorners.total();
379385
vector<Point3f>objPnts(nDetected);
380386
vector<Point2f>imgPnts(nDetected);
381387
for(size_t i =0ull; i < nDetected; i++) {
382388
int pointId = detectedIds.getMat().at<int>((int)i);
383389
CV_Assert(pointId >=0 && pointId < (int)chessboardCorners.size());
384390
objPnts[i] = chessboardCorners[pointId];
385-
imgPnts[i] = detectedCorners.getMat().at<Point2f>((int)i);
391+
if (detectedCorners.isMatVector() || detectedCorners.isUMatVector())
392+
imgPnts[i] = detectedCorners.getMat((int)i).at<Point2f>(0);
393+
else
394+
imgPnts[i] = detectedCorners.getMat().at<Point2f>((int)i);
386395
}
387396
Mat(objPnts).copyTo(_objPoints);
388397
Mat(imgPnts).copyTo(imgPoints);

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,25 +129,20 @@ struct CharucoDetector::CharucoDetectorImpl {
129129
// approximated pose estimation using marker corners
130130
Mat approximatedRvec, approximatedTvec;
131131
Mat objPoints, imgPoints;// object and image points for the solvePnP function
132-
printf("before board.matchImagePoints(markerCorners, markerIds, objPoints, imgPoints);\n");
133132
board.matchImagePoints(markerCorners, markerIds, objPoints, imgPoints);
134-
printf("after board.matchImagePoints(markerCorners, markerIds, objPoints, imgPoints);\n");
135133
if (objPoints.total() <4ull)// need, at least, 4 corners
136134
return;
137135

138136
solvePnP(objPoints, imgPoints, charucoParameters.cameraMatrix, charucoParameters.distCoeffs, approximatedRvec, approximatedTvec);
139-
printf("after solvePnP\n");
140137

141138
// project chessboard corners
142139
vector<Point2f> allChessboardImgPoints;
143140
projectPoints(board.getChessboardCorners(), approximatedRvec, approximatedTvec, charucoParameters.cameraMatrix,
144141
charucoParameters.distCoeffs, allChessboardImgPoints);
145-
printf("after projectPoints\n");
146142
// calculate maximum window sizes for subpixel refinement. The size is limited by the distance
147143
// to the closes marker corner to avoid erroneous displacements to marker corners
148144
vector<Size> subPixWinSizes =getMaximumSubPixWindowSizes(markerCorners, markerIds, allChessboardImgPoints);
149145
// filter corners outside the image and subpixel-refine charuco corners
150-
printf("before selectAndRefineChessboardCorners\n");
151146
selectAndRefineChessboardCorners(allChessboardImgPoints, image, charucoCorners, charucoIds, subPixWinSizes);
152147
}
153148

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp