forked from HQU-gxy/CVTH3PE
x
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@ -10,3 +10,5 @@ wheels/
|
|||||||
.venv
|
.venv
|
||||||
.hypothesis
|
.hypothesis
|
||||||
samples
|
samples
|
||||||
|
*.jpg
|
||||||
|
*.parquet
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
from collections import OrderedDict, defaultdict
|
from collections import OrderedDict, defaultdict
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
import string
|
||||||
from typing import Any, TypeAlias, TypedDict, Optional, Sequence
|
from typing import Any, TypeAlias, TypedDict, Optional, Sequence
|
||||||
|
|
||||||
from beartype import beartype
|
from beartype import beartype
|
||||||
@ -522,10 +523,14 @@ def to_homogeneous(points: Num[Array, "N 2"] | Num[Array, "N 3"]) -> Num[Array,
|
|||||||
raise ValueError(f"Invalid shape for points: {points.shape}")
|
raise ValueError(f"Invalid shape for points: {points.shape}")
|
||||||
|
|
||||||
|
|
||||||
|
import awkward as ak
|
||||||
|
|
||||||
|
|
||||||
@jaxtyped(typechecker=beartype)
|
@jaxtyped(typechecker=beartype)
|
||||||
def point_line_distance(
|
def point_line_distance(
|
||||||
points: Num[Array, "N 3"] | Num[Array, "N 2"],
|
points: Num[Array, "N 3"] | Num[Array, "N 2"],
|
||||||
line: Num[Array, "N 3"],
|
line: Num[Array, "N 3"],
|
||||||
|
description: str,
|
||||||
eps: float = 1e-9,
|
eps: float = 1e-9,
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
@ -544,6 +549,12 @@ def point_line_distance(
|
|||||||
"""
|
"""
|
||||||
numerator = abs(line[:, 0] * points[:, 0] + line[:, 1] * points[:, 1] + line[:, 2])
|
numerator = abs(line[:, 0] * points[:, 0] + line[:, 1] * points[:, 1] + line[:, 2])
|
||||||
denominator = jnp.sqrt(line[:, 0] * line[:, 0] + line[:, 1] * line[:, 1])
|
denominator = jnp.sqrt(line[:, 0] * line[:, 0] + line[:, 1] * line[:, 1])
|
||||||
|
# line_data = {"a": line[:, 0], "b": line[:, 1], "c": line[:, 2]}
|
||||||
|
# line_x_y = {"x": points[:, 0], "y": points[:, 1]}
|
||||||
|
# ak.to_parquet(
|
||||||
|
# line_data, f"/home/admin/Code/CVTH3PE/line_a_b_c_{description}.parquet"
|
||||||
|
# )
|
||||||
|
# ak.to_parquet(line_x_y, f"/home/admin/Code/CVTH3PE/line_x_y_{description}.parquet")
|
||||||
return numerator / (denominator + eps)
|
return numerator / (denominator + eps)
|
||||||
|
|
||||||
|
|
||||||
@ -571,7 +582,7 @@ def left_to_right_epipolar_distance(
|
|||||||
"""
|
"""
|
||||||
F_t = fundamental_matrix.transpose()
|
F_t = fundamental_matrix.transpose()
|
||||||
line1_in_2 = jnp.matmul(left, F_t)
|
line1_in_2 = jnp.matmul(left, F_t)
|
||||||
return point_line_distance(right, line1_in_2)
|
return point_line_distance(right, line1_in_2, "left_to_right")
|
||||||
|
|
||||||
|
|
||||||
@jaxtyped(typechecker=beartype)
|
@jaxtyped(typechecker=beartype)
|
||||||
@ -597,7 +608,7 @@ def right_to_left_epipolar_distance(
|
|||||||
$$x^{\\prime T}Fx = 0$$
|
$$x^{\\prime T}Fx = 0$$
|
||||||
"""
|
"""
|
||||||
line2_in_1 = jnp.matmul(right, fundamental_matrix)
|
line2_in_1 = jnp.matmul(right, fundamental_matrix)
|
||||||
return point_line_distance(left, line2_in_1)
|
return point_line_distance(left, line2_in_1, "right_to_left")
|
||||||
|
|
||||||
|
|
||||||
def distance_between_epipolar_lines(
|
def distance_between_epipolar_lines(
|
||||||
|
|||||||
223
filter_object_by_box.py
Normal file
223
filter_object_by_box.py
Normal file
@ -0,0 +1,223 @@
|
|||||||
|
import awkward as ak
|
||||||
|
import numpy as np
|
||||||
|
from pathlib import Path
|
||||||
|
from matplotlib import pyplot as plt
|
||||||
|
import cv2
|
||||||
|
from typing import Optional, cast, Final, TypedDict
|
||||||
|
from typing import (
|
||||||
|
Any,
|
||||||
|
Generator,
|
||||||
|
Optional,
|
||||||
|
Sequence,
|
||||||
|
TypeAlias,
|
||||||
|
TypedDict,
|
||||||
|
cast,
|
||||||
|
overload,
|
||||||
|
)
|
||||||
|
from jaxtyping import Array, Float, Num, jaxtyped
|
||||||
|
from shapely import box
|
||||||
|
from app.visualize.whole_body import visualize_whole_body
|
||||||
|
import pyproj
|
||||||
|
from shapely.geometry import Polygon
|
||||||
|
from sympy import false, true
|
||||||
|
|
||||||
|
NDArray: TypeAlias = np.ndarray
|
||||||
|
|
||||||
|
|
||||||
|
# 盒子各个面的三维三角形集合
|
||||||
|
box_triangles_list = [
|
||||||
|
["4", "6", "7"],
|
||||||
|
["4", "5", "6"],
|
||||||
|
["2", "5", "6"],
|
||||||
|
["1", "2", "5"],
|
||||||
|
["1", "2", "3"],
|
||||||
|
["0", "1", "3"],
|
||||||
|
["0", "3", "7"],
|
||||||
|
["0", "4", "7"],
|
||||||
|
["2", "6", "7"],
|
||||||
|
["2", "3", "7"],
|
||||||
|
["0", "4", "5"],
|
||||||
|
["0", "1", "5"],
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class Camera_Params(TypedDict):
|
||||||
|
rvec: Num[NDArray, "3"]
|
||||||
|
tvec: Num[NDArray, "3"]
|
||||||
|
camera_matrix: Num[Array, "3 3"]
|
||||||
|
dist: Num[Array, "N"]
|
||||||
|
width: int
|
||||||
|
height: int
|
||||||
|
|
||||||
|
|
||||||
|
class KeypointDataset(TypedDict):
|
||||||
|
frame_index: int
|
||||||
|
boxes: Num[NDArray, "N 4"]
|
||||||
|
kps: Num[NDArray, "N J 2"]
|
||||||
|
kps_scores: Num[NDArray, "N J"]
|
||||||
|
|
||||||
|
|
||||||
|
# 三维坐标系根据相机内外参计算该镜头下的二维重投影坐标
|
||||||
|
def reprojet_3d_to_2d(point_3d, camera_param):
|
||||||
|
point_2d, _ = cv2.projectPoints(
|
||||||
|
objectPoints=point_3d,
|
||||||
|
rvec=np.array(camera_param.params.Rt[:3, :3]),
|
||||||
|
tvec=np.array(camera_param.params.Rt[:3, 3]),
|
||||||
|
cameraMatrix=np.array(camera_param.params.K),
|
||||||
|
distCoeffs=np.array(camera_param.params.dist_coeffs),
|
||||||
|
)
|
||||||
|
|
||||||
|
point_2d = point_2d.reshape(-1).astype(int)
|
||||||
|
return point_2d
|
||||||
|
|
||||||
|
|
||||||
|
# 计算盒子三维坐标系
|
||||||
|
def calculaterCubeVersices(position, dimensions):
|
||||||
|
[cx, cy, cz] = position
|
||||||
|
[width, height, depth] = dimensions
|
||||||
|
halfWidth = width / 2
|
||||||
|
halfHeight = height / 2
|
||||||
|
halfDepth = depth / 2
|
||||||
|
|
||||||
|
return [
|
||||||
|
[cx - halfWidth, cy - halfHeight, cz - halfDepth],
|
||||||
|
[cx + halfWidth, cy - halfHeight, cz - halfDepth],
|
||||||
|
[cx + halfWidth, cy + halfHeight, cz - halfDepth],
|
||||||
|
[cx - halfWidth, cy + halfHeight, cz - halfDepth],
|
||||||
|
[cx - halfWidth, cy - halfHeight, cz + halfDepth],
|
||||||
|
[cx + halfWidth, cy - halfHeight, cz + halfDepth],
|
||||||
|
[cx + halfWidth, cy + halfHeight, cz + halfDepth],
|
||||||
|
[cx - halfWidth, cy + halfHeight, cz + halfDepth],
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
# 获得盒子三维坐标系
|
||||||
|
def calculater_box_3d_points():
|
||||||
|
# 盒子原点位置,相对于六面体中心偏移
|
||||||
|
box_ori_potision = [0.205 + 0.2, 0.205 + 0.50, -0.205 - 0.2]
|
||||||
|
# 盒子边长,宽:1.5米,高:1.5米,深度:1.8米
|
||||||
|
box_geometry = [0.65, 1.8, 1.5]
|
||||||
|
filter_box_points_3d = calculaterCubeVersices(box_ori_potision, box_geometry)
|
||||||
|
filter_box_points_3d = {
|
||||||
|
str(index): element for index, element in enumerate(filter_box_points_3d)
|
||||||
|
}
|
||||||
|
|
||||||
|
return filter_box_points_3d
|
||||||
|
|
||||||
|
|
||||||
|
# 计算盒子坐标系的二维重投影数据
|
||||||
|
def calculater_box_2d_points(filter_box_points_3d, camera_param):
|
||||||
|
box_points_2d = dict()
|
||||||
|
for element_index, elment_point_3d in enumerate(filter_box_points_3d.values()):
|
||||||
|
box_points_2d[str(element_index)] = reprojet_3d_to_2d(
|
||||||
|
np.array(elment_point_3d), camera_param
|
||||||
|
).tolist()
|
||||||
|
|
||||||
|
return box_points_2d
|
||||||
|
|
||||||
|
|
||||||
|
# 盒子总的二维平面各三角形坐标点
|
||||||
|
def calculater_box_common_scope(box_points_2d):
|
||||||
|
box_triangles_all_points = []
|
||||||
|
# 遍历三角形个数
|
||||||
|
for i in range(len(box_triangles_list)):
|
||||||
|
# 获取单个三角形二维平面坐标点
|
||||||
|
single_triangles = []
|
||||||
|
for element_key in box_triangles_list[i]:
|
||||||
|
single_triangles.append(box_points_2d[element_key])
|
||||||
|
box_triangles_all_points.append(single_triangles)
|
||||||
|
|
||||||
|
return box_triangles_all_points
|
||||||
|
|
||||||
|
|
||||||
|
def calculate_triangle_union(triangles):
|
||||||
|
"""
|
||||||
|
计算多个三角形的并集区域
|
||||||
|
|
||||||
|
参数:
|
||||||
|
triangles: 包含多个三角形的列表,每个三角形由三个点的坐标组成
|
||||||
|
|
||||||
|
返回:
|
||||||
|
union_area: 并集区域的面积
|
||||||
|
union_polygon: 表示并集区域的多边形对象
|
||||||
|
"""
|
||||||
|
# 创建多边形对象列表
|
||||||
|
polygons = [Polygon(tri) for tri in triangles]
|
||||||
|
|
||||||
|
# 计算并集
|
||||||
|
union_polygon = polygons[0]
|
||||||
|
for polygon in polygons[1:]:
|
||||||
|
union_polygon = union_polygon.union(polygon)
|
||||||
|
|
||||||
|
# 计算并集面积
|
||||||
|
union_area = union_polygon.area
|
||||||
|
|
||||||
|
return union_area, union_polygon
|
||||||
|
|
||||||
|
|
||||||
|
# 射线法,判断坐标点是否在box二维重投影的区域内
|
||||||
|
def point_in_polygon(p, polygon):
|
||||||
|
x, y = p
|
||||||
|
n = len(polygon)
|
||||||
|
intersections = 0
|
||||||
|
on_boundary = False
|
||||||
|
|
||||||
|
for i in range(n):
|
||||||
|
xi, yi = polygon[i]
|
||||||
|
xj, yj = polygon[(i + 1) % n] # 闭合多边形
|
||||||
|
|
||||||
|
# 检查点是否在顶点上
|
||||||
|
if (x == xi and y == yi) or (x == xj and y == yj):
|
||||||
|
on_boundary = True
|
||||||
|
break
|
||||||
|
|
||||||
|
# 检查点是否在线段上(非顶点情况)
|
||||||
|
if (min(xi, xj) <= x <= max(xi, xj)) and (min(yi, yj) <= y <= max(yi, yj)):
|
||||||
|
cross = (x - xi) * (yj - yi) - (y - yi) * (xj - xi)
|
||||||
|
if cross == 0:
|
||||||
|
on_boundary = True
|
||||||
|
break
|
||||||
|
|
||||||
|
# 计算射线与边的交点(非水平边)
|
||||||
|
if (yi > y) != (yj > y):
|
||||||
|
slope = (xj - xi) / (yj - yi) if (yj - yi) != 0 else float("inf")
|
||||||
|
x_intersect = xi + (y - yi) * slope
|
||||||
|
if x <= x_intersect:
|
||||||
|
intersections += 1
|
||||||
|
|
||||||
|
if on_boundary:
|
||||||
|
return false
|
||||||
|
return intersections % 2 == 1 # 奇数为内部,返回True
|
||||||
|
|
||||||
|
|
||||||
|
# 获取并集区域坐标点
|
||||||
|
def get_contours(union_polygon):
|
||||||
|
if union_polygon.geom_type == "Polygon":
|
||||||
|
# 单一多边形
|
||||||
|
x, y = union_polygon.exterior.xy
|
||||||
|
|
||||||
|
contours = [(list(x)[i], list(y)[i]) for i in range(len(x))]
|
||||||
|
contours = np.array(contours, np.int32)
|
||||||
|
return contours
|
||||||
|
|
||||||
|
|
||||||
|
# 筛选落在盒子二维重投影区域内的关键点信息
|
||||||
|
def filter_kps_box(kps, contours):
|
||||||
|
# 存放筛选后的目标框
|
||||||
|
# new_boxes_data = []
|
||||||
|
# 存放筛选后的2d姿态点数据
|
||||||
|
# new_kps_data = []
|
||||||
|
# 存放筛选后的2d姿态置信度
|
||||||
|
# 遍历未筛选的目标框
|
||||||
|
|
||||||
|
x1, y1 = kps[0]
|
||||||
|
x2, y2 = kps[16]
|
||||||
|
# 保留目标框中心在范围内的坐标点
|
||||||
|
x_center = (x1 + x2) / 2
|
||||||
|
y_centet = (y1 + y2) / 2
|
||||||
|
if point_in_polygon([x1, y1], contours) and point_in_polygon([x2, y2], contours):
|
||||||
|
# if point_in_polygon([x_center, y_centet], contours) :
|
||||||
|
return true
|
||||||
|
else:
|
||||||
|
return false
|
||||||
|
# return new_kps_data
|
||||||
1277
play.ipynb
Normal file
1277
play.ipynb
Normal file
File diff suppressed because it is too large
Load Diff
@ -65,8 +65,10 @@ from app.visualize.whole_body import visualize_whole_body
|
|||||||
NDArray: TypeAlias = np.ndarray
|
NDArray: TypeAlias = np.ndarray
|
||||||
|
|
||||||
# %%
|
# %%
|
||||||
DATASET_PATH = Path("samples") / "04_02"
|
CAMERA_PATH = Path(
|
||||||
AK_CAMERA_DATASET: ak.Array = ak.from_parquet(DATASET_PATH / "camera_params.parquet")
|
"/home/admin/Documents/ActualTest_QuanCheng/camera_ex_params_1_2025_4_20/camera_params"
|
||||||
|
)
|
||||||
|
AK_CAMERA_DATASET: ak.Array = ak.from_parquet(CAMERA_PATH / "camera_params.parquet")
|
||||||
DELTA_T_MIN = timedelta(milliseconds=10)
|
DELTA_T_MIN = timedelta(milliseconds=10)
|
||||||
display(AK_CAMERA_DATASET)
|
display(AK_CAMERA_DATASET)
|
||||||
|
|
||||||
@ -102,6 +104,13 @@ class ExternalCameraParams(TypedDict):
|
|||||||
|
|
||||||
|
|
||||||
# %%
|
# %%
|
||||||
|
|
||||||
|
# %%
|
||||||
|
DATASET_PATH = Path(
|
||||||
|
"/home/admin/Documents/ActualTest_QuanCheng/camera_ex_params_1_2025_4_20/detect_result/segement_1"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def read_dataset_by_port(port: int) -> ak.Array:
|
def read_dataset_by_port(port: int) -> ak.Array:
|
||||||
P = DATASET_PATH / f"{port}.parquet"
|
P = DATASET_PATH / f"{port}.parquet"
|
||||||
return ak.from_parquet(P)
|
return ak.from_parquet(P)
|
||||||
@ -110,6 +119,7 @@ def read_dataset_by_port(port: int) -> ak.Array:
|
|||||||
KEYPOINT_DATASET = {
|
KEYPOINT_DATASET = {
|
||||||
int(p): read_dataset_by_port(p) for p in ak.to_numpy(AK_CAMERA_DATASET["port"])
|
int(p): read_dataset_by_port(p) for p in ak.to_numpy(AK_CAMERA_DATASET["port"])
|
||||||
}
|
}
|
||||||
|
display(KEYPOINT_DATASET)
|
||||||
|
|
||||||
|
|
||||||
# %%
|
# %%
|
||||||
@ -184,6 +194,8 @@ def preprocess_keypoint_dataset(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# %%
|
||||||
|
|
||||||
# %%
|
# %%
|
||||||
DetectionGenerator: TypeAlias = Generator[Detection, None, None]
|
DetectionGenerator: TypeAlias = Generator[Detection, None, None]
|
||||||
|
|
||||||
@ -326,13 +338,31 @@ def homogeneous_to_euclidean(
|
|||||||
|
|
||||||
# %%
|
# %%
|
||||||
FPS = 24
|
FPS = 24
|
||||||
image_gen_5600 = preprocess_keypoint_dataset(KEYPOINT_DATASET[5600], from_camera_params(AK_CAMERA_DATASET[AK_CAMERA_DATASET["port"] == 5600][0]), FPS, datetime(2024, 4, 2, 12, 0, 0)) # type: ignore
|
|
||||||
image_gen_5601 = preprocess_keypoint_dataset(KEYPOINT_DATASET[5601], from_camera_params(AK_CAMERA_DATASET[AK_CAMERA_DATASET["port"] == 5601][0]), FPS, datetime(2024, 4, 2, 12, 0, 0)) # type: ignore
|
image_gen_5601 = preprocess_keypoint_dataset(KEYPOINT_DATASET[5601], from_camera_params(AK_CAMERA_DATASET[AK_CAMERA_DATASET["port"] == 5601][0]), FPS, datetime(2024, 4, 2, 12, 0, 0)) # type: ignore
|
||||||
image_gen_5602 = preprocess_keypoint_dataset(KEYPOINT_DATASET[5602], from_camera_params(AK_CAMERA_DATASET[AK_CAMERA_DATASET["port"] == 5602][0]), FPS, datetime(2024, 4, 2, 12, 0, 0)) # type: ignore
|
image_gen_5602 = preprocess_keypoint_dataset(KEYPOINT_DATASET[5602], from_camera_params(AK_CAMERA_DATASET[AK_CAMERA_DATASET["port"] == 5602][0]), FPS, datetime(2024, 4, 2, 12, 0, 0)) # type: ignore
|
||||||
|
image_gen_5603 = preprocess_keypoint_dataset(KEYPOINT_DATASET[5603], from_camera_params(AK_CAMERA_DATASET[AK_CAMERA_DATASET["port"] == 5603][0]), FPS, datetime(2024, 4, 2, 12, 0, 0)) # type: ignore
|
||||||
|
image_gen_5604 = preprocess_keypoint_dataset(KEYPOINT_DATASET[5604], from_camera_params(AK_CAMERA_DATASET[AK_CAMERA_DATASET["port"] == 5604][0]), FPS, datetime(2024, 4, 2, 12, 0, 0)) # type: ignore
|
||||||
|
image_gen_5605 = preprocess_keypoint_dataset(KEYPOINT_DATASET[5605], from_camera_params(AK_CAMERA_DATASET[AK_CAMERA_DATASET["port"] == 5605][0]), FPS, datetime(2024, 4, 2, 12, 0, 0)) # type: ignore
|
||||||
|
image_gen_5606 = preprocess_keypoint_dataset(KEYPOINT_DATASET[5606], from_camera_params(AK_CAMERA_DATASET[AK_CAMERA_DATASET["port"] == 5606][0]), FPS, datetime(2024, 4, 2, 12, 0, 0)) # type: ignore
|
||||||
|
image_gen_5607 = preprocess_keypoint_dataset(KEYPOINT_DATASET[5607], from_camera_params(AK_CAMERA_DATASET[AK_CAMERA_DATASET["port"] == 5607][0]), FPS, datetime(2024, 4, 2, 12, 0, 0)) # type: ignore
|
||||||
|
image_gen_5608 = preprocess_keypoint_dataset(KEYPOINT_DATASET[5608], from_camera_params(AK_CAMERA_DATASET[AK_CAMERA_DATASET["port"] == 5608][0]), FPS, datetime(2024, 4, 2, 12, 0, 0)) # type: ignore
|
||||||
|
image_gen_5609 = preprocess_keypoint_dataset(KEYPOINT_DATASET[5609], from_camera_params(AK_CAMERA_DATASET[AK_CAMERA_DATASET["port"] == 5609][0]), FPS, datetime(2024, 4, 2, 12, 0, 0)) # type: ignore
|
||||||
|
|
||||||
|
|
||||||
display(1 / FPS)
|
display(1 / FPS)
|
||||||
sync_gen = sync_batch_gen(
|
sync_gen = sync_batch_gen(
|
||||||
[image_gen_5600, image_gen_5601, image_gen_5602], timedelta(seconds=1 / FPS)
|
[
|
||||||
|
image_gen_5601,
|
||||||
|
# image_gen_5602,
|
||||||
|
# image_gen_5603,
|
||||||
|
image_gen_5604,
|
||||||
|
image_gen_5605,
|
||||||
|
image_gen_5606,
|
||||||
|
# image_gen_5607,
|
||||||
|
image_gen_5608,
|
||||||
|
image_gen_5609,
|
||||||
|
],
|
||||||
|
timedelta(seconds=1 / FPS),
|
||||||
)
|
)
|
||||||
|
|
||||||
# %%
|
# %%
|
||||||
@ -345,7 +375,7 @@ display(sorted_detections)
|
|||||||
display(
|
display(
|
||||||
list(
|
list(
|
||||||
map(
|
map(
|
||||||
lambda x: {"timestamp": str(x.timestamp), "camera": x.camera.id},
|
lambda x: {"timestamp": str(x.timestamp), "camera": x.camera.id, "keypoint":x.keypoints.shape},
|
||||||
sorted_detections,
|
sorted_detections,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -413,6 +443,7 @@ for el in clusters_detections[0]:
|
|||||||
p = plt.imshow(im)
|
p = plt.imshow(im)
|
||||||
display(p)
|
display(p)
|
||||||
|
|
||||||
|
|
||||||
# %%
|
# %%
|
||||||
im_prime = np.zeros((HEIGHT, WIDTH, 3), dtype=np.uint8)
|
im_prime = np.zeros((HEIGHT, WIDTH, 3), dtype=np.uint8)
|
||||||
for el in clusters_detections[1]:
|
for el in clusters_detections[1]:
|
||||||
|
|||||||
406
plot_epipolar_lines.ipynb
Normal file
406
plot_epipolar_lines.ipynb
Normal file
File diff suppressed because one or more lines are too long
193
temp_test_camera_ex_params.ipynb
Normal file
193
temp_test_camera_ex_params.ipynb
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 8,
|
||||||
|
"id": "11cc2345",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"import awkward as ak\n",
|
||||||
|
"import numpy as np\n",
|
||||||
|
"from pathlib import Path"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 9,
|
||||||
|
"id": "84348d97",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"CAMERA_INDEX ={\n",
|
||||||
|
" 2:\"5602\",\n",
|
||||||
|
" 4:\"5604\",\n",
|
||||||
|
"}\n",
|
||||||
|
"index = 4\n",
|
||||||
|
"CAMERA_PATH = Path(\"/home/admin/Documents/ActualTest_QuanCheng/camera_ex_params_1_2025_4_20/camera_params\")\n",
|
||||||
|
"camera_data = ak.from_parquet(CAMERA_PATH / CAMERA_INDEX[index]/ \"extrinsic.parquet\")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 10,
|
||||||
|
"id": "1d771740",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/html": [
|
||||||
|
"<pre>[{rvec: [[-2.26], [0.0669], [-2.15]], tvec: [[0.166], ...]},\n",
|
||||||
|
" {rvec: [[2.07], [0.144], [2.21]], tvec: [[0.143], ...]},\n",
|
||||||
|
" {rvec: [[2.09], [0.0872], [2.25]], tvec: [[0.141], ...]},\n",
|
||||||
|
" {rvec: [[2.16], [0.172], [2.09]], tvec: [[0.162], ...]},\n",
|
||||||
|
" {rvec: [[2.15], [0.18], [2.09]], tvec: [[0.162], ...]},\n",
|
||||||
|
" {rvec: [[-2.22], [0.117], [-2.14]], tvec: [[0.162], ...]},\n",
|
||||||
|
" {rvec: [[2.18], [0.176], [2.08]], tvec: [[0.166], ...]},\n",
|
||||||
|
" {rvec: [[2.18], [0.176], [2.08]], tvec: [[0.166], ...]},\n",
|
||||||
|
" {rvec: [[-2.26], [0.116], [-2.1]], tvec: [[0.17], ...]},\n",
|
||||||
|
" {rvec: [[-2.26], [0.124], [-2.09]], tvec: [[0.171], ...]},\n",
|
||||||
|
" ...,\n",
|
||||||
|
" {rvec: [[-2.2], [0.0998], [-2.17]], tvec: [[0.158], ...]},\n",
|
||||||
|
" {rvec: [[-2.2], [0.0998], [-2.17]], tvec: [[0.158], ...]},\n",
|
||||||
|
" {rvec: [[2.12], [0.151], [2.16]], tvec: [[0.152], ...]},\n",
|
||||||
|
" {rvec: [[-2.3], [0.0733], [-2.1]], tvec: [[0.175], ...]},\n",
|
||||||
|
" {rvec: [[2.1], [0.16], [2.17]], tvec: [[0.149], ...]},\n",
|
||||||
|
" {rvec: [[2.1], [0.191], [2.13]], tvec: [[0.153], ...]},\n",
|
||||||
|
" {rvec: [[2.11], [0.196], [2.12]], tvec: [[0.154], ...]},\n",
|
||||||
|
" {rvec: [[2.19], [0.171], [2.08]], tvec: [[0.166], ...]},\n",
|
||||||
|
" {rvec: [[2.24], [0.0604], [2.12]], tvec: [[0.166], ...]}]\n",
|
||||||
|
"---------------------------------------------------------------------------\n",
|
||||||
|
"backend: cpu\n",
|
||||||
|
"nbytes: 10.1 kB\n",
|
||||||
|
"type: 90 * {\n",
|
||||||
|
" rvec: var * var * float64,\n",
|
||||||
|
" tvec: var * var * float64\n",
|
||||||
|
"}</pre>"
|
||||||
|
],
|
||||||
|
"text/plain": [
|
||||||
|
"<Array [{rvec: [...], tvec: [...]}, ..., {...}] type='90 * {rvec: var * var...'>"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "display_data"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"display(camera_data)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 11,
|
||||||
|
"id": "59fde11b",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"data = []\n",
|
||||||
|
"for element in camera_data:\n",
|
||||||
|
" rvec = element[\"rvec\"]\n",
|
||||||
|
" if rvec[0]<0:\n",
|
||||||
|
" data.append({\"rvec\": rvec, \"tvec\": element[\"tvec\"]})"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 12,
|
||||||
|
"id": "4792cbc4",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"<pyarrow._parquet.FileMetaData object at 0x7799cbf62d40>\n",
|
||||||
|
" created_by: parquet-cpp-arrow version 19.0.1\n",
|
||||||
|
" num_columns: 2\n",
|
||||||
|
" num_rows: 30\n",
|
||||||
|
" num_row_groups: 1\n",
|
||||||
|
" format_version: 2.6\n",
|
||||||
|
" serialized_size: 0"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 12,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"ak.to_parquet(ak.from_iter(data),\"/home/admin/Documents/ActualTest_QuanCheng/camera_ex_params_1_2025_4_20/camera_params/5604/re_extrinsic.parquet\")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 13,
|
||||||
|
"id": "8225ee33",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/html": [
|
||||||
|
"<pre>[{rvec: [[-2.26], [0.0669], [-2.15]], tvec: [[0.166], ...]},\n",
|
||||||
|
" {rvec: [[-2.22], [0.117], [-2.14]], tvec: [[0.162], ...]},\n",
|
||||||
|
" {rvec: [[-2.26], [0.116], [-2.1]], tvec: [[0.17], ...]},\n",
|
||||||
|
" {rvec: [[-2.26], [0.124], [-2.09]], tvec: [[0.171], ...]},\n",
|
||||||
|
" {rvec: [[-2.24], [0.133], [-2.11]], tvec: [[0.167], ...]},\n",
|
||||||
|
" {rvec: [[-2.22], [0.0556], [-2.2]], tvec: [[0.158], ...]},\n",
|
||||||
|
" {rvec: [[-2.27], [0.119], [-2.09]], tvec: [[0.172], ...]},\n",
|
||||||
|
" {rvec: [[-2.34], [0.0663], [-2.06]], tvec: [[0.181], ...]},\n",
|
||||||
|
" {rvec: [[-2.21], [0.117], [-2.15]], tvec: [[0.161], ...]},\n",
|
||||||
|
" {rvec: [[-2.33], [0.0731], [-2.08]], tvec: [[0.179], ...]},\n",
|
||||||
|
" ...,\n",
|
||||||
|
" {rvec: [[-2.23], [0.106], [-2.13]], tvec: [[0.166], ...]},\n",
|
||||||
|
" {rvec: [[-2.21], [0.054], [-2.2]], tvec: [[0.157], ...]},\n",
|
||||||
|
" {rvec: [[-2.19], [0.0169], [-2.25]], tvec: [[0.151], ...]},\n",
|
||||||
|
" {rvec: [[-2.2], [0.0719], [-2.19]], tvec: [[0.157], ...]},\n",
|
||||||
|
" {rvec: [[-2.22], [0.0726], [-2.18]], tvec: [[0.161], ...]},\n",
|
||||||
|
" {rvec: [[-2.2], [0.0742], [-2.19]], tvec: [[0.158], ...]},\n",
|
||||||
|
" {rvec: [[-2.2], [0.0998], [-2.17]], tvec: [[0.158], ...]},\n",
|
||||||
|
" {rvec: [[-2.2], [0.0998], [-2.17]], tvec: [[0.158], ...]},\n",
|
||||||
|
" {rvec: [[-2.3], [0.0733], [-2.1]], tvec: [[0.175], ...]}]\n",
|
||||||
|
"---------------------------------------------------------------------------\n",
|
||||||
|
"backend: cpu\n",
|
||||||
|
"nbytes: 3.4 kB\n",
|
||||||
|
"type: 30 * {\n",
|
||||||
|
" rvec: var * var * float64,\n",
|
||||||
|
" tvec: var * var * float64\n",
|
||||||
|
"}</pre>"
|
||||||
|
],
|
||||||
|
"text/plain": [
|
||||||
|
"<Array [{rvec: [...], tvec: [...]}, ..., {...}] type='30 * {rvec: var * var...'>"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "display_data"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"temp_data = ak.from_parquet(\"/home/admin/Documents/ActualTest_QuanCheng/camera_ex_params_1_2025_4_20/camera_params/5604/re_extrinsic.parquet\")\n",
|
||||||
|
"display(temp_data)"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": ".venv",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.12.9"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 5
|
||||||
|
}
|
||||||
892
test_filter_object_by_box.ipynb
Normal file
892
test_filter_object_by_box.ipynb
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user