dc4bc/qr/qr_read.go

69 lines
1.4 KiB
Go
Raw Normal View History

2020-07-22 04:53:06 -07:00
package qr
import (
"fmt"
2020-07-22 05:56:31 -07:00
"log"
2020-07-22 04:53:06 -07:00
"time"
"github.com/makiuchi-d/gozxing"
"github.com/makiuchi-d/gozxing/qrcode"
"gocv.io/x/gocv"
)
const timeToScan = time.Second * 5
2020-07-29 06:20:39 -07:00
func ReadQRFromCamera() ([]byte, error) {
2020-07-22 04:53:06 -07:00
webcam, err := gocv.OpenVideoCapture(0)
if err != nil {
2020-07-29 06:20:39 -07:00
return nil, fmt.Errorf("failed to OpenVideoCapture: %w", err)
2020-07-22 04:53:06 -07:00
}
window := gocv.NewWindow("Hello")
2020-07-22 05:56:31 -07:00
defer func() {
if err := webcam.Close(); err != nil {
log.Fatalf("failed to close camera: %v", err)
}
}()
defer func() {
if err := window.Close(); err != nil {
log.Fatalf("failed to close camera window: %v", err)
}
}()
2020-07-22 04:53:06 -07:00
img := gocv.NewMat()
tk := time.NewTimer(timeToScan)
// This loop reads an image from the webcam every millisecond
// for 5 seconds. The last image taken will be used as the final
//one.
loop:
for {
select {
case <-tk.C:
break loop
default:
webcam.Read(&img)
window.IMShow(img)
window.WaitKey(1)
}
}
imgObject, err := img.ToImage()
if err != nil {
2020-07-29 06:20:39 -07:00
return nil, fmt.Errorf("failed to get image object: %w", err)
2020-07-22 04:53:06 -07:00
}
bmp, err := gozxing.NewBinaryBitmapFromImage(imgObject)
if err != nil {
2020-07-29 06:20:39 -07:00
return nil, fmt.Errorf("failed to get NewBinaryBitmapFromImage: %w", err)
2020-07-22 04:53:06 -07:00
}
qrReader := qrcode.NewQRCodeReader()
result, err := qrReader.Decode(bmp, nil)
if err != nil {
2020-07-29 06:20:39 -07:00
return nil, fmt.Errorf("failed to decode the QR-code contents: %w", err)
2020-07-22 04:53:06 -07:00
}
2020-07-29 06:20:39 -07:00
return result.GetRawBytes(), err
2020-07-22 04:53:06 -07:00
}