Я реализовал модуль ArUco в opencv3.0, он прекрасно работает при обнаружении маркеров aruco.
Для обнаружения маркера aruco я использую это изображение
Но возможно ли обнаружить нормальные маркеры, подобные изображенному ниже, с помощью модуля aruco?
Вот некоторые фрагменты моего кода:
aruco::DetectorParameters detectorParams;
if (parser.has("dp")) {
bool readOk = readDetectorParameters(parser.get<string>("dp"), detectorParams);
if (!readOk) {
cerr << "Invalid detector parameters file" << endl;
return 0;
}
}
aruco::Dictionary dictionary =
aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));
Mat camMatrix, distCoeffs;
if (estimatePose) {
bool readOk = readCameraParameters(parser.get<string>("c"), camMatrix, distCoeffs);
if (!readOk) {
cerr << "Invalid camera file" << endl;
return 0;
}
}
// detect markers and estimate pose
aruco::detectMarkers(image, dictionary, corners, ids, detectorParams, rejected);
if (estimatePose && ids.size() > 0)
aruco::estimatePoseSingleMarkers(corners, markerLength, camMatrix, distCoeffs, rvecs,
tvecs);
// draw results
image.copyTo(imageCopy);
if (ids.size() > 0) {
aruco::drawDetectedMarkers(imageCopy, corners, ids);
if (estimatePose) {
for (unsigned int i = 0; i < ids.size(); i++)
aruco::drawAxis(imageCopy, camMatrix, distCoeffs, rvecs[i], tvecs[i],
markerLength * 0.5f);
}
}
if (showRejected && rejected.size() > 0)
aruco::drawDetectedMarkers(imageCopy, rejected, noArray(), Scalar(100, 0, 255));
imshow("out", imageCopy);
char key = (char)waitKey(waitTime);
if (key == 27) break;
}
Как я могу сделать этот код для обнаружения нормальных маркеров?
Should I use a predefined dictionary or generate my own dictionary?
В общем, проще использовать один из предопределенных словарей. Однако, если вам нужен больший словарь (с точки зрения количества маркеров или количества бит), вы должны создать свой собственный словарь. Создание словаря также полезно, если вы хотите максимизировать расстояние между маркерами, чтобы добиться лучшей коррекции ошибок на этапе идентификации.
Я думаю, что это именно ваш случай, вы хотите использовать то, чего нет в стандартном словаре ArUco. Словарь это просто учебный класс, вам нужно создать его и заполнить его правильными данными.
Других решений пока нет …