😽
Linux22.04+Go(1.21)+GoCV(go言語のOpenCV)でQRコード読み込みしてみた。
Abstract
タイトル通りなんだけど、なるだけ簡素に。
前提
- VirtualBoxはインストールしておく。 VirtualBoxインストール
- VirtualBoxにLinux22.04をインストールしておく。VirtualBox上でUbuntu22.04を構築
- VirtualBox+Linux22.04にVSCodeをインストールしておく。VSCodeをインストール
- 日本語化もしとく。VSCodeを日本語化
- goもインストールしておく。Ubuntu22.04上に、VSCode+Go(1.21)+Webアプリの環境をつくる。
- Webカメラの設定もしておく。VirtualBox上のLinux22.04でカメラを使う。
手順
QRコードを準備
まず、認識させるQRコードを作成する。
アイコン・文字入りQRコード
↑このサイトが無料で作れてオススメ。
つくったQRコードはこれ↓
読み込みに成功したら、"aaaabbbbccccdddd"が表示される。
Goコードを作成
goプロジェクト作成
# プロジェクトディレクトリ作成
$ cd ~ && mkdir test-go-qrcode && cd test-go-qrcode
# goプロジェクト初期化
$ go mod init test-go-qrcode
# goソース生成
$ vi test-qrcode.go
test-qrcode.go
package main
import (
"fmt"
"gocv.io/x/gocv"
)
func main() {
img := gocv.IMRead("558461fb1b0d-20231130.png", gocv.IMReadColor)
if img.Empty() {
fmt.Printf("Error reading image from: %v\n", "http file.")
return
}
defer img.Close()
points := gocv.NewMat()
defer points.Close()
straight_qrcode := gocv.NewMat()
defer straight_qrcode.Close()
qr := gocv.NewQRCodeDetector()
defer qr.Close()
qr.Detect(img, &points)
fmt.Println(points.Cols())
/* 0 ----- 1 */
/* | */
/* | */
/* 3 ----- 2 */
fmt.Println(points.GetFloatAt(0, 0)) /* 0:w */
fmt.Println(points.GetFloatAt(0, 1)) /* 0:h */
fmt.Println(points.GetFloatAt(0, 2)) /* 1:w */
fmt.Println(points.GetFloatAt(0, 3)) /* 1:h */
fmt.Println(points.GetFloatAt(0, 4)) /* 2:w */
fmt.Println(points.GetFloatAt(0, 5)) /* 2:h */
fmt.Println(points.GetFloatAt(0, 6)) /* 3:w */
fmt.Println(points.GetFloatAt(0, 7)) /* 3:h */
var strtmp = qr.Decode(img, points, &straight_qrcode)
if len(strtmp) > 0 {
fmt.Println(strtmp)
}
}
goプロジェクト作成
# go関連ライブラリの自動設定
$ go mod tidy
# 上手くいったか確認する。
$ cat go.mod
module test-go-qrcode
go 1.21.4
require gocv.io/x/gocv v0.35.0
"require gocv.io/x/gocv v0.35.0"が追加されてるので上手くいったみたい。
準備したQRコードをプロジェクトディレクトリに置く
面倒だから、ファイルマネージャーで、コピペした。
wgetとか使えばいいんだろうけど...
VSCodeで動かす。
プロジェクトを開く。
↓
先ほど作成したディレクトリを開く。
↓
先ほど作成したgoソースを開く。
↓
赤矢印のところ、赤波線がないのがポイント。
"go mod tidy"やったからね。
実行
↓
出来た!!
無事、"aaaabbbbccccdddd"が表示された。
Discussion