在 OpenGL 中在 3D 模型后面绘制背景视频

2023-12-24

我想通过这个脚本绘制 3D 模型(.obj)
https://github.com/yarolig/OBJFileLoader/blob/master/OBJFileLoader/objloader.py https://github.com/yarolig/OBJFileLoader/blob/master/OBJFileLoader/objloader.py
作为背景,我想从网络摄像头绘制视频。但是当我绘制图像和 3D 模型时,仅显示图像。
这是我的图像加载器类

class ImageLoader:

    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.width = 0
        self.height = 0
        self.img_data = 0

    def load(self, image):
        im = image
        tx_image = cv2.flip(im, 0)
        tx_image = Image.fromarray(tx_image)
        self.width = tx_image.size[0]
        self.height = tx_image.size[1]
        self.img_data = tx_image.tobytes('raw', 'BGRX', 0, -1)

        self.Texture = glGenTextures(1)
        glBindTexture(GL_TEXTURE_2D, self.Texture)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, self.width, self.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, self.img_data)

    def draw(self):
        glEnable(GL_TEXTURE_2D)
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
        glTranslate(self.x, self.y, 0)
        glBegin(GL_QUADS)
        glVertex(0, 0, 0)
        glTexCoord2f(0, 0)
        glVertex(self.width, 0, 0)
        glTexCoord2f(0, 1)
        glVertex(self.width, self.height, 0)
        glTexCoord2f(1, 1)
        glVertex(0, self.height, 0)
        glTexCoord2f(1, 0)
        glEnd()
        glDisable(GL_TEXTURE_2D)
        glFlush()

代码在这里运行。

 if __name__ == '__main__':

    cap = cv2.VideoCapture(0)
    width = int(cap.get(3))
    height = int(cap.get(4))

    pygame.init()
    pygame.display.set_mode((width, height), pygame.DOUBLEBUF | pygame.OPENGL)

    box = OBJ('3dglasses/oculos.obj', ) # from OBJFileLoader import OBJ

    gluPerspective(45, (width / height), 0.1, 50.0)
    glTranslate(0.0, 0.0, -5)
    glRotate(0, 0, 0, 0)

    if True:
        glClearColor(0.7, 0, 0, 1)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        gluOrtho2D(0, width, height, 0)
        im_loader = ImageLoader(0, 0)
        while True:
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    quit()

            success, image = cap.read()
            im_loader.load(image)
            im_loader.draw()

            box.render()
            pygame.display.flip()

图像和模型使用不同的投影和模型视图矩阵。因此,在绘制对象之前需要设置矩阵。

由于未通过模型,因此未绘制模型深度测试 https://www.khronos.org/opengl/wiki/Depth_Test。 绘制图像时禁用深度测试。如果禁用深度测试,则不会向深度缓冲区写入任何内容。

if __name__ == '__main__':
    cap = cv2.VideoCapture(0)
    width, height = int(cap.get(3)), int(cap.get(4))
    pygame.init()
    pygame.display.set_mode((width, height), pygame.DOUBLEBUF | pygame.OPENGL)
    box = OBJ('3dglasses/oculos.obj', ) # from OBJFileLoader import OBJ
    im_loader = ImageLoader(0, 0)
    angle = 0

    glClearColor(0.7, 0, 0, 1)
    run = True
    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
               run = False

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        gluOrtho2D(0, width, height, 0)
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()

        glDisable(GL_DEPTH_TEST)
        success, image = cap.read()
        if success:
            im_loader.load(image)
        glColor3f(1, 1, 1)
        im_loader.draw()
        
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        gluPerspective(45, (width / height), 0.1, 50.0)
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
        glTranslate(0.0, 0.0, -5)
        glRotate(angle, 0, 1, 0)
        angle += 1
        
        glEnable(GL_DEPTH_TEST)
        box.render()

        pygame.display.flip()

    pygame.quit()
    quit()

当前纹理坐标,与顶点相关联glVertex叫做。因此,在指定顶点坐标之前需要指定纹理坐标:

class ImageLoader:
    # [...]

    def draw(self):
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
        glTranslate(self.x, self.y, 0)
        
        glEnable(GL_TEXTURE_2D)  
        glBegin(GL_QUADS)
        glTexCoord2f(0, 0)
        glVertex2f(0, 0)
        glTexCoord2f(1, 0)
        glVertex2f(self.width, 0)
        glTexCoord2f(1, 1)
        glVertex2f(self.width, self.height)
        glTexCoord2f(0, 1)
        glVertex2f(0, self.height)
        glEnd()
        glDisable(GL_TEXTURE_2D)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 OpenGL 中在 3D 模型后面绘制背景视频 的相关文章

随机推荐

  • 使窗口成为桌面的一部分

    我想创建一个窗口 CreateWindowEx WS EX TOOLWINDOW WS EX LAYERED wc lpszClassName 0 WS POPUP WS VISIBLE WS SYSMENU a part桌面的 我知道这可
  • 2020 年以上,Typescript 在运行时使用类型防护按类型或接口检查对象

    对我来说 大多数时候 需要动态检查来验证获取响应 我在想 对于具有多个道具和附加检查的任何类型的对象 可以使用用户定义的类型保护以通用方式完成此操作 因此可以使用类似的方法 这是一个带有示例对象的示例 但我想要一个没有它的函数 https
  • postgresql 中的慢 OR 语句

    我目前的 postgresql 查询由于 OR 语句而变慢 因此 它显然没有使用索引 到目前为止 重写此查询失败 查询 EXPLAIN ANALYZE SELECT a0 id AS id0 FROM advert a0 INNER JOI
  • 抑制 Xcode 中已弃用的警告

    由于所有 SDK 都在使用 因此能够方便地针对多个 SDK 和平台进行构建 然而 从 3 2 跳到 3 0 甚至偶尔跳到 2 x 我经常收到涉及已更改或被取代的方法的弃用警告 warning UIKeyboardBoundsUserInfo
  • JPA - 仅针对给定查询强制延迟加载

    如何仅针对给定的 NamedQuery 实施延迟加载策略 例如 考虑下面的伪代码 只是为了解释这种情况 我有一个实体 Entity class Xyz int a int b Fetch EAGER Set
  • pandas 数据框 groupby 和 join

    让我们假设有这样的 np random seed 123 df pd DataFrame A foo bar foo bar foo bar foo foo B one one two three two two one three C n
  • NLTK - 获取并简化标签列表

    我正在使用布朗语料库 我想要某种方法来打印所有可能的标签及其名称 而不仅仅是标签缩写 标签也不少 有没有办法 简化 标签呢 我所说的简化是指将两个极其相似的标签合并为一个 然后用另一个标签重新标记合并后的单词 之前以某种方式讨论过 Java
  • 仅 DIV 的两列 CSS 布局

    我正在重新设计当前使用表格进行两列设计的布局 并遇到了一些问题 div div div blah div div div div blah div div blah div div div leftCol margin right 10px
  • 如何使用反射获取泛型类的名称?

    如何使用反射获取泛型类的名称 eg public class SomeGenericClass
  • Android 地理围栏的最大限制?

    我从 Google Play 服务的地理围栏 API 开始 我想我理解了一般概念 但我不知道地理围栏是否有限制 我将地理围栏列表提供给位置客户端 然后由他处理其余的事情 但是我可以将多少个地理围栏传递给位置客户端 我想要多少就多少 每个设备
  • 直接在 .htaccess 文件内生成随机数

    目前我正在添加一个随机数到我的结束Ajax通过 Javascript 或 PHP 的 URL 我想知道我是否可以在我的内心做同样的事情 htaccess文件 当我使用 mod rewrite 重写它们时 有什么办法可以制作一个随机数 or
  • ng-click刷新页面而不是提交

    您好 我有一个有角度的 Web 表单 它接受用户的输入并插入到数据库中 我正在使用 jersey jackson Rest Web 服务和 hibernate 但是当我尝试提交表单时 上一页有指向当前页面的超链接刷新页面并再次重新加载当前页
  • spring boot数据库错误数据源“org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration”

    我正在使用 spring boot hibernate 和 my sql 但出现错误 org springframework beans factory UnsatisfiedDependencyException Error creati
  • 从 UICollectionViewCell 实例访问图像时遇到问题

    我正在按照本教程对我的项目进行一些修改 http www appcoda com ios programming uicollectionview tutorial http www appcoda com ios programming
  • PhoneGap 和 WhatsApp

    我希望你能帮助我找到解决我问题的问题 我正在开发一个应该使用 WhatsApp 的应用程序 该应用程序使用 HTML5 CSS3 和 Javascript 我正在使用此链接通过 WhatsApp 发送消息 a href 当您直接使用浏览器时
  • 如何配置S3BotoStorage或collectstatic上传到s3存储桶子目录

    有没有办法配置 django 的collectstatic命令上传到s3存储桶中的子目录 而不仅仅是顶级目录 Thanks 如果您正在使用S3BotoStorage发动机来自django storages然后有一个名为的设置变量AWS LO
  • 自己计算协方差矩阵(不使用“cov”)

    我正在关注有关协方差矩阵的教程 可以在这里找到 http stats seandolinar com making a covariance matrix in r http stats seandolinar com making a c
  • Android Studio、Github登录问题凭证不正确

    我已经开始使用 Android Studio 在尝试连接到 Github 时发现了问题 我尝试过重新启动 Android Studio 甚至创建一个新项目 但无法登录 我安装了 Git 它在本地存储库中运行 问题是 凭据不正确请求响应 40
  • groupby 沿 xarray 中单个维度的多个坐标

    我有一个沿单个维度具有多个坐标的 xarray 在下面的示例中 坐标a and b沿维度定义dim1 我会怎样groupby使用沿相同维度定义的两个坐标 不像这个问题 https stackoverflow com questions 52
  • 在 OpenGL 中在 3D 模型后面绘制背景视频

    我想通过这个脚本绘制 3D 模型 obj https github com yarolig OBJFileLoader blob master OBJFileLoader objloader py https github com yaro