gocv FeatureMatching 大图找小图

本文介绍了使用GoCV库进行SIFT特征匹配的步骤,包括读取灰度图像、创建SIFT对象、检测关键点并计算描述符,然后通过BFMatcher进行匹配并应用比率测试。最后,展示了如何在匹配点上进行鼠标操作,实现图像搜索与机器人位置同步。
摘要由CSDN通过智能技术生成

//FeatureMatching func

func (proc *ProcCV) FeatureMatching() {

    // opening query image

    query := gocv.IMRead("./images/1.jpg", gocv.IMReadGrayScale)

    defer query.Close()

    // opening train image

    train := gocv.IMRead("./images/2.jpg", gocv.IMReadGrayScale)

    defer train.Close()

    // creating new SIFT

    sift := gocv.NewSIFT()

    defer sift.Close()

    // detecting and computing keypoints using SIFT method

    kp1, des1 := sift.DetectAndCompute(query, gocv.NewMat())

    kp2, des2 := sift.DetectAndCompute(train, gocv.NewMat())

    // finding K best matches for each descriptor

    bf := gocv.NewBFMatcher()

    matches := bf.KnnMatch(des1, des2, 2)

    // application of ratio test

    var good []gocv.DMatch

    for _, m := range matches {

        if len(m) > 1 {

            if m[0].Distance < 0.75*m[1].Distance {

                good = append(good, m[0])

            }

        }

    }

    // matches color

    c1 := color.RGBA{

        R: 0,

        G: 255,

        B: 0,

        A: 0,

    }

    // point color

    c2 := color.RGBA{

        R: 255,

        G: 0,

        B: 0,

        A: 0,

    }

    // creating empty mask

    mask := make([]byte, 0)

    // new matrix for output image

    out := gocv.NewMat()

    // drawing matches

    gocv.DrawMatches(query, kp1, train, kp2, good, &out, c1, c2, mask, gocv.DrawDefault)

    // creating output window with result

    window := gocv.NewWindow("Output")

    window.IMShow(out)

    defer window.Close()

    for _, v := range good {

        log.Debugln(kp1[v.QueryIdx].X, kp1[v.QueryIdx].Y)//小图中匹配到的点

        log.Debugln(kp2[v.TrainIdx].X, kp2[v.TrainIdx].Y)//大图中匹配到的点

        robotgo.MoveMouse(int(kp1[v.QueryIdx].X), int(kp1[v.QueryIdx].Y))

        time.Sleep(time.Second * 1)

        robotgo.MoveMouse(int(kp2[v.TrainIdx].X), int(kp2[v.TrainIdx].Y))

        time.Sleep(time.Second * 1)

    }

    window.WaitKey(0)

}

gocv是一个基于Go语言的开源计算机视觉库,它提供了许多用于图像处理和分析的函数和工具。其一个非常常用的功能是grabcut,它可以用于图像分割和背景去除。 grabcut是一种常见的图像分割算法,它基于图像的像素颜色和纹理信息,将图像分为前景和背景。使用gocv进行grabcut非常简单,只需遵循以下步骤: 首先,我们需要加载和显示待处理的图像。我们可以使用gocv的imshow函数将图像显示在窗口。 接下来,我们需要为图像创建一个掩膜。掩膜是一个与原始图像相同大小的二进制图像,用于指示图像的前景和背景区域。 然后,我们需要通过用户输入来定义前景区域。我们可以使用gocv的SetMouseCallback函数监听鼠标点击事件,并将鼠标点击的像素添加到前景掩膜。 接下来,我们可以调用gocv的GrabCut函数来执行grabcut算法。该函数将根据我们之前定义的前景掩膜对图像进行分割,并生成一个新的掩膜。 最后,我们可以使用新的掩膜来提取分割后的前景区域。我们可以将掩膜与原始图像进行位操作,以获取只包含前景区域的图像。 需要注意的是,grabcut算法的效果取决于我们对前景和背景区域的定义。如果定义得不准确,算法可能无法正确地分割图像。 总之,使用gocv的grabcut功能,我们可以轻松地进行图像分割和背景去除操作,从而实现许多有趣的图像处理应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值