gpt4 book ai didi

android - 如何使用 OpenGL 模拟 OpenCV 的 warpPerspective 功能(透视变换)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:59 30 4
gpt4 key购买 nike

我已经在 Python 和 C++ 中使用 OpenCV 完成了图像变形,看到可口可乐标志在我选择的角落里变形了:

final image

使用以下图片:

logo image

还有这个:

enter image description here

Full album with transition pics and description here

我确实需要这样做,但在 OpenGL 中。我会有:

  • 我必须在其中绘制变形图像的角

  • 映射 Logo 图像变换的单应矩阵进入您在最终图像中看到的 Logo 图像(使用 OpenCV 的warpPerspective),像这样:

    [[  2.59952324e+00,   3.33170976e-01,  -2.17014066e+02],
    [ 8.64133587e-01, 1.82580111e+00, -3.20053715e+02],
    [ 2.78910149e-03, 4.47911310e-05, 1.00000000e+00]]
  • 主图(此处为跑道图)

  • 叠加图片(此处为可口可乐图片)

这可能吗?我已经阅读了很多内容并开始阅读 OpenGL 基础教程,但是我能用我所拥有的来完成吗? OpenGL 实现是否会更快,比如大约 10 毫秒?

我目前正在玩这个教程: http://ogldev.atspace.co.uk/www/tutorial12/tutorial12.html我正朝着正确的方向前进吗? OpenGL新手在此,请多包涵。谢谢。

最佳答案

在尝试了此处和其他地方提出的一些解决方案之后,我最终通过编写一个复制“warpPerspective”功能的 fragment 着色器来解决这个问题。

fragment 着色器代码如下所示:

varying highp vec2 textureCoordinate;

uniform sampler2D inputImageTexture;

// NOTE: you will need to pass the INVERSE of the homography matrix, as well as
// the width and height of your image as uniforms!
uniform highp mat3 inverseHomographyMatrix;
uniform highp float width;
uniform highp float height;

void main()
{
// Texture coordinates will run [0,1],[0,1];
// Convert to "real world" coordinates
highp vec3 frameCoordinate = vec3(textureCoordinate.x * width, textureCoordinate.y * height, 1.0);

// Determine what 'z' is
highp vec3 m = inverseHomographyMatrix[2] * frameCoordinate;
highp float zed = 1.0 / (m.x + m.y + m.z);
frameCoordinate = frameCoordinate * zed;

// Determine translated x and y coordinates
highp float xTrans = inverseHomographyMatrix[0][0] * frameCoordinate.x + inverseHomographyMatrix[0][1] * frameCoordinate.y + inverseHomographyMatrix[0][2] * frameCoordinate.z;
highp float yTrans = inverseHomographyMatrix[1][0] * frameCoordinate.x + inverseHomographyMatrix[1][1] * frameCoordinate.y + inverseHomographyMatrix[1][2] * frameCoordinate.z;

// Normalize back to [0,1],[0,1] space
highp vec2 coords = vec2(xTrans / width, yTrans / height);

// Sample the texture if we're mapping within the image, otherwise set color to black
if (coords.x >= 0.0 && coords.x <= 1.0 && coords.y >= 0.0 && coords.y <= 1.0) {
gl_FragColor = texture2D(inputImageTexture, coords);
} else {
gl_FragColor = vec4(0.0,0.0,0.0,0.0);
}
}

请注意,我们在此处传递的单应矩阵是INVERSE HOMOGRAPHY MATRIX!您必须反转要传递给“warpPerspective”的单应矩阵 - 否则此代码将不起作用。

顶点着色器除了传递坐标外什么都不做:

// Vertex shader
attribute vec4 position;
attribute vec4 inputTextureCoordinate;

varying vec2 textureCoordinate;

void main() {
// Nothing happens in the vertex shader
textureCoordinate = inputTextureCoordinate.xy;
gl_Position = position;
}

传入未改变的纹理坐标和位置坐标(即 textureCoordinates = [(0,0),(0,1),(1,0),(1,1)] 和 positionCoordinates = [(-1,-1 ),(-1,1),(1,-1),(1,1)],对于三角形带),这应该可行!

关于android - 如何使用 OpenGL 模拟 OpenCV 的 warpPerspective 功能(透视变换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33018652/

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