当前位置: 首页 > ds >正文

相机内参 opencv

视场角定相机内参

import numpy as np
import cv2
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3Ddef calculate_camera_intrinsics(image_width=640, image_height=480, fov=55, is_horizontal=True):"""计算相机内参矩阵参数:image_width: 图像宽度(像素)image_height: 图像高度(像素)fov: 视野角(度)is_horizontal: 是否为水平视野角返回:K: 相机内参矩阵focal_length: 焦距(像素)"""# 将FOV从度转换为弧度fov_rad = np.radians(fov)# 计算焦距if is_horizontal:focal_length = (image_width / 2) / np.tan(fov_rad / 2)else:focal_length = (image_height / 2) / np.tan(fov_rad / 2)# 主点(通常位于图像中心)cx = image_width / 2cy = image_height / 2# 构建相机内参矩阵K = np.array([[focal_length, 0, cx], [0, focal_length, cy], [0, 0, 1]], dtype=np.float32)return K, focal_lengthdef visualize_camera_model(K, image_size, title="相机模型可视化"):"""可视化相机模型和视野"""fig = plt.figure(figsize=(10, 8))ax = fig.add_subplot(111, projection='3d')# 相机位置camera_pos = np.array([0, 0, 0])# 图像平面尺寸width, height = image_size# 焦距fx = K[0, 0]fy = K[1, 1]cx = K[0, 2]cy = K[1, 2]# 假设图像平面在z=f处z = fx# 计算图像平面四个角点的3D坐标top_left = np.array([(0 - cx) * z / fx, (0 - cy) * z / fy, z])top_right = np.array([(width - cx) * z / fx, (0 - cy) * z / fy, z])bottom_left = np.array([(0 - cx) * z / fx, (height - cy) * z / fy, z])bottom_right = np.array([(width - cx) * z / fx, (height - cy) * z / fy, z])# 绘制相机位置ax.scatter(camera_pos[0], camera_pos[1], camera_pos[2], c='r', marker='o', s=100, label='相机位置')# 绘制从相机到图像平面四角的视线for corner in [top_left, top_right, bottom_left, bottom_right]:ax.plot([camera_pos[0], corner[0]], [camera_pos[1], corner[1]], [camera_pos[2], corner[2]], 'b-', alpha=0.5)# 绘制图像平面x = np.array([top_left[0], top_right[0], bottom_right[0], bottom_left[0], top_left[0]])y = np.array([top_left[1], top_right[1], bottom_right[1], bottom_left[1], top_left[1]])z = np.array([top_left[2], top_right[2], bottom_right[2], bottom_left[2], top_left[2]])ax.plot(x, y, z, 'g-', alpha=0.8)# 设置坐标轴范围max_range = max(width, height, fx) * 0.5ax.set_xlim([-max_range, max_range])ax.set_ylim([-max_range, max_range])ax.set_zlim([0, max_range * 2])# 设置坐标轴标签ax.set_xlabel('X轴')ax.set_ylabel('Y轴')ax.set_zlabel('Z轴')# 设置视角ax.view_init(elev=20, azim=30)# 添加标题和图例ax.set_title(title)ax.legend()plt.tight_layout()plt.show()def visualize_camera_model_opencv(K, image_size, title="相机模型可视化"):"""使用OpenCV可视化相机模型和视野"""# 创建空白图像width, height = image_sizecanvas = np.ones((height, width, 3), dtype=np.uint8) * 255# 焦距和主点fx = K[0, 0]fy = K[1, 1]cx = K[0, 2]cy = K[1, 2]# 相机位置(图像中心)camera_center = (int(cx), int(cy))# 计算视野边界点fov_scale = min(width, height) * 0.4  # 视野显示比例# 计算四个方向的视野边界点points = [(int(cx), int(cy - fov_scale)),  # 上(int(cx + fov_scale), int(cy)),  # 右(int(cx), int(cy + fov_scale)),  # 下(int(cx - fov_scale), int(cy)),  # 左]# 绘制视野范围(矩形)cv2.rectangle(canvas, (points[3][0], points[0][1]), (points[1][0], points[2][1]), (0, 255, 0), 2)# 绘制主点cv2.circle(canvas, camera_center, 5, (0, 0, 255), -1)cv2.putText(canvas, "主点", (camera_center[0] + 10, camera_center[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)# 绘制坐标轴axis_length = 100cv2.arrowedLine(canvas, camera_center, (camera_center[0] + axis_length, camera_center[1]), (255, 0, 0), 2)  # X轴(蓝色)cv2.arrowedLine(canvas, camera_center, (camera_center[0], camera_center[1] + axis_length), (0, 0, 255), 2)  # Y轴(红色)# 添加焦距信息cv2.putText(canvas, f"fx: {fx:.2f}", (20, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 0), 2)cv2.putText(canvas, f"fy: {fy:.2f}", (20, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 0), 2)# 添加标题cv2.putText(canvas, title, (20, height - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 0), 2)# 显示图像cv2.imshow(title, canvas)cv2.waitKey(0)cv2.destroyAllWindows()
def main():# 图像尺寸image_width = 640image_height = 480# FOV(度)fov = 55# 计算相机内参(假设为水平FOV)K, focal_length = calculate_camera_intrinsics(image_width=image_width, image_height=image_height, fov=fov, is_horizontal=True)# 打印结果print(f"图像尺寸: {image_width}x{image_height} 像素")print(f"视野角(FOV): {fov} 度")print(f"焦距: {focal_length:.2f} 像素")print("\n相机内参矩阵:")print(K)# 可视化相机模型visualize_camera_model(K, (image_width, image_height))# visualize_camera_model_opencv(K, (image_width, image_height), title="相机模型可视化")# 如果是垂直FOV,也可以计算K_vertical, _ = calculate_camera_intrinsics(image_width=image_width, image_height=image_height, fov=fov, is_horizontal=False)print("\n如果这是垂直FOV,相机内参矩阵为:")print(K_vertical)if __name__ == "__main__":main()

 

http://www.xdnf.cn/news/8886.html

相关文章:

  • 基于Web组件实现随机抽奖
  • 云手机安卓12哪个好?掌派云手机安卓12系统上线,开启流畅体验新纪元
  • 指针数组和数组指针的区别
  • 华为OD机试真题—— 判断字符串子序列(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • 【EcelVBA】系统学习 ActiveX 控件
  • 恒坤新材闯上市:利润受益于大额补贴,产能利用率低仍要募资扩产
  • OD 算法题 B卷【最长公共后缀】
  • C++修炼:哈希表的模拟实现
  • 【python实战】-- 选择解压汇总mode进行数据汇总20250525更新(篇幅2)
  • 塔能科技:以多元技术赋能全行业能耗节能转型
  • 力扣刷题(第三十七天)
  • Linux之概述和安装vm虚拟机
  • Oracle附加日志概述
  • Day 31 训练
  • 哪款云手机支持安卓12系统?掌派云手机-性价比之选
  • Threejs 透明模型渲染嵌套以及深度测试解决共存问题
  • 什么是ESLint?它有什么作用?
  • 10G/25G PCS only mode for CoaXPress Over Fiber
  • 9. Spring AI 各版本的详细功能与发布时间整理
  • 华为OD机试真题——出租车计费/靠谱的车 (2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • Spring Cloud Sleuth与Zipkin深度整合指南:微服务链路追踪实战
  • Python实战:轻松连接与高效操作Elasticsearch
  • HDFS存储原理与MapReduce计算模型
  • 嵌入式学习笔记——day27
  • 奈雪小程序任务脚本
  • 计算机病毒的发展历程及其分类
  • Lua 脚本在 Redis 中的运用-22
  • leetcode 39. Combination Sum和40. Combination Sum II
  • 容器化:用于机器学习的 Docker 和 Kubernetes
  • 正则表达式全解:一文学会正则表达式【附在线正则表达式练习网站】