如何在GoCV中正确使用DetectAndDecodeMulti并处理返回结果
GoCV中DetectAndDecodeMulti方法的正确使用方式
问题场景
我用Python的OpenCV可以正常识别二维码,代码如下:
import cv2 img = cv2.imread('barcode.png') qcd = cv2.QRCodeDetector() retval, decoded_info, points, straight_qrcode = qcd.detectAndDecodeMulti(img) print(decoded_info)
输出结果:
[[[ 52. 52. ] [195.97902 52. ] [198.5086 196.30678] [ 52. 196. ]]] ('https://www.example.com',)
但在GoCV中调用同名方法时,返回结果处理异常。我写的代码如下:
package main import ( "fmt" "gocv.io/x/gocv" ) func main() { qcd := gocv.NewQRCodeDetector() defer qcd.Close() codes := make([]string, 100) points := gocv.NewMat() qrcodes := make([]gocv.Mat, 100) img := gocv.IMRead("barcode.png", gocv.IMReadGrayScale) res := qcd.DetectAndDecodeMulti(img, &codes, &points, &qrcodes) fmt.Println(res) fmt.Println(points) fmt.Println(codes) }
运行后输出:
true {0x164a3b0 []} g] �
测试图片为包含https://www.example.com的二维码。
正确实现代码
问题出在参数初始化和资源管理上,以下是修正后的代码:
package main import ( "fmt" "gocv.io/x/gocv" ) func main() { // 初始化检测器 qcd := gocv.NewQRCodeDetector() defer qcd.Close() // 读取图片,支持彩色或灰度模式 img := gocv.IMRead("barcode.png", gocv.IMReadColor) defer img.Close() // 声明空切片和Mat对象,由方法自动填充 var codes []string var points gocv.Mat var qrcodes []gocv.Mat defer points.Close() // 延迟关闭所有校正后的二维码Mat defer func() { for _, mat := range qrcodes { mat.Close() } }() // 调用识别方法 success := qcd.DetectAndDecodeMulti(img, &codes, &points, &qrcodes) if success { fmt.Println("识别成功") fmt.Println("二维码内容:", codes) fmt.Println("二维码角点坐标矩阵:") fmt.Println(points) fmt.Println("校正后的二维码数量:", len(qrcodes)) } else { fmt.Println("未识别到二维码") } }
关键修正说明
- 切片初始化:不需要预先创建固定长度的
codes和qrcodes切片,直接声明空切片即可,GoCV会根据识别结果自动分配内存并填充数据。 - 资源管理:所有
Mat对象必须调用Close()释放资源,使用defer确保程序退出时自动执行。 - 图片读取:
IMReadColor或IMReadGrayScale都可正常识别,根据需求选择即可。
运行修正后的代码,将正确输出二维码内容https://www.example.com及对应的坐标信息。
内容的提问来源于stack exchange,提问作者comzine
相关产品推荐
相关产品推荐

