【3D算法技術入門】如何基于建筑圖片重建三維數字資產?

在這里插入圖片描述

要基于建筑圖片重建三維數字資產是一個復雜的計算機視覺任務,涉及圖像采集、特征提取、相機姿態估計、稠密重建和三維模型優化等多個步驟。下面我將提供一個基于Python的解決方案框架,使用開源庫實現從圖片到三維模型的基本流程。

首先需要安裝必要的庫:

pip install opencv-python numpy matplotlib pycolmap trimesh open3d

下面是實現的核心代碼,包含了從圖像加載、特征匹配到三維點云生成的完整流程:

import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
import trimesh
import open3d as o3d
from pycolmap import Reconstruction, Image, Point3D# 1. 準備工作:設置路徑和參數
class BuildingReconstructor:def __init__(self, image_dir, output_dir):self.image_dir = image_dirself.output_dir = output_dirself.image_paths = [os.path.join(image_dir, f) for f in os.listdir(image_dir) if f.lower().endswith(('.png', '.jpg', '.jpeg'))]self.reconstruction = None# 創建輸出目錄os.makedirs(output_dir, exist_ok=True)os.makedirs(os.path.join(output_dir, 'sparse'), exist_ok=True)os.makedirs(os.path.join(output_dir, 'dense'), exist_ok=True)# 2. 圖像預處理def preprocess_images(self):"""對圖像進行預處理,包括 resize 和去畸變"""processed_dir = os.path.join(self.output_dir, 'processed_images')os.makedirs(processed_dir, exist_ok=True)processed_paths = []for img_path in self.image_paths:img = cv2.imread(img_path)# 調整圖像大小,保持比例h, w = img.shape[:2]max_dim = 1024if max(h, w) > max_dim:scale = max_dim / max(h, w)img = cv2.resize(img, (int(w*scale), int(h*scale)))# 保存處理后的圖像filename = os.path.basename(img_path)save_path = os.path.join(processed_dir, filename)cv2.imwrite(save_path, img)processed_paths.append(save_path)self.image_paths = processed_pathsprint(f"預處理完成,共 {len(processed_paths)} 張圖片")return processed_paths# 3. 特征提取與匹配(使用COLMAP進行稀疏重建)def run_sparse_reconstruction(self):"""使用COLMAP進行稀疏重建,獲取相機參數和稀疏點云"""print("開始稀疏重建...")# 調用COLMAP進行特征提取和匹配from pycolmap import feature_extractor, exhaustive_matcher, mapper# 特征提取feature_extractor(database_path=os.path.join(self.output_dir, 'database.db'),image_path=self.image_dir,image_list=self.image_paths,camera_mode=0  # 自動選擇相機模型)# 特征匹配exhaustive_matcher(database_path=os.path.join(self.output_dir, 'database.db'))# 三維重建self.reconstruction = mapper(database_path=os.path.join(self.output_dir, 'database.db'),image_path=self.image_dir,output_path=os.path.join(self.output_dir, 'sparse'),verbose=True)print(f"稀疏重建完成,生成 {len(self.reconstruction.points3D)} 個三維點")return self.reconstruction# 4. 稠密重建(生成密集點云)def run_dense_reconstruction(self):"""基于稀疏重建結果進行稠密重建"""if not self.reconstruction:raise ValueError("請先進行稀疏重建")print("開始稠密重建...")# 這里簡化實現,實際項目中可以使用OpenMVS或COLMAP的稠密重建模塊# 導出稀疏點云points = []colors = []for p3d in self.reconstruction.points3D.values():points.append(p3d.xyz)colors.append(p3d.color / 255.0)# 轉換為Open3D點云pcd = o3d.geometry.PointCloud()pcd.points = o3d.utility.Vector3dVector(np.array(points))pcd.colors = o3d.utility.Vector3dVector(np.array(colors))# 點云下采樣和去噪pcd = pcd.voxel_down_sample(voxel_size=0.05)cl, ind = pcd.remove_statistical_outlier(nb_neighbors=20, std_ratio=2.0)pcd = pcd.select_by_index(ind)# 保存稠密點云dense_pcd_path = os.path.join(self.output_dir, 'dense', 'point_cloud.ply')o3d.io.write_point_cloud(dense_pcd_path, pcd)print(f"稠密點云保存至 {dense_pcd_path},包含 {len(pcd.points)} 個點")return pcd# 5. 三維模型生成(從點云創建網格)def generate_mesh(self, pcd):"""從點云生成三維網格模型"""print("開始生成三維網格...")# 估計法向量pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))# 使用泊松表面重建生成網格with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm:mesh, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd, depth=9)# 裁剪低密度區域vertices_to_keep = densities > np.quantile(densities, 0.01)mesh = mesh.select_by_index(np.where(vertices_to_keep)[0])# 保存網格模型mesh_path = os.path.join(self.output_dir, 'building_mesh.ply')o3d.io.write_triangle_mesh(mesh_path, mesh)print(f"三維網格模型保存至 {mesh_path}")return mesh# 6. 可視化結果def visualize_results(self, pcd=None, mesh=None):"""可視化點云和網格模型"""if pcd:print("可視化點云...")o3d.visualization.draw_geometries([pcd], window_name="建筑點云")if mesh:print("可視化網格模型...")o3d.visualization.draw_geometries([mesh], window_name="建筑三維模型")# 執行完整流程def run_pipeline(self):"""執行完整的三維重建流程"""self.preprocess_images()self.run_sparse_reconstruction()pcd = self.run_dense_reconstruction()mesh = self.generate_mesh(pcd)self.visualize_results(pcd, mesh)return mesh# 主函數
def main():# 設置圖片目錄和輸出目錄image_dir = "building_images"  # 存放從小紅書收集的建筑圖片output_dir = "reconstruction_results"# 確保圖片目錄存在if not os.path.exists(image_dir) or len(os.listdir(image_dir)) == 0:print(f"錯誤:圖片目錄 {image_dir} 不存在或為空")print("請先在該目錄下放置建筑的多角度圖片")return# 創建重建器并運行reconstructor = BuildingReconstructor(image_dir, output_dir)mesh = reconstructor.run_pipeline()print("三維重建流程完成!")if __name__ == "__main__":main()

使用說明

這個代碼實現了從建筑圖片到三維模型的完整流程,主要分為以下幾個步驟:

  1. 數據準備

    • 在"building_images"文件夾中放入從小紅書收集的建筑圖片
    • 建議收集15-30張不同角度、不同光照條件下的圖片,覆蓋建筑各個面
  2. 代碼運行

    • 運行腳本后,程序會自動進行圖像預處理
    • 接著進行特征提取和匹配,構建稀疏點云
    • 然后生成稠密點云并構建三維網格模型
    • 最后可視化結果并保存模型文件
  3. 結果輸出

    • 處理后的圖片
    • 稀疏點云和稠密點云數據
    • 最終的三維網格模型(PLY格式),可導入Blender等軟件進一步編輯

注意事項

  1. 圖片質量對重建結果影響很大,建議使用清晰、光照均勻的圖片
  2. 拍攝時盡量圍繞建筑移動,保持重疊區域,避免劇烈視角變化
  3. 對于復雜建筑,可能需要更多圖片和后期手動優化
  4. 該代碼需要安裝COLMAP軟件,具體安裝方法請參考官方文檔
  5. 從網絡獲取圖片時請注意遵守版權規定和平臺條款

如果需要更高質量的重建結果,可以考慮使用專業的三維重建軟件如Agisoft Metashape,或在這個基礎上增加紋理映射、模型簡化等步驟。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94863.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94863.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94863.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

?CVPR2025 自動駕駛半監督 LiDAR 分割新范式:HiLoTs 框架深度解析

📄論文題目:HiLoTs: High-Low Temporal Sensitive Representation Learning for Semi-Supervised LiDAR Segmentation in Autonomous Driving ??作者及機構: R.D. Lin、Pengcheng Weng、Yinqiao Wang、Fei Wang(西安交通大學軟件…

【 MYSQL | 基礎篇 函數與約束 】

摘要:本文介紹數據庫中的函數與約束,函數含字符串、數值、日期、流程四類,可實現字符串處理、數值計算等需求。約束分六類,重點講外鍵約束的語法、刪除更新行為,保證數據正確完整。思維導圖1. 函數函數是指一段可以直接…

Oracle 數據庫性能調優:從瓶頸診斷到精準優化之道

引言:性能優化的本質在當今數據驅動的時代,數據庫性能直接關系到企業的運營效率和用戶體驗。Oracle 作為全球領先的關系型數據庫管理系統,承載著眾多企業的核心業務。然而,隨著數據量的增長和業務復雜度的提升,數據庫性…

楊校老師競賽課堂之C++語言GESP一級筆記

考試大綱 GESP一級考試大綱 計算機基礎與編程環境 計算機歷史 變量的定義與使用 基本數據類型(整型、浮點型、字符型、布爾型) 輸入與輸出(cin與cout、scanf與printf) 基本運算(算術運算、關系運算、邏輯運算&am…

操作系統-管程

1. 為什么需要管程?—— 信號量 (Semaphore) 的困境在理解管程之前,你必須先知道它要解決什么問題。之前,我們使用信號量 (Semaphore) 來實現進程/線程間的同步與互斥。雖然信號量功能強大,但它存在兩個主要問題:編程復…

日志的實現

目錄 日志與策略模式 Log.hpp class LogStrategy基類 class ConsoleLogStrategy派生類 classFileLogStrategy派生類 日志等級 獲得時間戳 localtime_r函數詳解 函數原型 struct tm結構的指針 Logger類(重點) class LogMessage 日志信息類 std::stringstream 用法 重…

【論文閱讀】Sparse4D v2:Recurrent Temporal Fusion with Sparse Model

標題: Sparse4D v2:Recurrent Temporal Fusion with Sparse Model 作者: Xuewu Lin, Tianwei Lin, Zixiang Pei, Lichao Huang, Zhizhong Su motivation 在v1的基礎上,作者發現長時序有更好的效果,但v1的計算量太大&am…

構建免費的音視頻轉文字工具:支持多語言的語音識別項目

在當今數字時代,音視頻內容越來越多,但如何快速將其轉換為文字一直是一個挑戰。本項目提供了一個免費的解決方案,支持將視頻和音頻文件轉換為文字,并且支持多語言識別。 一個支持中英文的音視頻轉文字工具,集成了 Vos…

【開題答辯全過程】以 基于SpringBootVue的智能敬老院管理系統為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人,語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

Linux 830 shell:expect,ss -ant ,while IFS=read -r line,

[rootsamba caozx26]# scp /home/caozx26/pub root192.168.235.3:~/ root192.168.235.3s password: /home/caozx26/pub: not a regular file [rootsamba caozx26]# ls app km nntp.sh ntp.sh until1.sh 公共 圖片 音樂 find.sh l2 ntp1.sh pub u…

???????GPT-5發布引爆爭議,奧特曼連夜回應!付費充值的Plus用戶成最大贏家?

摘要: GPT-5發布后,社區口碑兩極分化,從“強無敵”到“還我4o”的呼聲并存。面對技術故障和用戶質疑,OpenAI CEO薩姆奧爾特曼及團隊火速回應,公布了一系列補救措施和未來計劃。本文將帶你速覽這場風波始末,…

Python 操作 Redis 的客戶端 - Redis Stream

Python 操作 Redis 的客戶端 - Redis Stream1. Redis Stream2. Redis Commands2.1. CoreCommands.xadd() (生產端)2.2. CoreCommands.xlen() (生產端)2.3. CoreCommands.xdel() (生產端)2.4. CoreCommands.xrange() (生產端)2.5. RedisClusterCommands.delete()3. Redis Stream…

【Qt開發】按鈕類控件(一)-> QPushButton

目錄 1 -> 什么是 PushButton? 2 -> 相關屬性 3 -> 代碼示例 3.1 -> 帶有圖標的按鈕 3.2 -> 帶有快捷鍵的按鈕 4 -> 總結 1 -> 什么是 PushButton? 在 Qt 框架中,QPushButton 是最基礎且最常用的按鈕控件之一&am…

Citrix 零日漏洞自五月起遭積極利用

安全研究員 Kevin Beaumont 披露了有關 CVE-2025-6543 的驚人細節,這是一個嚴重的 Citrix NetScaler 漏洞,在該公司發布補丁之前的幾個月里,該漏洞被積極利用作為零日攻擊。 Citrix 最初將其輕描淡寫為簡單的“拒絕服務”漏洞,但…

【系列08】端側AI:構建與部署高效的本地化AI模型 第7章:架構設計與高效算子

第7章:架構設計與高效算子 要將AI模型成功部署到端側,除了對現有模型進行壓縮和優化,更根本的方法是在設計之初就考慮其在資源受限環境下的運行效率。本章將深入探討如何設計高效的網絡架構,以及如何理解并優化常用的核心算子。高…

42-Ansible-Inventory

文章目錄Ansible基本概述手動運維時代(原始社會)自動化運維時代自動化運維工具的優勢Ansible的功能及優點Ansible的架構Ansible的執行流程安裝AnsibleAnsible配置文件生效順序Ansible inventory主機清單Ansible基于免秘鑰方式管理客戶端小結Ansible-Adho…

Go語言runtime/trace工具全面解析

基本概念與功能 Go語言的runtime/trace是Go標準庫中內置的性能分析工具,主要用于追蹤和可視化Go程序的運行時行為。它能夠記錄程序執行期間的各種事件,包括goroutine調度、系統調用、垃圾回收(GC)、網絡I/O、鎖等待等關鍵信息。 trace工具的核心功能包括: goroutine生命周期…

Docker(自寫)

Docker程序是跑在操作系統上的,而操作系統上又裝了各種不同版本的依賴庫和配置程序依賴環境,環境不同,程序就可能跑不起來,如果我們能將環境和程序一起打包docker就是可以將程序和環境一起打包并運行的工具軟件基礎鏡像DockerFile…

深度拆解 OpenHarmony 位置服務子系統:從 GNSS 到分布式協同定位的全鏈路實戰

1. 系統概述 OpenHarmony 的“定位子系統”就是硬件服務子系統集里的 “位置服務子系統”(Location SubSystem)。它向下對接 GNSS/GPS、基站、Wi-Fi 等定位模組,向上以 標準位置 API 形式為應用提供 實時位置、軌跡、地理圍欄 等能力,并可與分布式軟總線聯動,實現 跨設備…

React Native基本用法

1,index調用registerComponent,把appName注入到React Native的根節點。 2,package.json是全局大管家,package-lock.json鎖定版本,不會手動編輯,通過install安裝 3, bebal.config.json bebal.config.json是翻…