

SPRESENSEカメラボードを使用して、カメラ入力からJANやQRコードといったバーコードを読み取りを試したいと考えているのですが、実現可能でしょうか？


CC BY-SA 4.0
2023-01-18T09:00:18.157
93435
2023-02-08T07:04:23.030
56646
question
spresense
SPRESENSE＋カメラ入力を使用したバーコード読み取りは可能ですか？


バーコード読み取りではなく、QRコードですが普通に動きました。前から[”quirc”](https://github.com/dlbeer/quirc)というライブラリがあるのは知っていたのですが、試しに移植をしてみたら、あっさり動きました（少し手直しをしています）。Arduinoから使えるようにライブラリにまとめたものを、次のGithubにあげています。  
もし良かったら使ってみてください。

<https://github.com/YoshinoTaro/QR_decode_for_Arduino>

使い方のイメージが掴めるように。サンプルコードを示しておきます。

[code]

    #include <Camera.h>
    #include "quirc.h"
    
    struct quirc* qr;
    struct quirc_code code;
    struct quirc_data data;
    uint8_t *image;
    int w, h;
      
    void CamCB(CamImage img) {
      if (!img.isAvailable()) return;
       
      image = quirc_begin(qr, &w, &h);  
      uint16_t* rgb_image = (uint16_t*)img.getImgBuff();
      for (int n = 0; n < w*h; ++n) {
        uint16_t pix = rgb_image[n];
        image[n] = (pix & 0x7E0) >> 5; // extract g image
      }
      quirc_end(qr);
      
      int num_codes = quirc_count(qr);
      for (int i = 0; i < num_codes; i++) {
        quirc_decode_error_t err;
        quirc_extract(qr, i, &code);
        err = quirc_decode(&code, &data);
        if (err)
          printf("DECODE FAILED: %s\n", quirc_strerror(err));
        else
          printf("Data: %s\n", data.payload);
      }
    }
    
    void setup() {
      Serial.begin(115200);
      theCamera.begin(1, CAM_VIDEO_FPS_15, 
        CAM_IMGSIZE_QVGA_H, CAM_IMGSIZE_QVGA_V, CAM_IMAGE_PIX_FMT_RGB565);
      theCamera.startStreaming(true, CamCB);
      
      qr = quirc_new();
      if (qr == NULL) {
        Serial.println("can't create quirc object");
        return;
      }  
      if (quirc_resize(qr, 320, 240) < 0) {
        Serial.println("Failed to allocate video memory");
        return;
      }
    }
    
    void loop() { }
    
[/code]


CC BY-SA 4.0
2023-02-01T10:35:39.830
93667
2023-02-08T07:04:23.030
2023-02-08T07:04:23.030
27334
27334
93435
answer