gpt4 book ai didi

opencv - 使用VIP实现透视变换

转载 作者:行者123 更新时间:2023-12-03 10:09:16 25 4
gpt4 key购买 nike

我正在尝试使用Go中的vips实现透视变换。我正在使用opencv的GetPerspectiveTransform方法来计算转换矩阵,然后按如下方式计算 map 图像

func DistortPerspective(ref *vips.ImageRef, tiepoints []float64) {
T := createTransform(tiepoints)

// make an index image where pixels have the value of their (x, y) coordinates
index, err := vips.XYZ(ref.Width(), ref.Height())
if err != nil {
logger.Debug(nil, err)
}

i0, err := index.Copy()
if err != nil {
logger.Debug(nil, err)
}
i1, err := index.Copy()
if err != nil {
logger.Debug(nil, err)
}
err = i0.ExtractBand(0, 1)
if err != nil {
logger.Debug(nil, err)
}
err = i1.ExtractBand(1, 1)
if err != nil {
logger.Debug(nil, err)
}

T00 := float64(T.GetFloatAt(0, 0))
T01 := float64(T.GetFloatAt(0, 1))
T02 := float64(T.GetFloatAt(0, 2))

T10 := float64(T.GetFloatAt(1, 0))
T11 := float64(T.GetFloatAt(1, 1))
T12 := float64(T.GetFloatAt(1, 2))

T20 := float64(T.GetFloatAt(2, 0))
T21 := float64(T.GetFloatAt(2, 1))
T22 := float64(T.GetFloatAt(2, 2))

// i0 * T[0,0]
i0xT00 := linear(i0, T00, 0)

// i1 * T[0,1] + T[0,2]
i1xT01_T02 := linear(i1, T01, T02)

// i0 * T[1,0]
i0xT10 := linear(i0, T10, 0)

// i1 * T[1,1] + T[1,2]
i1xT11_T12 := linear(i1, T11, T12)

//i[0] * T[0,0] + i[1] * T[0,1] + T[0,2]
i0xT00_i1xT01_T02 := add(i0xT00, i1xT01_T02)

//i[0] * T[1,0] + i[1] * T[1,1] + T[1,2]
i0xT10_i1xT11_T12 := add(i0xT10, i1xT11_T12)

//i[0] * T[2,0]
i0xT20 := linear(i0, T20, 0)

//i[1] * T[2,1] + T[2,2]
i1xT21_T22 := linear(i1, T21, T22)

//i[0] * T[2,0] + i[1] * T[2,1] + T[2,2]
i0xT20_i1xT21_T22 := add(i0xT20, i1xT21_T22)

//x = (i[0] * T[0,0] + i[1] * T[0,1] + T[0,2]) / (i[0] * T[2,0] + i[1] * T[2,1] + T[2,2])
x := divide(i0xT00_i1xT01_T02, i0xT20_i1xT21_T22)

//y = (i[0] * T[1,0] + i[1] * T[1,1] + T[1,2]) / (i[0] * T[2,0] + i[1] * T[2,1] + T[2,2])
y := divide(i0xT10_i1xT11_T12, i0xT20_i1xT21_T22)

//# join up x and y as a map image
mapimage := bandjoin(x, y)

//transform the original image
err = ref.Mapim(mapimage)
if err != nil {
logger.Debug(nil, err)
}
}
但是,由此产生的图像是错误的。我正在使用此Stack Overflow答案作为引用 How to perform perspective distort transformation in VIPS?
在我看来,opencv WarpPerspective方法具有类似的功能,因此我认为使用opencv计算变换系数会行得通。

最佳答案

答案有两个。
首先,使用GetDoubleAt(row int, col int)方法返回正确的float64而不是GetFloatAt(row int, col int)方法,该方法返回float32。转换以某种方式弄乱了数字。
第二,在计算变换矩阵的方法中,在GetPerspectiveTransform调用中,应翻转源和目标集。这是因为opencv的WarpPerspective方法隐式地反转了矩阵,而此实现则没有。

func createTransform(distortion []float64) gocv.Mat {
srcSet := []image.Point{
{X: int(distortion[0]), Y: int(distortion[1])},
{X: int(distortion[4]), Y: int(distortion[5])},
{X: int(distortion[8]), Y: int(distortion[9])},
{X: int(distortion[12]), Y: int(distortion[13])},
}
dstSet := []image.Point{
{X: int(distortion[2]), Y: int(distortion[3])},
{X: int(distortion[6]), Y: int(distortion[7])},
{X: int(distortion[10]), Y: int(distortion[11])},
{X: int(distortion[14]), Y: int(distortion[15])},
}
return gocv.GetPerspectiveTransform(dstSet, srcSet)
}

关于opencv - 使用VIP实现透视变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65353840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com