Skip to content

Commit 92dccac

Browse files
committed
Merge branch 4.x
2 parents 28bc8d5 + 758c1a9 commit 92dccac

File tree

99 files changed

+3231
-801
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

99 files changed

+3231
-801
lines changed

modules/aruco/CMakeLists.txt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,31 @@
11
set(the_description "ArUco Marker Detection")
22
ocv_define_module(aruco opencv_core opencv_imgproc opencv_3d opencv_calib WRAP python java objc js)
3+
ocv_include_directories(${CMAKE_CURRENT_BINARY_DIR})
4+
5+
ocv_add_testdata(samples/ contrib/aruco
6+
FILES_MATCHING PATTERN "*yml"
7+
)
8+
9+
ocv_add_testdata(tutorials/aruco_detection/images/ contrib/aruco
10+
FILES_MATCHING PATTERN "singlemarkersoriginal.jpg"
11+
)
12+
13+
ocv_add_testdata(tutorials/aruco_board_detection/images/ contrib/aruco
14+
FILES_MATCHING PATTERN "gboriginal.png"
15+
)
16+
17+
ocv_add_testdata(tutorials/charuco_detection/images/ contrib/aruco
18+
FILES_MATCHING PATTERN "choriginal.jpg"
19+
)
20+
21+
ocv_add_testdata(tutorials/charuco_detection/images/ contrib/aruco
22+
FILES_MATCHING PATTERN "chocclusion_original.jpg"
23+
)
24+
25+
ocv_add_testdata(tutorials/charuco_diamond_detection/images/ contrib/aruco
26+
FILES_MATCHING PATTERN "diamondmarkers.png"
27+
)
28+
29+
ocv_add_testdata(tutorials/aruco_calibration/images/ contrib/aruco
30+
FILES_MATCHING REGEX "img_[0-9]+.jpg"
31+
)

modules/aruco/include/opencv2/aruco.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,8 @@ enum CornerRefineMethod{
150150
struct CV_EXPORTS_W DetectorParameters {
151151

152152
DetectorParameters();
153-
154153
CV_WRAP static Ptr<DetectorParameters> create();
154+
CV_WRAP static bool readDetectorParameters(const FileNode& fn, Ptr<DetectorParameters>& params);
155155

156156
CV_PROP_RW int adaptiveThreshWinSizeMin;
157157
CV_PROP_RW int adaptiveThreshWinSizeMax;

modules/aruco/include/opencv2/aruco/dictionary.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,16 @@ class CV_EXPORTS_W Dictionary {
9393
CV_WRAP_AS(create_from) static Ptr<Dictionary> create(int nMarkers, int markerSize,
9494
const Ptr<Dictionary> &baseDictionary, int randomSeed=0);
9595

96+
/**
97+
* @brief Read a new dictionary from FileNode. Format:
98+
* nmarkers: 35
99+
* markersize: 6
100+
* marker_0: "101011111011111001001001101100000000"
101+
* ...
102+
* marker_34: "011111010000111011111110110101100101"
103+
*/
104+
CV_WRAP static bool readDictionary(const cv::FileNode& fn, cv::Ptr<cv::aruco::Dictionary> &dictionary);
105+
96106
/**
97107
* @see getPredefinedDictionary
98108
*/

modules/aruco/misc/pattern_generator/MarkerPrinterGUI.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ def InitCharucoMarkerTab(self):
155155
tk.Button(self.charucoMarkerUIFrame2, text = "Preview", command = self.OnPreviewCharucoMarker).grid(row=1, column=0, sticky = tk.NSEW)
156156
tk.Button(self.charucoMarkerUIFrame2, text = "Save", command = self.OnSaveCharucoMarker).grid(row=1, column=1, sticky = tk.NSEW)
157157

158-
tk.Label(self.charucoMarkerUIFrame2, text="Save opetions:").grid(row=0, column=2, sticky = tk.NSEW)
158+
tk.Label(self.charucoMarkerUIFrame2, text="Save options:").grid(row=0, column=2, sticky = tk.NSEW)
159159
tk.Label(self.charucoMarkerUIFrame2, text="(set 0 as disable)").grid(row=1, column=2, sticky = tk.NSEW)
160160
tk.Label(self.charucoMarkerUIFrame2, text="subSizeX").grid(row=0, column=3, sticky = tk.NSEW)
161161
tk.Label(self.charucoMarkerUIFrame2, text="subSizeY").grid(row=0, column=4, sticky = tk.NSEW)
@@ -279,7 +279,7 @@ def InitArucoGridMarkerTab(self):
279279
tk.Button(self.arucoGridMarkerUIFrame2, text = "Preview", command = self.OnPreviewArucoGridMarker).grid(row=1, column=0, sticky = tk.NSEW)
280280
tk.Button(self.arucoGridMarkerUIFrame2, text = "Save", command = self.OnSaveArucoGridMarker).grid(row=1, column=1, sticky = tk.NSEW)
281281

282-
tk.Label(self.arucoGridMarkerUIFrame2, text="Save opetions:").grid(row=0, column=2, sticky = tk.NSEW)
282+
tk.Label(self.arucoGridMarkerUIFrame2, text="Save options:").grid(row=0, column=2, sticky = tk.NSEW)
283283
tk.Label(self.arucoGridMarkerUIFrame2, text="(set 0 as disable)").grid(row=1, column=2, sticky = tk.NSEW)
284284
tk.Label(self.arucoGridMarkerUIFrame2, text="subSizeX").grid(row=0, column=3, sticky = tk.NSEW)
285285
tk.Label(self.arucoGridMarkerUIFrame2, text="subSizeY").grid(row=0, column=4, sticky = tk.NSEW)
@@ -386,7 +386,7 @@ def InitArucoMarkerTab(self):
386386
tk.Button(self.arucoMarkerUIFrame2, text = "Preview", command = self.OnPreviewArucoMarker).grid(row=0, column=0, sticky = tk.NSEW)
387387
tk.Button(self.arucoMarkerUIFrame2, text = "Save", command = self.OnSaveArucoMarker).grid(row=0, column=1, sticky = tk.NSEW)
388388

389-
tk.Label(self.arucoMarkerUIFrame2, text="Save opetions:").grid(row=0, column=2, sticky = tk.NSEW)
389+
tk.Label(self.arucoMarkerUIFrame2, text="Save options:").grid(row=0, column=2, sticky = tk.NSEW)
390390
tk.Label(self.arucoMarkerUIFrame2, text="(set 0 as disable)").grid(row=1, column=2, sticky = tk.NSEW)
391391
tk.Label(self.arucoMarkerUIFrame2, text="pageBorderX (Unit: Meter)").grid(row=0, column=3, sticky = tk.NSEW)
392392
tk.Label(self.arucoMarkerUIFrame2, text="pageBorderY (Unit: Meter)").grid(row=0, column=4, sticky = tk.NSEW)
@@ -477,7 +477,7 @@ def InitChessMarkerTab(self):
477477
tk.Button(self.chessMarkerUIFrame2, text = "Preview", command = self.OnPreviewChessMarker).grid(row=1, column=0, sticky = tk.NSEW)
478478
tk.Button(self.chessMarkerUIFrame2, text = "Save", command = self.OnSaveChessMarker).grid(row=1, column=1, sticky = tk.NSEW)
479479

480-
tk.Label(self.chessMarkerUIFrame2, text="Save opetions:").grid(row=0, column=2, sticky = tk.NSEW)
480+
tk.Label(self.chessMarkerUIFrame2, text="Save options:").grid(row=0, column=2, sticky = tk.NSEW)
481481
tk.Label(self.chessMarkerUIFrame2, text="(set 0 as disable)").grid(row=1, column=2, sticky = tk.NSEW)
482482
tk.Label(self.chessMarkerUIFrame2, text="subSizeX").grid(row=0, column=3, sticky = tk.NSEW)
483483
tk.Label(self.chessMarkerUIFrame2, text="subSizeY").grid(row=0, column=4, sticky = tk.NSEW)
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include <opencv2/highgui.hpp>
2+
#include <opencv2/aruco.hpp>
3+
#include <opencv2/calib3d.hpp>
4+
#include <ctime>
5+
6+
namespace {
7+
inline static bool readCameraParameters(std::string filename, cv::Mat &camMatrix, cv::Mat &distCoeffs) {
8+
cv::FileStorage fs(filename, cv::FileStorage::READ);
9+
if (!fs.isOpened())
10+
return false;
11+
fs["camera_matrix"] >> camMatrix;
12+
fs["distortion_coefficients"] >> distCoeffs;
13+
return true;
14+
}
15+
16+
inline static bool saveCameraParams(const std::string &filename, cv::Size imageSize, float aspectRatio, int flags,
17+
const cv::Mat &cameraMatrix, const cv::Mat &distCoeffs, double totalAvgErr) {
18+
cv::FileStorage fs(filename, cv::FileStorage::WRITE);
19+
if (!fs.isOpened())
20+
return false;
21+
22+
time_t tt;
23+
time(&tt);
24+
struct tm *t2 = localtime(&tt);
25+
char buf[1024];
26+
strftime(buf, sizeof(buf) - 1, "%c", t2);
27+
28+
fs << "calibration_time" << buf;
29+
fs << "image_width" << imageSize.width;
30+
fs << "image_height" << imageSize.height;
31+
32+
if (flags & cv::CALIB_FIX_ASPECT_RATIO) fs << "aspectRatio" << aspectRatio;
33+
34+
if (flags != 0) {
35+
sprintf(buf, "flags: %s%s%s%s",
36+
flags & cv::CALIB_USE_INTRINSIC_GUESS ? "+use_intrinsic_guess" : "",
37+
flags & cv::CALIB_FIX_ASPECT_RATIO ? "+fix_aspectRatio" : "",
38+
flags & cv::CALIB_FIX_PRINCIPAL_POINT ? "+fix_principal_point" : "",
39+
flags & cv::CALIB_ZERO_TANGENT_DIST ? "+zero_tangent_dist" : "");
40+
}
41+
fs << "flags" << flags;
42+
fs << "camera_matrix" << cameraMatrix;
43+
fs << "distortion_coefficients" << distCoeffs;
44+
fs << "avg_reprojection_error" << totalAvgErr;
45+
return true;
46+
}
47+
48+
}

modules/aruco/samples/calibrate_camera.cpp

Lines changed: 22 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ the use of this software, even if advised of the possibility of such damage.
4545
#include <vector>
4646
#include <iostream>
4747
#include <ctime>
48+
#include "aruco_samples_utility.hpp"
4849

4950
using namespace std;
5051
using namespace cv;
@@ -65,6 +66,7 @@ const char* keys =
6566
"DICT_4X4_1000=3, DICT_5X5_50=4, DICT_5X5_100=5, DICT_5X5_250=6, DICT_5X5_1000=7, "
6667
"DICT_6X6_50=8, DICT_6X6_100=9, DICT_6X6_250=10, DICT_6X6_1000=11, DICT_7X7_50=12,"
6768
"DICT_7X7_100=13, DICT_7X7_250=14, DICT_7X7_1000=15, DICT_ARUCO_ORIGINAL = 16}"
69+
"{cd | | Input file with custom dictionary }"
6870
"{@outfile |<none> | Output file with calibrated camera parameters }"
6971
"{v | | Input from video file, if ommited, input comes from camera }"
7072
"{ci | 0 | Camera id if input doesnt come from video (-v) }"
@@ -75,80 +77,7 @@ const char* keys =
7577
"{pc | false | Fix the principal point at the center }";
7678
}
7779

78-
/**
79-
*/
80-
static bool readDetectorParameters(string filename, Ptr<aruco::DetectorParameters> &params) {
81-
FileStorage fs(filename, FileStorage::READ);
82-
if(!fs.isOpened())
83-
return false;
84-
fs["adaptiveThreshWinSizeMin"] >> params->adaptiveThreshWinSizeMin;
85-
fs["adaptiveThreshWinSizeMax"] >> params->adaptiveThreshWinSizeMax;
86-
fs["adaptiveThreshWinSizeStep"] >> params->adaptiveThreshWinSizeStep;
87-
fs["adaptiveThreshConstant"] >> params->adaptiveThreshConstant;
88-
fs["minMarkerPerimeterRate"] >> params->minMarkerPerimeterRate;
89-
fs["maxMarkerPerimeterRate"] >> params->maxMarkerPerimeterRate;
90-
fs["polygonalApproxAccuracyRate"] >> params->polygonalApproxAccuracyRate;
91-
fs["minCornerDistanceRate"] >> params->minCornerDistanceRate;
92-
fs["minDistanceToBorder"] >> params->minDistanceToBorder;
93-
fs["minMarkerDistanceRate"] >> params->minMarkerDistanceRate;
94-
fs["cornerRefinementMethod"] >> params->cornerRefinementMethod;
95-
fs["cornerRefinementWinSize"] >> params->cornerRefinementWinSize;
96-
fs["cornerRefinementMaxIterations"] >> params->cornerRefinementMaxIterations;
97-
fs["cornerRefinementMinAccuracy"] >> params->cornerRefinementMinAccuracy;
98-
fs["markerBorderBits"] >> params->markerBorderBits;
99-
fs["perspectiveRemovePixelPerCell"] >> params->perspectiveRemovePixelPerCell;
100-
fs["perspectiveRemoveIgnoredMarginPerCell"] >> params->perspectiveRemoveIgnoredMarginPerCell;
101-
fs["maxErroneousBitsInBorderRate"] >> params->maxErroneousBitsInBorderRate;
102-
fs["minOtsuStdDev"] >> params->minOtsuStdDev;
103-
fs["errorCorrectionRate"] >> params->errorCorrectionRate;
104-
return true;
105-
}
106-
107-
108-
109-
/**
110-
*/
111-
static bool saveCameraParams(const string &filename, Size imageSize, float aspectRatio, int flags,
112-
const Mat &cameraMatrix, const Mat &distCoeffs, double totalAvgErr) {
113-
FileStorage fs(filename, FileStorage::WRITE);
114-
if(!fs.isOpened())
115-
return false;
116-
117-
time_t tt;
118-
time(&tt);
119-
struct tm *t2 = localtime(&tt);
120-
char buf[1024];
121-
strftime(buf, sizeof(buf) - 1, "%c", t2);
122-
123-
fs << "calibration_time" << buf;
124-
125-
fs << "image_width" << imageSize.width;
126-
fs << "image_height" << imageSize.height;
127-
128-
if(flags & CALIB_FIX_ASPECT_RATIO) fs << "aspectRatio" << aspectRatio;
129-
130-
if(flags != 0) {
131-
sprintf(buf, "flags: %s%s%s%s",
132-
flags & CALIB_USE_INTRINSIC_GUESS ? "+use_intrinsic_guess" : "",
133-
flags & CALIB_FIX_ASPECT_RATIO ? "+fix_aspectRatio" : "",
134-
flags & CALIB_FIX_PRINCIPAL_POINT ? "+fix_principal_point" : "",
135-
flags & CALIB_ZERO_TANGENT_DIST ? "+zero_tangent_dist" : "");
136-
}
137-
138-
fs << "flags" << flags;
139-
140-
fs << "camera_matrix" << cameraMatrix;
141-
fs << "distortion_coefficients" << distCoeffs;
14280

143-
fs << "avg_reprojection_error" << totalAvgErr;
144-
145-
return true;
146-
}
147-
148-
149-
150-
/**
151-
*/
15281
int main(int argc, char *argv[]) {
15382
CommandLineParser parser(argc, argv, keys);
15483
parser.about(about);
@@ -162,7 +91,6 @@ int main(int argc, char *argv[]) {
16291
int markersY = parser.get<int>("h");
16392
float markerLength = parser.get<float>("l");
16493
float markerSeparation = parser.get<float>("s");
165-
int dictionaryId = parser.get<int>("d");
16694
string outputFile = parser.get<String>(0);
16795

16896
int calibrationFlags = 0;
@@ -174,9 +102,10 @@ int main(int argc, char *argv[]) {
174102
if(parser.get<bool>("zt")) calibrationFlags |= CALIB_ZERO_TANGENT_DIST;
175103
if(parser.get<bool>("pc")) calibrationFlags |= CALIB_FIX_PRINCIPAL_POINT;
176104

177-
Ptr<aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create();
105+
Ptr<aruco::DetectorParameters> detectorParams;
178106
if(parser.has("dp")) {
179-
bool readOk = readDetectorParameters(parser.get<string>("dp"), detectorParams);
107+
FileStorage fs(parser.get<string>("dp"), FileStorage::READ);
108+
bool readOk = aruco::DetectorParameters::readDetectorParameters(fs.root(), detectorParams);
180109
if(!readOk) {
181110
cerr << "Invalid detector parameters file" << endl;
182111
return 0;
@@ -206,8 +135,23 @@ int main(int argc, char *argv[]) {
206135
waitTime = 10;
207136
}
208137

209-
Ptr<aruco::Dictionary> dictionary =
210-
aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));
138+
Ptr<aruco::Dictionary> dictionary;
139+
if (parser.has("d")) {
140+
int dictionaryId = parser.get<int>("d");
141+
dictionary = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));
142+
}
143+
else if (parser.has("cd")) {
144+
FileStorage fs(parser.get<std::string>("cd"), FileStorage::READ);
145+
bool readOk = aruco::Dictionary::readDictionary(fs.root(), dictionary);
146+
if(!readOk) {
147+
cerr << "Invalid dictionary file" << endl;
148+
return 0;
149+
}
150+
}
151+
else {
152+
cerr << "Dictionary not specified" << endl;
153+
return 0;
154+
}
211155

212156
// create board object
213157
Ptr<aruco::GridBoard> gridboard =

0 commit comments

Comments
 (0)