gocv icon indicating copy to clipboard operation
gocv copied to clipboard

Features2D,FindHomography,PerspectiveTransform

Open workyu opened this issue 3 years ago • 12 comments

`package main

import ( "image" "image/color"

"gocv.io/x/gocv"

)

// you can run this example from root of this repository // with go run ./cmd/hello-sift /path/to/querry /path/to/train // // this is an example of Brute-Force Matching // with SIFT Descriptors and Ratio Test func main() { // opening querry image querry := gocv.IMRead("x.png", gocv.IMReadGrayScale) defer querry.Close()

// opening train image
train := gocv.IMRead("x_1.png", 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(querry, gocv.NewMat())
kp2, des2 := sift.DetectAndCompute(train, gocv.NewMat())

// finding K best matches for each descriptor
bf := gocv.NewBFMatcher()
defer bf.Close()
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(querry, kp1, train, kp2, good, &out, c1, c2, mask, gocv.DrawDefault)
obj := gocv.NewMatWithSize(len(good), 2, gocv.MatTypeCV32F)
scene := gocv.NewMatWithSize(len(good), 2, gocv.MatTypeCV32F)
for i := 0; i < len(good); i++ {
	obj.SetFloatAt(i, 0, float32(kp1[good[i].QueryIdx].X))
	obj.SetFloatAt(i, 1, float32(kp1[good[i].QueryIdx].Y))
	scene.SetFloatAt(i, 0, float32(kp2[good[i].TrainIdx].X))
	scene.SetFloatAt(i, 1, float32(kp2[good[i].TrainIdx].Y))
}
dst := gocv.NewMat()
h := gocv.FindHomography(obj, &scene, gocv.HomograpyMethodRANSAC, 3, &dst, 2000, 0.995)
obj_corners := gocv.NewMatWithSize(4, 2, gocv.MatTypeCV32FC2)
obj_corners.SetFloatAt3(0, 0, 0, 0)
obj_corners.SetFloatAt3(0, 1, 0, 0)
obj_corners.SetFloatAt3(1, 0, 0, float32(querry.Cols()))
obj_corners.SetFloatAt3(1, 1, 0, 0)
obj_corners.SetFloatAt3(2, 0, 0, float32(querry.Cols()))
obj_corners.SetFloatAt3(2, 1, 0, float32(querry.Rows()))
obj_corners.SetFloatAt3(3, 0, 0, 0)
obj_corners.SetFloatAt3(3, 1, 0, float32(querry.Rows()))
scene_corners := gocv.NewMatWithSize(4, 2, gocv.MatTypeCV32FC2)
gocv.PerspectiveTransform(obj_corners, &scene_corners, h)
pt1 := image.Pt(int(scene_corners.GetFloatAt3(0, 0, 0))+querry.Cols(), int(scene_corners.GetFloatAt3(0, 1, 0)))
pt2 := image.Pt(int(scene_corners.GetFloatAt3(1, 0, 0))+querry.Cols(), int(scene_corners.GetFloatAt3(1, 1, 0)))
pt3 := image.Pt(int(scene_corners.GetFloatAt3(2, 0, 0))+querry.Cols(), int(scene_corners.GetFloatAt3(2, 1, 0)))
pt4 := image.Pt(int(scene_corners.GetFloatAt3(3, 0, 0))+querry.Cols(), int(scene_corners.GetFloatAt3(3, 1, 0)))
gocv.Line(&out, pt1, pt2, color.RGBA{0, 0, 255, 0}, 4)
gocv.Line(&out, pt2, pt3, color.RGBA{0, 0, 255, 0}, 4)
gocv.Line(&out, pt3, pt4, color.RGBA{0, 0, 255, 0}, 4)
gocv.Line(&out, pt4, pt1, color.RGBA{0, 0, 255, 0}, 4)
// creating output window with result
window := gocv.NewWindow("Output")
window.IMShow(out)
defer window.Close()
window.ResizeWindow(out.Cols(), out.Rows())
window.WaitKey(0)

} ` image 误差有点大,这个是什么问题

workyu avatar Apr 27 '21 02:04 workyu

for i := 0; i < len(good); i++ {
	obj.SetFloatAt(i, 0, float32(kp1[good[i].QueryIdx].Y))
	obj.SetFloatAt(i, 1, float32(kp1[good[i].QueryIdx].X))
	scene.SetFloatAt(i, 0, float32(kp2[good[i].TrainIdx].Y))
	scene.SetFloatAt(i, 1, float32(kp2[good[i].TrainIdx].X))
}

Switch X and Y to get correct points.

jeremyevith avatar May 18 '21 23:05 jeremyevith

image

并不行,还是有差距

workyu avatar May 19 '21 01:05 workyu

h := gocv.FindHomography(scene, &obj, gocv.HomograpyMethodRANSAC, 3, &dst, 2000, 0.995)

Here.

jeremyevith avatar May 19 '21 16:05 jeremyevith

image 修改了h := gocv.FindHomography(scene, &obj, gocv.HomograpyMethodRANSAC, 3, &dst, 2000, 0.995) 差的更远了

workyu avatar May 20 '21 00:05 workyu

h := gocv.FindHomography(scene, &obj, gocv.HomograpyMethodRANSAC, 3, &dst, 2000, 0.995)
......
scene_corners := gocv.NewMatWithSize(4, 2, gocv.MatTypeCV32FC2)
scene_corners.SetFloatAt(0, 0, 0)
scene_corners.SetFloatAt(0, 1, 0)
scene_corners.SetFloatAt(1, 0, float32(train.Cols()))
scene_corners.SetFloatAt(1, 1, 0)
scene_corners.SetFloatAt(2, 0, float32(train.Cols()))
scene_corners.SetFloatAt(2, 1, float32(train.Rows()))
scene_corners.SetFloatAt(3, 0, 0)
scene_corners.SetFloatAt(3, 1, float32(train.Rows()))
obj_corners := gocv.NewMatWithSize(4, 2, gocv.MatTypeCV32FC2)
gocv.PerspectiveTransform(scene_corners, &obj_corners, h)

pt1 := image.Pt(int(obj_corners.GetFloatAt(0, 0)), int(obj_corners.GetFloatAt(0, 1)))
pt2 := image.Pt(int(obj_corners.GetFloatAt(1, 0)), int(obj_corners.GetFloatAt(1, 1)))
pt3 := image.Pt(int(obj_corners.GetFloatAt(2, 0)), int(obj_corners.GetFloatAt(2, 1)))
pt4 := image.Pt(int(obj_corners.GetFloatAt(3, 0)), int(obj_corners.GetFloatAt(3, 1)))

jackeyjin2002 avatar Jan 29 '22 06:01 jackeyjin2002

Must remove z=0

jackeyjin2002 avatar Jan 29 '22 07:01 jackeyjin2002

老哥找到解决方法了吗

wodeyoulai avatar Mar 16 '23 07:03 wodeyoulai

老哥找到解决方法了吗

解决了,坐标顺序不对,

workyu avatar Mar 16 '23 07:03 workyu

可以具体说下是哪吗,我还不是很清楚

wodeyoulai avatar Mar 16 '23 08:03 wodeyoulai

可以具体说下是哪吗,我还不是很清楚

等我找找代码啊,太古老了,代码不好找,找到了我回复你

workyu avatar Mar 16 '23 08:03 workyu

等我找找代码啊,太古老了,代码不好找,找到了我回复你

好的,十分感谢

wodeyoulai avatar Mar 16 '23 08:03 wodeyoulai

等我找找代码啊,太古老了,代码不好找,找到了我回复你 我给SetFloatAt3 换成SetFloatAt 好了

wodeyoulai avatar Mar 16 '23 08:03 wodeyoulai