Browse Source

头图渲染bug修复

main
Ke Han 1 month ago
parent
commit
877ae1bf4e
  1. 4
      head_img_sparse/cameras.txt
  2. 5
      head_img_sparse/images.txt
  3. 7419
      head_img_sparse/points3D.txt
  4. 134
      render_img.py

4
head_img_sparse/cameras.txt

@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
# Camera list with one line of data per camera:
# CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[]
# Number of cameras: 1
1 PINHOLE 3460 5249 2765.2381577550354 2793.306325513402 1730.0 2624.5

5
head_img_sparse/images.txt

@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
# Image list with two lines of data per image:
# IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME
# POINTS2D[] as (X, Y, POINT3D_ID)
# Number of images: 32
1 1.5731778311453921e-06 -0.9999939882958248 -0.003466943528196175 -6.059956329361548e-05 0.012758568267169307 1.5010812761400716 1.312532601201028 1 123_2.jpg

7419
head_img_sparse/points3D.txt

File diff suppressed because it is too large Load Diff

134
render_img.py

@ -0,0 +1,134 @@ @@ -0,0 +1,134 @@
"""Blender 头图渲染脚本。"""
# pyright: reportMissingImports=false
import bpy
import numpy as np
from pathlib import Path
import os
import argparse
import sys
bpy.ops.preferences.addon_enable(module="photogrammetry_importer")
def load_obj_vertices(obj_file_path):
"""
使用bpy加载OBJ文件并获取顶点数据
返回网格object和顶点数组
"""
# 清除当前场景中的所有网格对象
bpy.ops.object.select_all(action='DESELECT')
bpy.ops.object.select_by_type(type='MESH')
bpy.ops.object.delete(use_global=False, confirm=False)
# 判断文件是否存在
if not os.path.exists(obj_file_path):
print(f"{obj_file_path} not exist")
return None, None
# 导入OBJ
bpy.ops.wm.obj_import(filepath=obj_file_path, forward_axis='Y', up_axis='Z')
obj_original = [obj for obj in bpy.data.objects if obj.type == 'MESH'][0]
bpy.context.view_layer.objects.active = obj_original
obj_original.select_set(True)
mesh = obj_original.data
vertices = np.array([v.co for v in mesh.vertices])
return obj_original, vertices
def render_and_save(camera, output_path, cam_name):
"""
设置渲染参数并执行渲染操作最后保存为图片
:param camera: 相机对象
:param output_path: 输出图片的路径
:param cam_name: 相机名称
"""
# 设置渲染引擎为 Workbench
bpy.context.scene.render.engine = 'BLENDER_WORKBENCH'
# bpy.context.scene.render.engine = 'WORKBENCH'
# 设置 Workbench 渲染的着色模式为 Flat 光和 Texture 颜色
bpy.context.scene.display.shading.light = 'FLAT'
# bpy.context.scene.display.shading.color_type = 'ATTRIBUTE'
bpy.context.scene.display.shading.color_type = 'TEXTURE'
# 设置 Viewtransform 为 standard
bpy.context.scene.view_settings.view_transform = 'Standard'
# 设置背景颜色为白色
bpy.context.scene.world.color = (1, 1, 1)
# 设置输出路径
bpy.context.scene.render.filepath = os.path.join(output_path, f"123_2.jpg")
# 设置图像格式为 PNG
bpy.context.scene.render.image_settings.file_format = 'JPEG'
# 设置渲染分辨率为 100%
bpy.context.scene.render.resolution_percentage = 100
# 设置当前相机为活动相机
bpy.context.scene.camera = camera
# 执行渲染操作
bpy.ops.render.render(write_still=True)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--sparse_file", type=str, required=True)
parser.add_argument("--mesh_file", type=str, required=True)
parser.add_argument("--output_path", type=str, required=True)
args = parser.parse_args(sys.argv[sys.argv.index("--") + 1:])
# --------------------- 示例使用 ---------------------
sparse_file = args.sparse_file
mesh_file = args.mesh_file
output_path = args.output_path
# 调用操作符
bpy.ops.import_scene.colmap_model(
directory = sparse_file, # 指向模型文件夹
import_points = False, # 导入稀疏点云
import_cameras = True, # 导入相机
add_background_images = False, # 把原始照片挂到相机上
adjust_render_settings = True, # 自动把渲染分辨率改成相机分辨率
adjust_clipping_distance= False # 自动把裁剪面设置得更合适
)
print("导入成功!")
mesh_object, vertices = load_obj_vertices(mesh_file)
# 场景中查找相机名称为74_8_cam的相机
camera = None
for obj in bpy.data.objects:
if obj.type == 'CAMERA':
camera = obj
if camera.name == "123_2_cam":
render_and_save(camera, str(output_path), camera.name)
# break
# 加载 mesh,得到 mesh_object 和 顶点数组
# if camera:
# print("找到名称为74_8_cam的相机。")
# else:
# print("未找到名称为74_8_cam的相机。")
"""
blender --background --python /data/code/pose_toolkit/render_img.py -- \
--sparse_file "/data/datasets_20t/Downloads_google/rander_obj_image/2124/render_pose/" \
--mesh_file "/data/datasets_20t/Downloads_google/rander_obj_image/2124/2124.obj" \
--output_path "/data/datasets_20t/Downloads_google/rander_obj_image/2124/output"
blender --background --python /data/code/pose_toolkit/render_img.py -- \
--sparse_file "/data/datasets_20t/Downloads_google/rander_obj_image/1030/render_pose/" \
--mesh_file "/data/datasets_20t/Downloads_google/rander_obj_image/1030/obj/1030.obj" \
--output_path "/data/datasets_20t/Downloads_google/rander_obj_image/1030/output"
blender --background --python /data/code/pose_toolkit/render_img.py -- \
--sparse_file "/data/datasets_20t/Downloads_google/rander_obj_image/1026/render_pose/" \
--mesh_file "/data/datasets_20t/Downloads_google/rander_obj_image/1026/obj/1026.obj" \
--output_path "/data/datasets_20t/Downloads_google/rander_obj_image/1026/output"
blender --background --python /data/code/pose_toolkit/render_img.py -- \
--sparse_file "/data/datasets_20t/Downloads_google/rander_obj_image/959/render_pose/" \
--mesh_file "/data/datasets_20t/Downloads_google/rander_obj_image/959/obj/959.obj" \
--output_path "/data/datasets_20t/Downloads_google/rander_obj_image/959/output"
"""
Loading…
Cancel
Save