• 二维码解码器-Quirc使用教程


    一.描述

            quirc是一款专用于识别二维码(不能识别一维码)的开源软件。它比zbar轻量一些,跟zbar一样能扫描码流和静态图片识别条形码,

            库文件总共6个文件,非常的小,编译之后的静态库只有25kb。官方代码是依赖libjpg库和linpng库进行解码转换成灰度后再进行二维码检测的。本次仅仅传入灰度图片进行解码,将不依赖jpeg和png进行二维码检测功能

    二.使用样例

            

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. #include
    15. #include
    16. #include
    17. static void rgb888tomonochrome(uint8_t *rgb_data, int width, int height, uint8_t *dst)
    18. {
    19. int i, j;
    20. for (i = 0; i < height; i++)
    21. {
    22. for (j = 0; j < width; j++)
    23. {
    24. unsigned char *pixel = rgb_data + (i * width + j) * 3;
    25. unsigned char r = pixel[0];
    26. unsigned char g = pixel[1];
    27. unsigned char b = pixel[2];
    28. *(dst++) = (r + g + b) / 3;
    29. }
    30. }
    31. }
    32. int main(int argc, char **argv)
    33. {
    34. /*读rgb数据*/
    35. if (argc != 4)
    36. {
    37. printf("failed:argc=%d\n", argc);
    38. return 0;
    39. }
    40. /*读取文件*/
    41. int image_width = atoi(argv[1]);
    42. int image_hight = atoi(argv[2]);
    43. const int iamge_size = image_width * image_hight * 3;
    44. uint8_t *image_buffer = (uint8_t *)malloc(iamge_size);
    45. if (image_buffer == NULL)
    46. {
    47. printf("malloc failed \n");
    48. return 0;
    49. }
    50. int fd = open(argv[3], O_RDONLY);
    51. read(fd, image_buffer, iamge_size);
    52. close(fd);
    53. /*创建解码器*/
    54. struct quirc *qr_coder = quirc_new();
    55. if (qr_coder == NULL)
    56. {
    57. printf("create quirc new failed \n");
    58. return -1;
    59. }
    60. /*设置解码的分辨率*/
    61. if (quirc_resize(qr_coder, image_width, image_hight) < 0)
    62. {
    63. printf("quirce size failed \n");
    64. goto finish;
    65. }
    66. uint8_t *image_mono_buf = quirc_begin(qr_coder, NULL, NULL);
    67. rgb888tomonochrome(image_buffer, image_width, image_hight, image_mono_buf);
    68. quirc_end(qr_coder);
    69. int qr_count = quirc_count(qr_coder);
    70. printf("find qrcode count:%d\n", qr_count);
    71. for (int i = 0; i < qr_count; i++)
    72. {
    73. struct quirc_code code;
    74. struct quirc_data data;
    75. quirc_extract(qr_coder, i, &code);
    76. quirc_decode_error_t err = quirc_decode(&code, &data);
    77. if (err == QUIRC_ERROR_DATA_ECC)
    78. {
    79. quirc_flip(&code);
    80. err = quirc_decode(&code, &data);
    81. }
    82. if (!err)
    83. {
    84. printf("%s\n", data.payload);
    85. }
    86. }
    87. quirc_destroy(qr_coder);
    88. finish:
    89. if (image_buffer)
    90. {
    91. free(image_buffer);
    92. }
    93. return -1;
    94. }

  • 相关阅读:
    android 逆向去广告工具和流程
    【全志T113-S3_100ask】5-编写按键驱动(input子系统+内核按键驱动)
    02 线程安全问题
    【毕设级项目】基于嵌入式的智能家居控制板(完整工程资料源码)
    驾驶数字未来:汽车业界数字孪生技术的崭新前景
    软件外包开发代码质量评测
    ArduinoUNO实战-第五章-有源蜂鸣器实验
    堆栈认知——栈溢出实例(ret2libc)
    FPGA project : beep
    代码随想录57——动态规划:647回文子串、516最长回文子序列
  • 原文地址:https://blog.csdn.net/u014415274/article/details/132908515