计算机视觉中的3D变换:让虚拟与现实无缝对接

news2024/11/26 3:36:01

嘿,小伙伴们!今天咱们聊聊计算机视觉中的3D变换,这是连接虚拟世界与现实世界的桥梁!无论你是想为游戏开发增添真实感,还是希望在增强现实中实现精准定位,这篇教程都会让你受益匪浅。准备好了吗?一起来探索3D变换的魅力吧!✨


📊 什么是3D变换?

在计算机视觉中,3D变换是指对三维空间中的物体进行位置、姿态和大小等属性的变化。常见的3D变换包括平移(Translation)、旋转(Rotation)、缩放(Scaling)以及投影(Projection)。这些变换不仅能够帮助我们在虚拟环境中更好地模拟现实,还能应用于AR/VR、机器人视觉等领域。

🧪 实战案例:用Python实现3D变换

假设我们正在开发一个AR应用,需要在现实世界的图像中添加一个3D模型。为了实现这一点,我们需要对3D模型进行变换,使其与相机的视角相匹配。让我们通过Python来实现这一过程。

🛠️ 准备工作

首先,确保你已经安装了必要的库:

pip install numpy opencv-python

1. 加载3D模型

我们将使用一个简单的立方体作为3D模型,并加载所需的库。

import cv2
import numpy as np

# 定义3D立方体的顶点坐标
cube_vertices = np.array([
    [-1, -1, 1],
    [1, -1, 1],
    [1, 1, 1],
    [-1, 1, 1],
    [-1, -1, -1],
    [1, -1, -1],
    [1, 1, -1],
    [-1, 1, -1]
], dtype=np.float32)

2. 定义变换矩阵

我们需要定义一个变换矩阵,用于描述3D模型的位置、旋转和缩放。

def get_transformation_matrix(translation=(0, 0, 0), rotation=(0, 0, 0), scaling=(1, 1, 1)):
    # 平移矩阵
    T = np.array([
        [1, 0, 0, translation[0]],
        [0, 1, 0, translation[1]],
        [0, 0, 1, translation[2]],
        [0, 0, 0, 1]
    ])

    # 旋转矩阵
    R = np.array([
        [np.cos(rotation[0]), -np.sin(rotation[0]), 0, 0],
        [np.sin(rotation[0]), np.cos(rotation[0]), 0, 0],
        [0, 0, 1, 0],
        [0, 0, 0, 1]
    ])

    # 缩放矩阵
    S = np.array([
        [scaling[0], 0, 0, 0],
        [0, scaling[1], 0, 0],
        [0, 0, scaling[2], 0],
        [0, 0, 0, 1]
    ])

    return T @ R @ S

3. 应用变换

接下来,我们应用变换矩阵来更新3D模型的位置。

def apply_transformation(vertices, transformation_matrix):
    # 将顶点坐标转换为齐次坐标
    vertices_homogeneous = np.hstack((vertices, np.ones((vertices.shape[0], 1))))
    
    # 应用变换
    transformed_vertices = transformation_matrix @ vertices_homogeneous.T
    
    # 归一化齐次坐标
    transformed_vertices /= transformed_vertices[-1]
    
    return transformed_vertices.T[:, :3].astype(float)

4. 绘制变换后的3D模型

最后,我们需要将变换后的3D模型绘制到图像上。

def draw_cube_on_image(image, vertices, camera_matrix, distortion_coeffs=None):
    # 投影矩阵
    projected_points = cv2.projectPoints(vertices, np.zeros(3), np.zeros(3), camera_matrix.astype(float), distortion_coeffs)[0]
    
    # 绘制连线
    edges = [(0, 1), (1, 2), (2, 3), (3, 0),
             (4, 5), (5, 6), (6, 7), (7, 4),
             (0, 4), (1, 5), (2, 6), (3, 7)]
    
    for edge in edges:
        pt1 = tuple(projected_points[edge[0]].ravel().astype(int))
        pt2 = tuple(projected_points[edge[1]].ravel().astype(int))
        cv2.line(image, pt1, pt2, (255, 0, 0), 2)

    return image

5. 完整代码

结合上述步骤,完整代码如下:

# 假设相机内参
camera_matrix = np.array([
    [1000, 0, 320],
    [0, 1000, 240],
    [0, 0, 1]
])

image = np.zeros((480, 640, 3), np.uint8) + 255

transformation_matrix = get_transformation_matrix(
    translation=(0, 0, -5),
    rotation=(np.pi/4, 0, 0),
    scaling=(1, 1, 1)
)

transformed_vertices = apply_transformation(cube_vertices, transformation_matrix)

result = draw_cube_on_image(image, transformed_vertices, camera_matrix)

cv2.imshow("Cube in AR", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

🎨 成功案例

现在,当运行这段代码时,你会看到一个经过变换的3D立方体被正确地投影到图像上。这就是如何使用Python和OpenCV实现3D变换的全部内容啦!

效果展示:

在这里插入图片描述


🌟 小贴士
  • 变换顺序:注意变换矩阵的顺序(平移、旋转、缩放),不同的顺序会导致不同的结果。
  • 相机校准:在实际应用中,需要根据相机的具体参数调整相机矩阵。
🚀 结语

通过今天的实战演练,大家已经学会了如何使用Python来实现3D变换。这些简单的变换是构建复杂3D视觉应用的基础,掌握了它们,你就迈出了AR/VR开发的第一步!如果你有任何问题或想法,欢迎在评论区留言交流。喜欢我的朋友请点赞,收藏并关注我,我们下次再见!👋


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2195053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python数据分析与可视化工具介绍-matplotlib库

众所周知,python的数据分析库主要是numpy,pandas,和matplotlib,而前面两个主要是数据处理工具库,最后一个才是真正的作图展示工具库。本节来学习一下matploatlib工具库的使用。 Matplotlib常用绘图函数 pyplot简介 m…

Kubernetes: kube-proxy 和 CNI 是如何协作的?

在 Kubernetes 中,kube-proxy 和 CNI 插件协同工作,确保集群内 Pod 之间的互联互通。 Kube-proxy & CNI 如上图所示,假设我们有一个类型为 ClusterIP 的 Service,它对应两个位于不同节点的 Pod。 当我们从 Pod A 对该 Servi…

C语言的柔性数组

目录 柔性数组1.柔性数组的特点:2.柔性数组的使用3.柔性数组的优势 柔性数组 也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。 C99 中,结构体中的最后⼀个元素允许是未知⼤⼩的数组&…

MFC工控项目实例二十三模拟量输入设置界面

承接专栏《MFC工控项目实例二十二主界面计数背景颜色改变》 1、在SenSet.h文件中添加代码 #include "BtnST.h" #include "ShadeButtonST.h"/ // SenSet dialogclass SenSet : public CDialog { // Construction public:SenSet(CWnd* pParent NULL); //…

aws(学习笔记第三课) AWS CloudFormation

aws(学习笔记第三课) 使用AWS CloudFormation 学习内容: AWS CloudFormation的模板解析使用AWS CloudFormation启动ec2 server 1. AWS CloudFormation 的模版解析 CloudFormation模板结构 CloudFormation是AWS的配置管理工具,属于Infrastructure as Co…

黑马javaWeb笔记重点备份2:mybatis基础(注解方式)、数据库连接池概念、lombok使用

以下均来自:【黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)】 https://www.bilibili.com/video/BV1m84y1w7Tb/?p75&share_sourcecopy_web&vd_source9332b8fc5ea8d349a…

AI 激活新势能,中小企业全媒体营销绽放无限可能

什么是全媒体营销: 全媒体营销是一种利用多种媒介渠道进行品牌、产品或服务推广的营销策略。它结合了传统媒体(如电视、广播、报纸、杂志)和新媒体(如互联网、社交媒体、移动应用等)的优势,以实现信息的广…

vivado 使用 UltraFast 设计方法系统级设计流程图

下图展示了 Vivado Design Suite 中包含的各种设计步骤以及特性。您可以通过赛灵思 Documentation Navigator“Design Hub View” 访问该图的互动版,单击每个步骤将链接至相关资源。 理解 UltraFast 设计方法概念 在设计开始初期就采取正确方法非常重要&#xf…

数据结构与算法笔记:概念与leetcode练习题

1、数组Array 时间复杂度 数组访问:O(1) 数组搜索:O(N) 数组插入:O(N) 数组删除:O(N) 特点 适合读,不适合写 数组常用操作 # 1、创建数组 a [] # 2、尾部添加元素 a.append(1) a.append(2) a.append(3) # 3、…

《Linux从小白到高手》理论篇:Linux的系统环境管理

List item 值此国庆佳节,深宅家中,闲来无事,就多写几篇博文。本篇详细深入介绍Linux的系统环境管理。 环境变量 linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示…

大语言模型(LLM)综述

大语言模型(LLM)综述 正如缩放定律(Scaling Laws )所预测的那样, LLM 的通用语言理解和生成能力是通过在大量文本数据上训练数十亿个模型参数获得的。基于 Transformer 的大型语言模型 (LLM) 的最新进展(在 Web 规模的…

系统架构设计师⑧:软件工程-软件开发方法与模型

系统架构设计师⑧:软件工程-软件开发方法与模型 软件开发方法 常用的软件开发方法主要分为3类: 结构化法(比如C语言开发-面向过程), 面向对象法(比如C或者JAVA开发-面向对象), 面向…

永洪科技第八届全国用户大会,释放数据价值!

永洪科技,作为“致力于打造全球领先的数据技术厂商”,将于【2024年11月1日】,在【北京东方君悦大酒店】盛大召开“第八届永洪科技全国用户大会”。旨在通过AIBI的深入融合,更加智能且精准的展现及预测未来的数据走向,展…

10.7学习

1.安全认证 ●Session 认证中最常用的一种方式,也是最简单的。存在多节点session丢失的情况,可通过nginx粘性Cookie和Redis集中式Session存储解决 ●HTTP Basic Authentication 服务端针对请求头中base64加密的Authorization 和用户名和密码进行校验。…

分层解耦-03.IOCDI-入门

一. IOC&DI入门 二.控制转移注解Component 因为dao和service接口的实现类对象需要传入到service和controller中,因此需要将dao和service代码加上Component注解,使之实现控制反转,将实现类对象交给IOC容器管理,成为IOC容器中…

字符编码发展史5 — UTF-16和UTF-32

上一篇《字符编码发展史4 — Unicode与UTF-8》我们讲解了Unicode字符集与UTF-8编码。本篇我们将继续讲解字符编码的第三个发展阶段中的UTF-16和UTF-32。 2.3. 第三个阶段 国际化 2.3.2. Unicode的编码方式 2.3.2.2. UTF-16 UTF-16也是一种变长编码,对于一个Unic…

构建快速应用,国内低代码开发平台的选择指南

本文盘点10款主流低代码开发平台,包括ZohoCreator、阿里宜搭等,分析其特点及应用场景。各平台各具优势,适用于不同企业和业务需求,建议企业根据自身需求和技术水平试用后选择。 一、Zoho Creator Zoho Creator 是一个低代码开发平…

软件设计之SSM(8)

软件设计之SSM(8) 路线图推荐: 【Java学习路线-极速版】【Java架构师技术图谱】 尚硅谷新版SSM框架全套视频教程,Spring6SpringBoot3最新SSM企业级开发 资料可以去尚硅谷官网免费领取 学习内容: Mybatis 数据输出多表映射动态语句 1、数…

【Linux】基础IO(文件描述符、缓冲区、重定向)

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12625432.html 目录 前言 C文件IO相关操作 系统文件I/O open open函数返回值 文件描述符fd re…

Rspamd:开源垃圾邮件过滤系统

Rspamd 是一个开源垃圾邮件过滤和电子邮件处理框架,旨在根据各种规则评估消息,包括正则表达式、统计分析以及与 URL 黑名单等自定义服务的集成。 系统会分析每封邮件并做出判定,MTA可据此采取进一步行动,例如拒绝邮件或添加垃圾邮…