diff --git a/CMakeLists.txt b/CMakeLists.txt index 70f8404..c63445b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -294,6 +294,8 @@ target_link_libraries(EvalModelOnCocoVal sv_world) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/samples/calib) add_executable(CameraCalibrarion samples/calib/calibrate_camera_charuco.cpp) target_link_libraries(CameraCalibrarion ${OpenCV_LIBS} sv_world) +add_executable(CreateMarker samples/calib/create_marker.cpp) +target_link_libraries(CreateMarker ${OpenCV_LIBS}) message(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}") if (NOT DEFINED SV_INSTALL_PREFIX) diff --git a/algorithm/sv_algorithm_base.cpp b/algorithm/sv_algorithm_base.cpp index f99142f..e059fe7 100644 --- a/algorithm/sv_algorithm_base.cpp +++ b/algorithm/sv_algorithm_base.cpp @@ -94,7 +94,8 @@ void ArucoDetector::_load() // _detector_params = aruco::DetectorParameters::create(); _detector_params = new aruco::DetectorParameters; for (auto i : aruco_params_value) { - if ("_dictionary_id" == std::string(i->key)) { + if ("dictionaryId" == std::string(i->key)) { + // std::cout << "dictionary_id (old, new): " << _dictionary_id << ", " << i->value.toNumber() << std::endl; _dictionary_id = i->value.toNumber(); } else if ("adaptiveThreshConstant" == std::string(i->key)) { diff --git a/samples/calib/create_marker.cpp b/samples/calib/create_marker.cpp new file mode 100644 index 0000000..8e73a43 --- /dev/null +++ b/samples/calib/create_marker.cpp @@ -0,0 +1,255 @@ +#include +#include +#include +#include "aruco_samples_utility.hpp" + +using namespace cv; + +namespace { +const char* about = "Create an ArUco marker image"; + +//! [aruco_create_markers_keys] +const char* keys = + "{@outfile | | Output image }" + "{d | | dictionary: DICT_4X4_50=0, DICT_4X4_100=1, DICT_4X4_250=2," + "DICT_4X4_1000=3, DICT_5X5_50=4, DICT_5X5_100=5, DICT_5X5_250=6, DICT_5X5_1000=7, " + "DICT_6X6_50=8, DICT_6X6_100=9, DICT_6X6_250=10, DICT_6X6_1000=11, DICT_7X7_50=12," + "DICT_7X7_100=13, DICT_7X7_250=14, DICT_7X7_1000=15, DICT_ARUCO_ORIGINAL = 16}" + "{cd | | Input file with custom dictionary }" + "{id | | Marker id in the dictionary }" + "{ms | 200 | Marker size in pixels }" + "{bs | 50 | Border size in pixels }" + "{lp | 50 | Landing Pad Unit in pixels }" + "{bb | 1 | Number of bits in marker borders }" + "{si | false | show generated image }"; +} +//! [aruco_create_markers_keys] + + +Mat create_marker_with_borders(aruco::Dictionary& dictionary, int markerId, int markerSize, int borderBits, int borderSize) { + Mat tmpImg; + aruco::generateImageMarker(dictionary, markerId, markerSize, tmpImg, borderBits); + Mat tmpImgCopy = Mat::ones(borderSize * 2 + markerSize, borderSize * 2 + markerSize, CV_8UC1) * 255; + tmpImg.copyTo(tmpImgCopy(Rect(borderSize, borderSize, markerSize, markerSize))); + tmpImg = tmpImgCopy; + return tmpImg; +} + + +int main(int argc, char *argv[]) { + CommandLineParser parser(argc, argv, keys); + parser.about(about); + + if(argc < 4) { + parser.printMessage(); + return 0; + } + + int markerId = parser.get("id"); + int borderBits = parser.get("bb"); + int markerSize = parser.get("ms"); + bool showImage = parser.get("si"); + + int borderSize = 0; + if (parser.has("bs")) { + borderSize = parser.get("bs"); + } + int landingPadUnit = 0; + if (parser.has("lp")) { + landingPadUnit = parser.get("lp"); + borderSize = landingPadUnit; + borderBits = 1; + markerSize = landingPadUnit * 4; + } + + String out = parser.get(0); + + if(!parser.check()) { + parser.printErrors(); + return 0; + } + + aruco::Dictionary dictionary = aruco::getPredefinedDictionary(0); + if (parser.has("d")) { + int dictionaryId = parser.get("d"); + dictionary = aruco::getPredefinedDictionary(aruco::PredefinedDictionaryType(dictionaryId)); + } + else if (parser.has("cd")) { + FileStorage fs(parser.get("cd"), FileStorage::READ); + bool readOk = dictionary.aruco::Dictionary::readDictionary(fs.root()); + if(!readOk) { + std::cerr << "Invalid dictionary file" << std::endl; + return 0; + } + } + else { + std::cerr << "Dictionary not specified" << std::endl; + return 0; + } + + Mat markerImg; + aruco::generateImageMarker(dictionary, markerId, markerSize, markerImg, borderBits); + if (borderSize > 0) { + Mat markerImgCopy = Mat::ones(borderSize * 2 + markerSize, borderSize * 2 + markerSize, CV_8UC1) * 255; + markerImg.copyTo(markerImgCopy(Rect(borderSize, borderSize, markerSize, markerSize))); + markerImg = markerImgCopy; + } + + if (landingPadUnit > 0) { + Mat markerImgBIG = Mat::ones(landingPadUnit * 62, landingPadUnit * 62, CV_8UC1) * 255; + markerId = 0; + markerSize = landingPadUnit * 4; + borderSize = landingPadUnit; + int newSize = markerSize + borderSize * 2; + + for (int i=0; i<3; i++) { + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(i * landingPadUnit * 5, 0, newSize, newSize))); + } + for (int i=0; i<5; i++) { + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 18 + i * landingPadUnit * 5, 0, newSize, newSize))); + } + for (int i=0; i<3; i++) { + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 46 + i * landingPadUnit * 5, 0, newSize, newSize))); + } + + for (int i=0; i<2; i++) { + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 56, landingPadUnit * 5 + i * landingPadUnit * 5, newSize, newSize))); + } + for (int i=0; i<5; i++) { + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 56, landingPadUnit * 18 + i * landingPadUnit * 5, newSize, newSize))); + } + for (int i=0; i<3; i++) { + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 56, landingPadUnit * 46 + i * landingPadUnit * 5, newSize, newSize))); + } + + for (int i=0; i<2; i++) { + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 51 - i * landingPadUnit * 5, landingPadUnit * 56, newSize, newSize))); + } + for (int i=0; i<5; i++) { + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 38 - i * landingPadUnit * 5, landingPadUnit * 56, newSize, newSize))); + } + for (int i=0; i<3; i++) { + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 10 - i * landingPadUnit * 5, landingPadUnit * 56, newSize, newSize))); + } + + for (int i=0; i<2; i++) { + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(0, landingPadUnit * 51 - i * landingPadUnit * 5, newSize, newSize))); + } + for (int i=0; i<5; i++) { + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(0, landingPadUnit * 38 - i * landingPadUnit * 5, newSize, newSize))); + } + for (int i=0; i<2; i++) { + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(0, landingPadUnit * 10 - i * landingPadUnit * 5, newSize, newSize))); + } + + + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 28, landingPadUnit * 28, newSize, newSize))); + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 28, landingPadUnit * 23, newSize, newSize))); + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 33, landingPadUnit * 28, newSize, newSize))); + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 28, landingPadUnit * 33, newSize, newSize))); + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 23, landingPadUnit * 28, newSize, newSize))); + + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 28, landingPadUnit * 18, newSize, newSize))); + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 38, landingPadUnit * 28, newSize, newSize))); + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 28, landingPadUnit * 38, newSize, newSize))); + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 18, landingPadUnit * 28, newSize, newSize))); + + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 28, landingPadUnit * 5, newSize, newSize))); + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 51, landingPadUnit * 28, newSize, newSize))); + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 28, landingPadUnit * 51, newSize, newSize))); + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 5, landingPadUnit * 28, newSize, newSize))); + + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 28, landingPadUnit * 10, newSize, newSize))); + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 46, landingPadUnit * 28, newSize, newSize))); + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 28, landingPadUnit * 46, newSize, newSize))); + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 10, landingPadUnit * 28, newSize, newSize))); + + markerId = 90; + markerSize = landingPadUnit * 4 * 4; + borderSize = landingPadUnit * 4; + newSize = markerSize + borderSize * 2; + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 5, landingPadUnit * 5, newSize, newSize))); + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 5 + newSize + landingPadUnit * 4, landingPadUnit * 5, newSize, newSize))); + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 5, landingPadUnit * 5 + newSize + landingPadUnit * 4, newSize, newSize))); + markerId += 1; + markerImg = create_marker_with_borders(dictionary, markerId, markerSize, borderBits, borderSize); + markerImg.copyTo(markerImgBIG(Rect(landingPadUnit * 5 + newSize + landingPadUnit * 4, landingPadUnit * 5 + newSize + landingPadUnit * 4, newSize, newSize))); + + markerImg = Mat::ones(landingPadUnit * 64, landingPadUnit * 64, CV_8UC1) * 255; + markerImgBIG.copyTo(markerImg(Rect(landingPadUnit, landingPadUnit, landingPadUnit * 62, landingPadUnit * 62))); + } + + if(showImage) { + imshow("marker", markerImg); + waitKey(0); + } + + imwrite(out, markerImg); + + return 0; +} +