Skip to content

Commit 40f1ac5

Browse files
szk1509alalek
authored andcommitted
Merge pull request #973 from szk1509:master
new corner refinement method :: using the contour-lines (#973) * doCornerRefinement to CornerRefinementMethod :: detected contours points are used to detect the corners * some little corrections * samples edited * documented :) * tabs corrected * Docu corrections * refinement for all candidates * refinement for all candidates :: copy paste error corrected * comment
1 parent 4ed8c5e commit 40f1ac5

File tree

9 files changed

+232
-23
lines changed

9 files changed

+232
-23
lines changed

modules/aruco/include/opencv2/aruco.hpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,11 @@ namespace aruco {
7676
//! @addtogroup aruco
7777
//! @{
7878

79-
79+
enum CornerRefineMethod{
80+
CORNER_REFINE_NONE, // default corners
81+
CORNER_REFINE_SUBPIX, // refine the corners using subpix
82+
CORNER_REFINE_CONTOUR // refine the corners using the contour-points
83+
};
8084

8185
/**
8286
* @brief Parameters for the detectMarker process:
@@ -100,7 +104,8 @@ namespace aruco {
100104
* - minMarkerDistanceRate: minimum mean distance beetween two marker corners to be considered
101105
* similar, so that the smaller one is removed. The rate is relative to the smaller perimeter
102106
* of the two markers (default 0.05).
103-
* - doCornerRefinement: do subpixel refinement or not
107+
* - cornerRefinementMethod: corner refinement method. (CORNER_REFINE_NONE, no refinement.
108+
* CORNER_REFINE_SUBPIX, do subpixel refinement. CORNER_REFINE_CONTOUR use contour-Points)
104109
* - cornerRefinementWinSize: window size for the corner refinement process (in pixels) (default 5).
105110
* - cornerRefinementMaxIterations: maximum number of iterations for stop criteria of the corner
106111
* refinement process (default 30).
@@ -137,7 +142,7 @@ struct CV_EXPORTS_W DetectorParameters {
137142
CV_PROP_RW double minCornerDistanceRate;
138143
CV_PROP_RW int minDistanceToBorder;
139144
CV_PROP_RW double minMarkerDistanceRate;
140-
CV_PROP_RW bool doCornerRefinement;
145+
CV_PROP_RW int cornerRefinementMethod;
141146
CV_PROP_RW int cornerRefinementWinSize;
142147
CV_PROP_RW int cornerRefinementMaxIterations;
143148
CV_PROP_RW double cornerRefinementMinAccuracy;
@@ -165,6 +170,10 @@ struct CV_EXPORTS_W DetectorParameters {
165170
* @param parameters marker detection parameters
166171
* @param rejectedImgPoints contains the imgPoints of those squares whose inner code has not a
167172
* correct codification. Useful for debugging purposes.
173+
* @param cameraMatrix optional input 3x3 floating-point camera matrix
174+
* \f$A = \vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{1}\f$
175+
* @param distCoeff optional vector of distortion coefficients
176+
* \f$(k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6],[s_1, s_2, s_3, s_4]])\f$ of 4, 5, 8 or 12 elements
168177
*
169178
* Performs marker detection in the input image. Only markers included in the specific dictionary
170179
* are searched. For each detected marker, it returns the 2D position of its corner in the image
@@ -175,7 +184,7 @@ struct CV_EXPORTS_W DetectorParameters {
175184
*/
176185
CV_EXPORTS_W void detectMarkers(InputArray image, const Ptr<Dictionary> &dictionary, OutputArrayOfArrays corners,
177186
OutputArray ids, const Ptr<DetectorParameters> &parameters = DetectorParameters::create(),
178-
OutputArrayOfArrays rejectedImgPoints = noArray());
187+
OutputArrayOfArrays rejectedImgPoints = noArray(), InputArray cameraMatrix= noArray(), InputArray distCoeff= noArray());
179188

180189

181190

@@ -196,6 +205,7 @@ CV_EXPORTS_W void detectMarkers(InputArray image, const Ptr<Dictionary> &diction
196205
* Each element in rvecs corresponds to the specific marker in imgPoints.
197206
* @param tvecs array of output translation vectors (e.g. std::vector<cv::Vec3d>).
198207
* Each element in tvecs corresponds to the specific marker in imgPoints.
208+
* @param _objPoints array of object points of all the marker corners
199209
*
200210
* This function receives the detected markers and returns their pose estimation respect to
201211
* the camera individually. So for each marker, one rotation and translation vector is returned.
@@ -209,7 +219,7 @@ CV_EXPORTS_W void detectMarkers(InputArray image, const Ptr<Dictionary> &diction
209219
*/
210220
CV_EXPORTS_W void estimatePoseSingleMarkers(InputArrayOfArrays corners, float markerLength,
211221
InputArray cameraMatrix, InputArray distCoeffs,
212-
OutputArray rvecs, OutputArray tvecs);
222+
OutputArray rvecs, OutputArray tvecs, OutputArray _objPoints = noArray());
213223

214224

215225

modules/aruco/samples/calibrate_camera.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ static bool readDetectorParameters(string filename, Ptr<aruco::DetectorParameter
9090
fs["minCornerDistanceRate"] >> params->minCornerDistanceRate;
9191
fs["minDistanceToBorder"] >> params->minDistanceToBorder;
9292
fs["minMarkerDistanceRate"] >> params->minMarkerDistanceRate;
93-
fs["doCornerRefinement"] >> params->doCornerRefinement;
93+
fs["cornerRefinementMethod"] >> params->cornerRefinementMethod;
9494
fs["cornerRefinementWinSize"] >> params->cornerRefinementWinSize;
9595
fs["cornerRefinementMaxIterations"] >> params->cornerRefinementMaxIterations;
9696
fs["cornerRefinementMinAccuracy"] >> params->cornerRefinementMinAccuracy;

modules/aruco/samples/calibrate_camera_charuco.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ static bool readDetectorParameters(string filename, Ptr<aruco::DetectorParameter
9090
fs["minCornerDistanceRate"] >> params->minCornerDistanceRate;
9191
fs["minDistanceToBorder"] >> params->minDistanceToBorder;
9292
fs["minMarkerDistanceRate"] >> params->minMarkerDistanceRate;
93-
fs["doCornerRefinement"] >> params->doCornerRefinement;
93+
fs["cornerRefinementMethod"] >> params->cornerRefinementMethod;
9494
fs["cornerRefinementWinSize"] >> params->cornerRefinementWinSize;
9595
fs["cornerRefinementMaxIterations"] >> params->cornerRefinementMaxIterations;
9696
fs["cornerRefinementMinAccuracy"] >> params->cornerRefinementMinAccuracy;

modules/aruco/samples/detect_board.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ static bool readDetectorParameters(string filename, Ptr<aruco::DetectorParameter
9393
fs["minCornerDistanceRate"] >> params->minCornerDistanceRate;
9494
fs["minDistanceToBorder"] >> params->minDistanceToBorder;
9595
fs["minMarkerDistanceRate"] >> params->minMarkerDistanceRate;
96-
fs["doCornerRefinement"] >> params->doCornerRefinement;
96+
fs["cornerRefinementMethod"] >> params->cornerRefinementMethod;
9797
fs["cornerRefinementWinSize"] >> params->cornerRefinementWinSize;
9898
fs["cornerRefinementMaxIterations"] >> params->cornerRefinementMaxIterations;
9999
fs["cornerRefinementMinAccuracy"] >> params->cornerRefinementMinAccuracy;
@@ -145,7 +145,7 @@ int main(int argc, char *argv[]) {
145145
return 0;
146146
}
147147
}
148-
detectorParams->doCornerRefinement = true; // do corner refinement in markers
148+
detectorParams->cornerRefinementMethod = aruco::CORNER_REFINE_SUBPIX; // do corner refinement in markers
149149

150150
String video;
151151
if(parser.has("v")) {

modules/aruco/samples/detect_board_charuco.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ static bool readDetectorParameters(string filename, Ptr<aruco::DetectorParameter
9393
fs["minCornerDistanceRate"] >> params->minCornerDistanceRate;
9494
fs["minDistanceToBorder"] >> params->minDistanceToBorder;
9595
fs["minMarkerDistanceRate"] >> params->minMarkerDistanceRate;
96-
fs["doCornerRefinement"] >> params->doCornerRefinement;
96+
fs["cornerRefinementMethod"] >> params->cornerRefinementMethod;
9797
fs["cornerRefinementWinSize"] >> params->cornerRefinementWinSize;
9898
fs["cornerRefinementMaxIterations"] >> params->cornerRefinementMaxIterations;
9999
fs["cornerRefinementMinAccuracy"] >> params->cornerRefinementMinAccuracy;

modules/aruco/samples/detect_diamonds.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ static bool readDetectorParameters(string filename, Ptr<aruco::DetectorParameter
9494
fs["minCornerDistanceRate"] >> params->minCornerDistanceRate;
9595
fs["minDistanceToBorder"] >> params->minDistanceToBorder;
9696
fs["minMarkerDistanceRate"] >> params->minMarkerDistanceRate;
97-
fs["doCornerRefinement"] >> params->doCornerRefinement;
97+
fs["cornerRefinementMethod"] >> params->cornerRefinementMethod;
9898
fs["cornerRefinementWinSize"] >> params->cornerRefinementWinSize;
9999
fs["cornerRefinementMaxIterations"] >> params->cornerRefinementMaxIterations;
100100
fs["cornerRefinementMinAccuracy"] >> params->cornerRefinementMinAccuracy;

modules/aruco/samples/detect_markers.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ static bool readDetectorParameters(string filename, Ptr<aruco::DetectorParameter
8888
fs["minCornerDistanceRate"] >> params->minCornerDistanceRate;
8989
fs["minDistanceToBorder"] >> params->minDistanceToBorder;
9090
fs["minMarkerDistanceRate"] >> params->minMarkerDistanceRate;
91-
fs["doCornerRefinement"] >> params->doCornerRefinement;
91+
fs["cornerRefinementMethod"] >> params->cornerRefinementMethod;
9292
fs["cornerRefinementWinSize"] >> params->cornerRefinementWinSize;
9393
fs["cornerRefinementMaxIterations"] >> params->cornerRefinementMaxIterations;
9494
fs["cornerRefinementMinAccuracy"] >> params->cornerRefinementMinAccuracy;
@@ -127,7 +127,7 @@ int main(int argc, char *argv[]) {
127127
return 0;
128128
}
129129
}
130-
detectorParams->doCornerRefinement = true; // do corner refinement in markers
130+
detectorParams->cornerRefinementMethod = aruco::CORNER_REFINE_SUBPIX; // do corner refinement in markers
131131

132132
int camId = parser.get<int>("ci");
133133

0 commit comments

Comments
 (0)