You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:25:15