【目标跟踪】多相机多目标跟踪

文章目录

    • 前言
    • 一、计算思路
    • 二、代码
    • 三、结果

前言

  1. 相机目标跟踪之前博客已经有过基本介绍,本篇博客主要介绍一种多相机目标跟踪的计算方法
  2. 已知各相机内外参,如何计算共视区域像素投影?废话不多说,见下图。

同一时刻相机A与相机B的图

相机A

在这里插入图片描述

相机B

在这里插入图片描述

问:相机 A 检测出目标1 box位置,如何计算得出目标1在相机 B 中像素的位置?

在这里插入图片描述


一、计算思路

  1. 取相机 A 目标1中一个像素点 (Ua, Va)
  2. 计算改点在相机A中的相机坐标系坐标 (Xa,Ya,Za)
  3. 相机 A 坐标转化到相机 B 下的相机坐标 (Xb,Yb,Zb)
  4. (Xb,Yb,Zb) 转化到像素坐标 (Ub,Vb)

第2点与第3点中像素坐标转化到相机坐标。

在这里插入图片描述

其中Zcamera 可以近似求出。看过之前博客的朋友应该可以明白,具体计算方式,代码会全部给出。

第3点就是一个三维坐标系旋转平移变化。

在这里插入图片描述

二、代码

import yaml
import numpy as np
import cv2def read_yaml(path):with open(path, 'r', encoding='utf-8') as f:result = yaml.load(f.read(), Loader=yaml.FullLoader)return resultdef get_r_t_mtx(path, f_r_b_l):sensor_list = ["front_center", "right_center", "back_center", "left_center"]yaml_result = read_yaml(path)  # 读取yaml配置文件hres_pitch = yaml_result[sensor_list[f_r_b_l]]["pitch"]res_h = yaml_result[sensor_list[f_r_b_l]]["height"]res_r = np.array(yaml_result[sensor_list[f_r_b_l]]["rotation"]).reshape(3, 3)res_t = np.array(yaml_result[sensor_list[f_r_b_l]]["translation"]).reshape(3, 1)res_mtx = np.array(yaml_result[sensor_list[f_r_b_l]]["K"]).reshape(3, 3)return res_pitch, res_h, res_mtx, res_r, res_t# 近似计算相机坐标系 Zcamera
def get_camera_z(children, pixe_y):pitch, h, K, *_ = childrensigma = np.arctan((pixe_y - K[1][2]) / K[1][1])z = h * np.cos(sigma) / np.sin(sigma + pitch)  # 深度return zdef get_sensor_pixe(children, parent, x, y, distance):r, t = get_two_camera_r_t(children, parent)children_pitch, children_h, children_mtx, *c = childrenparent_pitch, parent_h, parent_mtx, *p = parentdistance_init = distancex = (x - children_mtx[0][2]) / children_mtx[0][0]y = (y - children_mtx[1][2]) / children_mtx[1][1]coor = np.array([x, y, 1]).reshape(3, 1) * distance_initres_coor = r @ coor + t  # 车体坐标系res_x = (res_coor[0] / res_coor[2]) * parent_mtx[0][0] + parent_mtx[0][2]res_y = (res_coor[1] / res_coor[2]) * parent_mtx[1][1] + parent_mtx[1][2]return res_x, res_ydef show_img(img):cv2.namedWindow("show")cv2.imshow("show", img)cv2.waitKey(0)def get_two_camera_r_t(children, parent):*children, children_mtx, children_r, children_t = children*parent, parent_mtx, parent_r, parent_t = parentres_r = np.array(parent_r).T @ np.array(children_r)res_t = np.array(parent_r).T @ (np.array(children_t) - np.array(parent_t)).reshape(3, 1)return res_r, res_tdef get_uv(point, param):*p, mtx, r, t = paramcoor_camera = r.T @ (np.array(point).reshape(3, 1) - t)coor_pixe = mtx @ coor_camera * (1 / coor_camera[2])return coor_pixe[0][0], coor_pixe[1][0]if __name__ == '__main__':front_img = cv2.imread("front_img.jpg")left_img = cv2.imread("left_img.jpg")img = np.concatenate((left_img, front_img), axis=1)  # 横向拼接front_param = get_r_t_mtx("./sensor_param.yaml", 0)left_param = get_r_t_mtx("./sensor_param.yaml", 3)color = np.random.randint(0, 255, (3000, 3))  # 随机颜色car_coor = [5.41, 6.5, 1.3]camera1 = np.ravel(get_uv(car_coor, left_param))camera2 = np.ravel(get_uv(car_coor, front_param))print(camera1, camera2)cv2.circle(img, (int(camera1[0]), int(camera1[1])), 1, color[0].tolist(), 2)cv2.circle(img, (int(camera2[0]) + 1920, int(camera2[1])), 1, color[1].tolist(), 2)cv2.line(img, (int(camera1[0]), int(camera1[1])), (int(camera2[0] + 1920), int(camera2[1])), color[0].tolist(), 2)show_img(img)# print(get_two_camera_r_t(front_param, left_param))# print(front_to_left_r.reshape(-1), "\n", front_to_left_t)# distance = get_camera_z(left_param, 640)# x1, y1 = 1429, 488# x2, y2 = 1509, 637# for x in range(x1, x2, 20):#     for y in range(y1, y2, 20):#         res_x, res_y = get_sensor_pixe(left_param, front_param, x, y, distance)#         cv2.circle(img, (int(x), int(y)), 1, color[x].tolist(), 5)#         cv2.circle(img, (int(res_x) + 1920, int(res_y)), 1, color[x].tolist(), 5)# cv2.line(img, (int(x) , int(y)), (int(res_x)+ 1920, int(res_y)), color[x].tolist(), 2)# distance = get_camera_z(front_param, 649)# x1, y1 = 271, 469# x2, y2 = 353, 649# for x in range(x1, x2, 20):#     for y in range(y1, y2, 20):#         res_x, res_y = get_sensor_pixe(front_param, left_param, x, y, distance)#         cv2.circle(img, (int(x) + 1920, int(y)), 1, color[x].tolist(), 2)#         cv2.circle(img, (int(res_x), int(res_y)), 1, color[x].tolist(), 2)# cv2.line(img, (int(x) + 1920, int(y)), (int(res_x), int(res_y)), color[x].tolist(), 2)# show_img(img)

三、结果

在这里插入图片描述

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

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

相关文章

大争之世,GPT Store 正式上线将带来哪些影响?

生产者视角,ChatGPT周边商业边界全面打开,应用生产零门槛、抄袭无限,看谁能持续创新取胜。 用户视角,有益应用可选性广,可根据自身需求选择适用场景,臻于个性化体验。 请访问http://chat.openai.com/gpts进…

路由器实验总结(静态路由配置)

1、静态路由的配置 R2(config)#int s0/0/0 R2(config)#ip add 192.168.3.2 255.255.255.0 R2(config)# no shut R1(config)#int s0/0/0 R1(config)#ip add 192.168.3.1 255.255.255.0 R1(config)# no shut串口的配置是这样的,静态路由如下: R2(config)#…

el-dialog 内部添加固定定位 ,背景颜色超出问题 (粘性定位)

使用固定定位会出现背景颜色超出的问题 position: fixed;left: 0;bottom: 0;width: 80%;height: 50px;line-height: 50px;text-align: center;background-color: #fff;overflow: hidden; 解决办法 粘性定位 position: sticky;bottom: 0;width: 100%;height: 50px;line-height…

ABeam×StartUp丨ABeam旗下德硕管理咨询(深圳)新创部门拜访「光子晶体科技」

光子晶体科技 ABeamStartUp 光子透明芯片 显示技术 光学材料 近日,ABeam 旗下德硕管理咨询(深圳)有限公司(以下简称“ABeam-SZ”)新创部门一行拜访了深圳光子晶体科技有限公司(以下简称“光子晶体科技”…

内存淘金术:Redis 内存满了怎么办?

欢迎来到我的博客,代码的世界里,每一行都是一个故事 内存淘金术:Redis 内存满了怎么办? 前言LRU(Least Recently Used)算法LFU(Least Frequently Used)算法定期淘汰策略内存淘汰事件…

vulhub中的Nginx 文件名逻辑漏洞(CVE-2013-4547)

目录 Nginx 文件名逻辑漏洞(CVE-2013-4547) 1.cd到CVE-2013-4547 2.执行docker-compose up -d 3.查看靶场是否开启成功 4.访问浏览器 5.上传含有一句话木马的图片 6.burp抓包 7.在shell.gif加空格 8.放包 9.访问路径 10.继续抓包 11.在aa后面…

EasyExcel简单实例

EasyExcel简单实例 准备工作场景一:读取 Student 表需求1:简单读取需求2:读取到异常信息时不中断需求3:读取所有的sheet工作表需求4:读取指定的sheet工作表需求5:从指定的行开始读取 场景二:写入…

鸿蒙原生应用再添新丁!京东入局鸿蒙

鸿蒙原生应用再添新丁!京东入局鸿蒙 来自 HarmonyOS 微博1月10日消息,#京东启动鸿蒙原生应用开发#!优惠信息、派送进度都可以随时随地便捷查询。双方将携手为消费者带来全场景“多快好省”购物体验,更智能,更贴心&…

Java多线程并发篇----第七篇

系列文章目录 文章目录 系列文章目录前言一、说一说自己对于 synchronized 关键字的了解二、说说自己是怎么使用 synchronized 关键字,在项目中用到了吗?synchronized关键字最主要的三种使用方式三、什么是线程安全?Vector是一个线程安全类吗?四、volatile关键字的作用?前…

将WebGL打包的unity项目部署至Vue中

一、webgl打包 创建一个空项目(或者直接使用现成的项目都可以)这里以该空项目为例子 注意: 如果你的unity项目中有文字,不需要使用unity默认的字体,需要更改它的字体,否则在最后生成的页面中会显示不出来…

【NVIDIA】Jetson Orin Nano系列:烧写Ubuntu22.04

1、简介 最新的sdk-manager已经可以安装到Ubuntu22.0,也支持在 Jetson Orin Nano 上烧写Ubuntu22.04。 官网介绍:https://developer.nvidia.com/sdk-manager 2、版本介绍 JetPack版本:https://developer.nvidia.com/embedded/jetpack-ar…

读《Mixtral of Experts》

摘要 稀疏混合专家(SMoE) 语言模型Mixtral 8x7B(那大概可以理解成他是一个缝合怪,把所有的任务模型缝合到一起,然后有一个类似打分投票的路由机制来针对输入问题选择任务子模型从而得到针对性的结果。)。Mi…

免费简单好用的 webshell 在线检测:支持 php、jsp、asp等多格式文件

话不多说,直接上图上链接:https://rivers.chaitin.cn/?share3d4f2e8aaec211eea5550242c0a8170c 还是比较好用的,支持 PHP、JSP 文件 webshell 检测,看官方解释文档,引擎使用静态文本特征、骨架哈希、静态语义分析、动…

uniapp使用wxml-to-canvas开发小程序保存canvas图片

微信小程序官方解决方案:wxml-to-canvas 使用wxml-to-canvas要知道一些前提条件 1、只能画view,text,image 2、每个元素必须要设置宽高 3、默认是flex布局,可以通过flexDirection: "column"来改变排列方式 4、文字 必…

Tomcat 部署

技能目标: 了解 Tomcat 熟悉 Tomcat 多虚拟主机环境 8.1 Tomcat 概述 自 2017 年 11 月编程语言排行榜 Java 占比 13% ,高居榜首, Tomcat 也一度成为 Java 开发人员的首选。其开源、占用系统资源少、跨平台等特性深受广大程序员…

Codeforces Hello 2024 A~F1

A.Wallet Exchange(思维) 题意: Alice和Bob各自拥有 a , b a,b a,b枚硬币,他们决定以Alice为先手开始比赛,比赛中每人在每轮需按顺序执行操作1和操作2: 操作1:交换两人手上拥有的硬币数量,或什么都不做 …

JS逆向实战案例2——某房地产token RSA加密

说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除 作者:zhu6201976 一、 反爬分析 url1:aHR0cDovL3pmY2ouZ3ouZ292LmNuL3pmY2ovZnl4eC94a2I/c1Byb2plY3RJZD05MzBlMDQ0MmJjNjA0MTBkYTgzNzQ0MmQ…

用可视化案例讲Rust编程2. 编码的核心组成:函数

从第一天学习编程,可能大家就听说这样的组成公式: 程序算法数据结构 ——该公式出自著名计算机科学家沃思(Nikiklaus Wirth) 实际上,程序除了以上两个主要要素之外,还应当采用结构化程序设计方法进行程序设计,并且用…

SpringBoot多环境配置Maven Profile组

Maven profile组 注意切换配置时 mvn clean下 或者 clean 加install 或者compile 编译 clean之后 install下 或者compile 编译 nohup java -Xms256m -Xmx512m -Dfile.encodingUTF-8 -jar demo.jar --spring.profiles.activeprod > system.log 2>&1 &

k8s中的基础概念

k8s可以从硬件和软件两方面来理解: 硬件: 1、节点(Node):类似于手机、平板、电脑 2、集群(Cluster):多个节点组合到一起 3、持久卷(Persistent Volumes)&…