From: Skullheadx Date: Wed, 20 Nov 2024 17:20:24 +0000 (-0500) Subject: unmask encoding region of the symbol X-Git-Url: http://git.skullheadx.com/nixos/static/gitweb.css?a=commitdiff_plain;h=3227b4c4adf083d32d4a363d4ae7eac82c37043e;p=qrcodescanner.git unmask encoding region of the symbol --- diff --git a/camera.cpp b/camera.cpp index 7ce54fd..e87d8ea 100644 --- a/camera.cpp +++ b/camera.cpp @@ -10,16 +10,25 @@ unsigned int distance(std::vector &v1, const std::vector &v2); void read_words_from_file(char const *filename, std::vector> &symbol); std::vector get_format_info(std::vector> &symbol); +void decode_mask(std::vector> &symbol, std::size_t mask_pattern); int main(){ std::vector> symbol(21, std::vector(21,0)); read_words_from_file("output.pbm", symbol); - print(symbol); + //print(symbol); std::vector format_info = get_format_info(symbol); - print(format_info); + std::cout << "Format Info: "; print(format_info); std::cout << std::endl; + std::bitset<3> mask_pattern{}; + mask_pattern[0] = format_info[2]; + mask_pattern[1] = format_info[3]; + mask_pattern[2] = format_info[4]; + decode_mask(symbol, mask_pattern.to_ulong()); + + print(symbol); + return 0; } @@ -107,7 +116,7 @@ std::vector get_format_info(std::vector> &symbol){ {1,1,1,1,0,1,0,1,1,0,0,1,0,0,0}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, }; - + //print(format_info); std::vector mask = {1,0,1,0,1,0,0,0,0,0,1,0,0,1,0}; vec_xor(format_info, mask); @@ -134,6 +143,55 @@ std::vector get_format_info(std::vector> &symbol){ return format_info; } +void decode_mask(std::vector> &symbol, std::size_t mask_pattern){ + std::vector> data_mask(21, std::vector (21, 0)); + for (std::size_t i{}; i < 21; ++i){ + for (std::size_t j{}; j < 21; ++j){ + if ((i < 9 && j < 9) || (i > 12 && j < 9) || (i < 9 && j > 12) || i == 6 || j == 6){ + continue; + } + // 000 + if (mask_pattern == 0 && (i+j)%2 == 0){ + data_mask[i][j] = 1; + } + // 001 + else if (mask_pattern == 1 && i % 2 == 0){ + data_mask[i][j] = 1; + } + // 010 + else if (mask_pattern == 2 && j % 3 == 0){ + data_mask[i][j] = 1; + } + // 011 + else if (mask_pattern == 3 && (i+j)%3 == 0){ + data_mask[i][j] = 1; + } + // 100 + else if (mask_pattern == 4 && (i / 2 + j / 3) % 2 == 0){ + data_mask[i][j] = 1; + } + // 101 + else if (mask_pattern == 5 && (i * j) % 2 + (i * j) % 3 == 0){ + data_mask[i][j] = 1; + } + // 110 + else if (mask_pattern == 6 && ((i * j) % 2 + (i * j) % 3 ) % 2 == 0){ + data_mask[i][j] = 1; + } + // 111 + else if (mask_pattern == 7 && (((i + j) % 2 + (i * j) % 3 ) % 2 == 0)){ + data_mask[i][j] = 1; + } + } + } + + for (std::size_t i{0}; i < 21; ++i){ + for (std::size_t j{0}; j < 21; ++j){ + symbol[i][j] = symbol[i][j] ^ data_mask[i][j]; + } + } +} + void read_words_from_file(char const *filename, std::vector> &symbol) { std::ifstream file{ filename }; if (!file.is_open()) { diff --git a/output.pbm b/output.pbm index 363237f..dbea2aa 100644 --- a/output.pbm +++ b/output.pbm @@ -1,23 +1,23 @@ P1 21 21 -1 1 1 1 1 1 1 0 1 0 0 0 0 0 1 1 1 1 1 1 1 -1 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 1 -1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 1 1 1 0 1 -1 0 1 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 -1 0 1 1 1 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0 1 +1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 +1 0 1 1 1 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 1 +1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1 +1 0 1 1 1 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 1 +1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 -0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 1 0 1 1 1 0 0 0 0 1 1 1 1 1 0 0 1 -0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 -1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 0 1 0 1 -0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 1 1 -1 0 1 1 1 0 1 1 1 1 0 1 0 0 0 1 1 0 1 0 0 -0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 -1 1 1 1 1 1 1 0 1 0 1 0 0 1 0 1 0 0 1 1 1 -1 0 0 0 0 0 1 0 0 1 1 1 1 0 0 0 1 0 1 0 0 -1 0 1 1 1 0 1 0 1 0 0 1 1 0 0 0 0 1 0 0 1 -1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 -1 0 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 0 0 -1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 1 0 1 0 1 -1 1 1 1 1 1 1 0 1 1 0 0 1 0 1 1 1 1 1 0 1 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 +1 1 1 0 1 1 0 1 0 1 1 1 1 1 0 1 1 0 0 1 0 +0 1 0 0 0 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 1 +1 1 1 0 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 +0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 +0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 1 +1 1 1 1 1 1 1 0 0 1 0 0 0 1 0 1 1 1 1 1 1 +1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 1 1 1 +1 0 1 1 1 0 1 0 1 1 0 1 1 0 0 0 1 0 0 0 0 +1 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 +1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 +1 0 0 0 0 0 1 0 0 1 1 1 1 0 1 0 0 1 0 0 0 +1 1 1 1 1 1 1 0 1 0 0 0 1 0 1 1 1 1 1 1 1 diff --git a/qrgenerator.cpp b/qrgenerator.cpp index 442ad61..49ef0d9 100644 --- a/qrgenerator.cpp +++ b/qrgenerator.cpp @@ -28,7 +28,7 @@ int main() { int k; //std::cout << id_generator(69) << std::endl; std::string input_data{"6969696969"}; - const unsigned int input_length = 8; + const unsigned int input_length = 10; std::vector input_data_vector{}; for (unsigned int i{0}; i < input_length; i+=3){ /* 8 - 6 = 2