😽

Linux22.04+Go(1.21)+GoCV(go言語のOpenCV)でQRコード読み込みしてみた。

2023/12/01に公開

Abstract

タイトル通りなんだけど、なるだけ簡素に。

前提

手順

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