opengl绘制出多目相机配置场景

本文介绍如何将标定工具得到的Rt参数从相机坐标系转换到世界坐标系,并通过OpenGL进行三维相机模型的绘制。文章详细展示了使用Python和OpenGL进行坐标变换及模型绘制的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标定工具得到的Rt参数都表示原点在相机坐标系下的变换,因此后面绘制时需要将其转化到相机相对于原点的变换。
转化也很简单:
R’ --> R.T
T’ --> -R.T @ T
在这里插入图片描述
ok,下面就是简单的绘制了,直接看代码(shader资源链接):

import time
from OpenGL.GL import *
import numpy as np
from GEngine.shader import ShaderProgram
from GEngine.model import Model, ModelFromExport, generate_grid_mesh
import glm
from GEngine.camera3D import Camera3D
from GEngine.window import GWindow

SCR_WIDTH = 800
SCR_HEIGHT = 800

# camera = Camera3D(glm.vec3(0.0, 5.0, 30.0))
camera = Camera3D(glm.vec3(-82.702095, 552.18964, 5557.3535), movement_speed=3500)
window = GWindow("demo", SCR_WIDTH, SCR_HEIGHT, camera, keep_mouse_stay=True)

light_color = (1.0, 1.0, 1.0)
hand_color = (0.7, 0.7, 0.7)
light_position = (-10, 6, 10)

grid_position = [
    glm.vec3(1.0, 1.0, 1.0),
    [glm.radians(90), glm.vec3(1.0, 0.0, 0.0)],
    glm.vec3(0, 0.0, 0)
]
##相机配置 R 3x3 t 3x1
camera_config1 = [
    [[[-0.9115695, 0.41064942, 0.02020282], [0.06090775, 0.18347366, -0.9811359], [-0.4066096, -0.893143, -0.19226073]],
     [[-82.702095], [552.18964], [5557.3535]]],
    [[[0.93101627, 0.3647627, 0.01252435], [0.08939715, -0.19463754, -0.97679293],
      [-0.3538599, 0.91052973, -0.21381946]], [[-209.06287], [375.06915], [5818.277]]],
    [[[-0.92090756, -0.38473552, -0.06251254], [-0.02568138, 0.21992028, -0.97517973],
      [0.38893405, -0.89644504, -0.21240678]], [[623.0986], [290.9053], [5534.379]]],
    [[[0.9276671, -0.36360627, 0.08499598], [-0.01666269, -0.26770413, -0.9633571],
      [0.37303644, 0.89225835, -0.25439897]], [[-178.367], [423.46698], [4421.645]]]
]

camera_config2 = [
    [[[-0.9153617, 0.40180838, 0.02574755], [0.05154812, 0.18037356, -0.9822465],
      [-0.39931902, -0.89778364, -0.18581952]], [[-346.0509], [546.98083], [5474.481]]],
    [[[0.92816836, 0.37215385, 0.00224838], [0.08166409, -0.1977723, -0.9768404], [-0.36309022, 0.9068559, -0.2139576]],
     [[251.4252], [420.94223], [5588.196]]],
    [[[-0.91415495, -0.40277803, -0.04572295], [-0.04562341, 0.2143085, -0.97569996],
      [0.4027893, -0.8898549, -0.21428728]], [[480.4826], [253.83238], [5704.2075]]],
    [[[0.91415626, -0.40060705, 0.06190599], [-0.05641001, -0.2769532, -0.9592262],
      [0.40141782, 0.8733905, -0.27577674]], [[51.883537], [378.4209], [4406.1494]]]
]
rorate_x_90 = np.array([[1, 0, 0, 0],
                        [0, 0, 1, 0],
                        [0, -1, 0, 0],
                        [0, 0, 0, 1]], dtype=np.float32)


def init():
    grid_vertices, grid_mesh = generate_grid_mesh(-10, 10, step=0.5)

    global shader_program
    shader_program = ShaderProgram("resources/shaders/shader.vs", "resources/shaders/shader.fg")
    shader_program.init()

    global grid_model
    grid_model = Model([grid_vertices], indices=[grid_mesh])

    global camera_shader_program
    camera_shader_program = ShaderProgram("resources/shaders/camera_shader.vs", "resources/shaders/camera_shader.fg")
    camera_shader_program.init()

    global camera_model
    camera_vertices = np.array([0, 0, 0, 0, 0, -1, -1, 2, 0, 0,
                                0, 0, 0, 0, 0, 1, 1, 2, 0, 0,
                                0, 0, 0, 0, 0, 1, -1, 2, 0, 0,
                                0, 0, 0, 0, 0, -1, 1, 2, 0, 0,
                                -1, 1, 2, 0, 0, -1, -1, 2, 0, 0,
                                -1, -1, 2, 0, 0, 1, -1, 2, 0, 0,
                                1, -1, 2, 0, 0, 1, 1, 2, 0, 0,
                                1, 1, 2, 0, 0, -1, 1, 2, 0, 0], dtype=np.float32)

    camera_model = Model([camera_vertices]) 

    glEnable(GL_DEPTH_TEST)


def render():
    glClearColor(0, 0, 0, 0.0)
    glClearDepth(1.0)
    glPointSize(5)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    projection = glm.perspective(glm.radians(camera.zoom), window.window_width * 1.0 / window.window_height, 0.1,
                                 100000)
    view = camera.get_view_matrix()

    #
    # draw grid
    shader_program.use()
    shader_program.set_matrix("projection", glm.value_ptr(projection))
    shader_program.set_matrix("view", glm.value_ptr(view))

    m = glm.mat4(1.0)
    m = glm.translate(m, grid_position[2])
    m = glm.rotate(m, glm.radians(90), grid_position[1][1])
    m = glm.scale(m, glm.vec3(650))
    shader_program.set_matrix("model", glm.value_ptr(m))

    shader_program.un_use()
    grid_model.draw(shader_program, draw_type=GL_LINES)

    for conf in camera_config1:
        #
        # draw cameras
        camera_shader_program.use()
        camera_shader_program.set_matrix("projection", glm.value_ptr(projection))
        camera_shader_program.set_matrix("view", glm.value_ptr(view))
        camera_shader_program.set_uniform_3f("camera_color", [1., 0., 0.])

        m_rt = np.eye(4, dtype=np.float32)
        r = np.array(conf[0], dtype=np.float32).T
        m_rt[:-1, -1] = -r @ np.array(conf[1], dtype=np.float32).squeeze()
        m_rt[:-1, :-1] = r

        m_s = np.eye(4, dtype=np.float32) * 250
        m_s[3, 3] = 1

        camera_shader_program.set_matrix("model", (rorate_x_90 @ m_rt @ m_s).T)

        camera_shader_program.un_use()
        camera_model.draw(camera_shader_program, draw_type=GL_LINES)

    for conf in camera_config2:
        #
        # draw cameras
        camera_shader_program.use()
        camera_shader_program.set_matrix("projection", glm.value_ptr(projection))
        camera_shader_program.set_matrix("view", glm.value_ptr(view))
        camera_shader_program.set_uniform_3f("camera_color", [0., 1., 0.])

        m_rt = np.eye(4, dtype=np.float32)
        r = np.array(conf[0], dtype=np.float32).T
        m_rt[:-1, -1] = -r @ np.array(conf[1], dtype=np.float32).squeeze()
        m_rt[:-1, :-1] = r

        m_s = np.eye(4, dtype=np.float32) * 250
        m_s[3, 3] = 1

        camera_shader_program.set_matrix("model", (rorate_x_90 @ m_rt @ m_s).T)

        camera_shader_program.un_use()
        camera_model.draw(camera_shader_program, draw_type=GL_LINES)

def main():
    init()
    window.set_render_function(render)
    window.start_window_loop()


if __name__ == "__main__":
    main()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值