1
0
mirror of https://github.com/opencv/opencv_contrib.git synced 2025-10-19 19:44:14 +08:00

Merge pull request #386 from paroj:arucodictapi

This commit is contained in:
Alexander Alekhin
2015-10-05 16:41:45 +00:00
3 changed files with 36 additions and 43 deletions

View File

@@ -51,6 +51,12 @@ namespace aruco {
/** /**
* @brief Dictionary/Set of markers. It contains the inner codification * @brief Dictionary/Set of markers. It contains the inner codification
* *
* bytesList contains the marker codewords where
* - bytesList.rows is the dictionary size
* - each marker is encoded using `nbytes = ceil(markerSize*markerSize/8.)`
* - each row contains all 4 rotations of the marker, so its length is `4*nbytes`
*
* `bytesList.ptr(i)[k*nbytes + j]` is then the j-th byte of i-th marker, in its k-th rotation.
*/ */
class CV_EXPORTS Dictionary { class CV_EXPORTS Dictionary {
@@ -62,8 +68,7 @@ class CV_EXPORTS Dictionary {
/** /**
*/ */
Dictionary(const unsigned char *bytes = 0, int _markerSize = 0, int dictsize = 0, Dictionary(const Mat &_bytesList = Mat(), int _markerSize = 0, int _maxcorr = 0);
int _maxcorr = 0);

View File

@@ -38,9 +38,9 @@ the use of this software, even if advised of the possibility of such damage.
#include "precomp.hpp" #include "precomp.hpp"
#include "opencv2/aruco/dictionary.hpp" #include "opencv2/aruco/dictionary.hpp"
#include "predefined_dictionaries.cpp"
#include <opencv2/core.hpp> #include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp> #include <opencv2/imgproc.hpp>
#include "predefined_dictionaries.hpp"
namespace cv { namespace cv {
@@ -50,16 +50,10 @@ using namespace std;
/** /**
*/ */
Dictionary::Dictionary(const unsigned char *bytes, int _markerSize, int dictsize, int _maxcorr) { Dictionary::Dictionary(const Mat &_bytesList, int _markerSize, int _maxcorr) {
markerSize = _markerSize; markerSize = _markerSize;
maxCorrectionBits = _maxcorr; maxCorrectionBits = _maxcorr;
int nbytes = (markerSize * markerSize) / 8; bytesList = _bytesList;
if((markerSize * markerSize) % 8 != 0) nbytes++;
// save bytes in internal format
// bytesList.ptr(i)[k*nbytes + j] is j-th byte of i-th marker, in its k-th rotation
bytesList = Mat(dictsize, nbytes, CV_8UC4);
memcpy(bytesList.data, bytes, dictsize*nbytes*4);
} }
@@ -102,10 +96,7 @@ bool Dictionary::identify(const Mat &onlyBits, int &idx, int &rotation,
} }
} }
if(idx != -1) return idx != -1;
return true;
else
return false;
} }
@@ -167,9 +158,8 @@ void Dictionary::drawMarker(int id, int sidePixels, OutputArray _img, int border
* @brief Transform matrix of bits to list of bytes in the 4 rotations * @brief Transform matrix of bits to list of bytes in the 4 rotations
*/ */
Mat Dictionary::getByteListFromBits(const Mat &bits) { Mat Dictionary::getByteListFromBits(const Mat &bits) {
// integer ceil
int nbytes = (bits.cols * bits.rows) / 8; int nbytes = (bits.cols * bits.rows + 8 - 1) / 8;
if((bits.cols * bits.rows) % 8 != 0) nbytes++;
Mat candidateByteList(1, nbytes, CV_8UC4, Scalar::all(0)); Mat candidateByteList(1, nbytes, CV_8UC4, Scalar::all(0));
unsigned char currentBit = 0; unsigned char currentBit = 0;
@@ -246,27 +236,27 @@ Mat Dictionary::getBitsFromByteList(const Mat &byteList, int markerSize) {
// DictionaryData constructors calls // DictionaryData constructors calls
const Dictionary DICT_ARUCO_DATA = Dictionary(&(DICT_ARUCO_BYTES[0][0][0]), 5, 1024, 0); const Dictionary DICT_ARUCO_DATA = Dictionary(Mat(1024, (5*5 + 7)/8, CV_8UC4, (uchar*)DICT_ARUCO_BYTES), 5, 0);
const Dictionary DICT_4X4_50_DATA = Dictionary(&(DICT_4X4_1000_BYTES[0][0][0]), 4, 50, 1); const Dictionary DICT_4X4_50_DATA = Dictionary(Mat(50, (4*4 + 7)/8, CV_8UC4, (uchar*)DICT_4X4_1000_BYTES), 4, 1);
const Dictionary DICT_4X4_100_DATA = Dictionary(&(DICT_4X4_1000_BYTES[0][0][0]), 4, 100, 1); const Dictionary DICT_4X4_100_DATA = Dictionary(Mat(100, (4*4 + 7)/8, CV_8UC4, (uchar*)DICT_4X4_1000_BYTES), 4, 1);
const Dictionary DICT_4X4_250_DATA = Dictionary(&(DICT_4X4_1000_BYTES[0][0][0]), 4, 250, 1); const Dictionary DICT_4X4_250_DATA = Dictionary(Mat(250, (4*4 + 7)/8, CV_8UC4, (uchar*)DICT_4X4_1000_BYTES), 4, 1);
const Dictionary DICT_4X4_1000_DATA = Dictionary(&(DICT_4X4_1000_BYTES[0][0][0]), 4, 1000, 0); const Dictionary DICT_4X4_1000_DATA = Dictionary(Mat(1000, (4*4 + 7)/8, CV_8UC4, (uchar*)DICT_4X4_1000_BYTES), 4, 0);
const Dictionary DICT_5X5_50_DATA = Dictionary(&(DICT_5X5_1000_BYTES[0][0][0]), 5, 50, 3); const Dictionary DICT_5X5_50_DATA = Dictionary(Mat(50, (5*5 + 7)/8, CV_8UC4, (uchar*)DICT_5X5_1000_BYTES), 5, 3);
const Dictionary DICT_5X5_100_DATA = Dictionary(&(DICT_5X5_1000_BYTES[0][0][0]), 5, 100, 3); const Dictionary DICT_5X5_100_DATA = Dictionary(Mat(100, (5*5 + 7)/8, CV_8UC4, (uchar*)DICT_5X5_1000_BYTES), 5, 3);
const Dictionary DICT_5X5_250_DATA = Dictionary(&(DICT_5X5_1000_BYTES[0][0][0]), 5, 250, 2); const Dictionary DICT_5X5_250_DATA = Dictionary(Mat(250, (5*5 + 7)/8, CV_8UC4, (uchar*)DICT_5X5_1000_BYTES), 5, 2);
const Dictionary DICT_5X5_1000_DATA = Dictionary(&(DICT_5X5_1000_BYTES[0][0][0]), 5, 1000, 2); const Dictionary DICT_5X5_1000_DATA = Dictionary(Mat(1000, (5*5 + 7)/8, CV_8UC4, (uchar*)DICT_5X5_1000_BYTES), 5, 2);
const Dictionary DICT_6X6_50_DATA = Dictionary(&(DICT_6X6_1000_BYTES[0][0][0]), 6, 50, 6); const Dictionary DICT_6X6_50_DATA = Dictionary(Mat(50, (6*6 + 7)/8 ,CV_8UC4, (uchar*)DICT_6X6_1000_BYTES), 6, 6);
const Dictionary DICT_6X6_100_DATA = Dictionary(&(DICT_6X6_1000_BYTES[0][0][0]), 6, 100, 5); const Dictionary DICT_6X6_100_DATA = Dictionary(Mat(100, (6*6 + 7)/8 ,CV_8UC4, (uchar*)DICT_6X6_1000_BYTES), 6, 5);
const Dictionary DICT_6X6_250_DATA = Dictionary(&(DICT_6X6_1000_BYTES[0][0][0]), 6, 250, 5); const Dictionary DICT_6X6_250_DATA = Dictionary(Mat(250, (6*6 + 7)/8 ,CV_8UC4, (uchar*)DICT_6X6_1000_BYTES), 6, 5);
const Dictionary DICT_6X6_1000_DATA = Dictionary(&(DICT_6X6_1000_BYTES[0][0][0]), 6, 1000, 4); const Dictionary DICT_6X6_1000_DATA = Dictionary(Mat(1000, (6*6 + 7)/8 ,CV_8UC4, (uchar*)DICT_6X6_1000_BYTES), 6, 4);
const Dictionary DICT_7X7_50_DATA = Dictionary(&(DICT_7X7_1000_BYTES[0][0][0]), 7, 50, 9); const Dictionary DICT_7X7_50_DATA = Dictionary(Mat(50, (7*7 + 7)/8 ,CV_8UC4, (uchar*)DICT_7X7_1000_BYTES), 7, 9);
const Dictionary DICT_7X7_100_DATA = Dictionary(&(DICT_7X7_1000_BYTES[0][0][0]), 7, 100, 8); const Dictionary DICT_7X7_100_DATA = Dictionary(Mat(100, (7*7 + 7)/8 ,CV_8UC4, (uchar*)DICT_7X7_1000_BYTES), 7, 8);
const Dictionary DICT_7X7_250_DATA = Dictionary(&(DICT_7X7_1000_BYTES[0][0][0]), 7, 250, 8); const Dictionary DICT_7X7_250_DATA = Dictionary(Mat(250, (7*7 + 7)/8 ,CV_8UC4, (uchar*)DICT_7X7_1000_BYTES), 7, 8);
const Dictionary DICT_7X7_1000_DATA = Dictionary(&(DICT_7X7_1000_BYTES[0][0][0]), 7, 1000, 6); const Dictionary DICT_7X7_1000_DATA = Dictionary(Mat(1000, (7*7 + 7)/8 ,CV_8UC4, (uchar*)DICT_7X7_1000_BYTES), 7, 6);
const Dictionary &getPredefinedDictionary(PREDEFINED_DICTIONARY_NAME name) { const Dictionary &getPredefinedDictionary(PREDEFINED_DICTIONARY_NAME name) {

View File

@@ -36,8 +36,7 @@ or tort (including negligence or otherwise) arising in any way out of
the use of this software, even if advised of the possibility of such damage. the use of this software, even if advised of the possibility of such damage.
*/ */
namespace cv { namespace {
namespace aruco {
@@ -53,7 +52,7 @@ namespace aruco {
* Each rotation implies a 90 degree rotation of the marker in anticlockwise direction. * Each rotation implies a 90 degree rotation of the marker in anticlockwise direction.
*/ */
const unsigned char DICT_ARUCO_BYTES[][4][4] = { static unsigned char DICT_ARUCO_BYTES[][4][4] = {
{ { 132, 33, 8, 0 }, { { 132, 33, 8, 0 },
{ 0, 0, 15, 1 }, { 0, 0, 15, 1 },
{ 8, 66, 16, 1 }, { 8, 66, 16, 1 },
@@ -4152,7 +4151,7 @@ const unsigned char DICT_ARUCO_BYTES[][4][4] = {
{ 7, 255, 240, 0 }, }, { 7, 255, 240, 0 }, },
}; };
const unsigned char DICT_4X4_1000_BYTES[][4][2] = static unsigned char DICT_4X4_1000_BYTES[][4][2] =
{ { { 181, 50 }, { { { 181, 50 },
{ 235, 72 }, { 235, 72 },
{ 76, 173 }, { 76, 173 },
@@ -8154,7 +8153,7 @@ const unsigned char DICT_4X4_1000_BYTES[][4][2] =
{ 253, 239 }, { 253, 239 },
{ 219, 255 }, }, }; { 219, 255 }, }, };
const unsigned char DICT_5X5_1000_BYTES[][4][4] = static unsigned char DICT_5X5_1000_BYTES[][4][4] =
{ { { 162, 217, 94, 0 }, { { { 162, 217, 94, 0 },
{ 82, 46, 217, 1 }, { 82, 46, 217, 1 },
{ 61, 77, 162, 1 }, { 61, 77, 162, 1 },
@@ -12156,7 +12155,7 @@ const unsigned char DICT_5X5_1000_BYTES[][4][4] =
{ 184, 73, 239, 1 }, { 184, 73, 239, 1 },
{ 204, 238, 57, 1 }, }, }; { 204, 238, 57, 1 }, }, };
const unsigned char DICT_6X6_1000_BYTES[][4][5] = static unsigned char DICT_6X6_1000_BYTES[][4][5] =
{ { { 30, 61, 216, 42, 6 }, { { { 30, 61, 216, 42, 6 },
{ 227, 186, 70, 49, 9 }, { 227, 186, 70, 49, 9 },
{ 101, 65, 187, 199, 8 }, { 101, 65, 187, 199, 8 },
@@ -16158,7 +16157,7 @@ const unsigned char DICT_6X6_1000_BYTES[][4][5] =
{ 255, 135, 198, 183, 15 }, { 255, 135, 198, 183, 15 },
{ 174, 219, 251, 231, 3 }, }, }; { 174, 219, 251, 231, 3 }, }, };
const unsigned char DICT_7X7_1000_BYTES[][4][7] = static unsigned char DICT_7X7_1000_BYTES[][4][7] =
{ { { 221, 92, 108, 165, 202, 10, 1 }, { { { 221, 92, 108, 165, 202, 10, 1 },
{ 99, 179, 173, 228, 49, 180, 0 }, { 99, 179, 173, 228, 49, 180, 0 },
{ 168, 41, 210, 155, 29, 93, 1 }, { 168, 41, 210, 155, 29, 93, 1 },
@@ -20160,4 +20159,3 @@ const unsigned char DICT_7X7_1000_BYTES[][4][7] =
{ 252, 176, 35, 180, 179, 243, 1 }, { 252, 176, 35, 180, 179, 243, 1 },
{ 31, 47, 190, 169, 27, 97, 1 }, }, }; { 31, 47, 190, 169, 27, 97, 1 }, }, };
} }
}