41 const std::string
LOGNAME =
"handeye_aruco_target";
44 const std::map<std::string, cv::aruco::PREDEFINED_DICTIONARY_NAME>
ARUCO_DICTIONARY = {
45 {
"DICT_4X4_250", cv::aruco::DICT_4X4_250 },
46 {
"DICT_5X5_250", cv::aruco::DICT_5X5_250 },
47 {
"DICT_6X6_250", cv::aruco::DICT_6X6_250 },
48 {
"DICT_7X7_250", cv::aruco::DICT_7X7_250 },
49 {
"DICT_ARUCO_ORIGINAL", cv::aruco::DICT_ARUCO_ORIGINAL }
54 parameters_.push_back(Parameter(
"markers, X", Parameter::ParameterType::Int, 3));
55 parameters_.push_back(Parameter(
"markers, Y", Parameter::ParameterType::Int, 4));
56 parameters_.push_back(Parameter(
"marker size (px)", Parameter::ParameterType::Int, 200));
57 parameters_.push_back(Parameter(
"marker separation (px)", Parameter::ParameterType::Int, 20));
58 parameters_.push_back(Parameter(
"marker border (bits)", Parameter::ParameterType::Int, 1));
59 std::vector<std::string> dictionaries;
62 dictionaries.push_back(kv.first);
64 parameters_.push_back(Parameter(
"ArUco dictionary", Parameter::ParameterType::Enum, dictionaries, 1));
65 parameters_.push_back(Parameter(
"measured marker size (m)", Parameter::ParameterType::Float, 0.2));
66 parameters_.push_back(Parameter(
"measured separation (m)", Parameter::ParameterType::Float, 0.02));
78 std::string dictionary_id;
79 float marker_measured_size;
80 float marker_measured_separation;
86 getParameter(
"measured marker size (m)", marker_measured_size) &&
87 getParameter(
"measured separation (m)", marker_measured_separation) &&
95 int border_bits,
const std::string& dictionary_id)
97 if (markers_x <= 0 || markers_y <= 0 || marker_size <= 0 || separation <= 0 || border_bits <= 0 ||
101 "Invalid target intrinsic params.\n"
102 <<
"markers_x_ " << std::to_string(markers_x) <<
"\n"
103 <<
"markers_y_ " << std::to_string(markers_y) <<
"\n"
104 <<
"marker_size " << std::to_string(marker_size) <<
"\n"
105 <<
"separation " << std::to_string(separation) <<
"\n"
106 <<
"border_bits " << std::to_string(border_bits) <<
"\n"
107 <<
"dictionary_id " << dictionary_id <<
"\n");
126 if (marker_measured_size <= 0 || marker_measured_separation <= 0)
129 marker_measured_size, marker_measured_separation);
137 "Set target real dimensions: \n"
138 <<
"marker_measured_size " << std::to_string(marker_measured_size) <<
"\n"
139 <<
"marker_measured_separation " << std::to_string(marker_measured_separation)
153 cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(
dictionary_id_);
154 cv::Ptr<cv::aruco::GridBoard> board =
160 catch (
const cv::Exception& e)
171 std::lock_guard<std::mutex> base_lock(
base_mutex_);
176 cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(
dictionary_id_);
177 cv::Ptr<cv::aruco::GridBoard> board =
180 cv::Ptr<cv::aruco::DetectorParameters> params_ptr(
new cv::aruco::DetectorParameters());
181 #if CV_MAJOR_VERSION == 3 && CV_MINOR_VERSION == 2
182 params_ptr->doCornerRefinement =
true;
184 params_ptr->cornerRefinementMethod = cv::aruco::CORNER_REFINE_NONE;
187 std::vector<int> marker_ids;
188 std::vector<std::vector<cv::Point2f>> marker_corners;
189 cv::aruco::detectMarkers(image, dictionary, marker_corners, marker_ids, params_ptr);
190 if (marker_ids.empty())
197 std::vector<std::vector<cv::Point2f>> rejected_corners;
198 cv::aruco::refineDetectedMarkers(image, board, marker_corners, marker_ids, rejected_corners,
camera_matrix_,
221 cv::cvtColor(image, image_rgb, cv::COLOR_GRAY2RGB);
222 cv::aruco::drawDetectedMarkers(image_rgb, marker_corners);
226 catch (
const cv::Exception& e)