基于图像的深度学习与MVS三维重建全流程服务 支持远程部署定制 含pcl/c++/matlab...
基于图像的深度学习MVS三维重建全流程 可远程部署可定制 点云pclcmatlab开发基于图像三维重建点云算法开发 只需要提供摄的图像即可生成完整的三维模型(大小场景均可)上周去爬了个浙西的小众山拍了快200张照片本来想整个3D模型给朋友当纪念结果找了一圈要么要几十万的专业扫描设备要么在线工具抠抠搜搜只能弄个指甲盖大的小挂件折腾了两天才捣鼓出这套能用的基于图像的深度学习MVS三维重建流程——说白了就是只需要拍一堆照片不管是手机拍的日常照还是无人机航拍的大场景都能生成完整的3D模型而且能远程部署、按需定制用的工具都是C、Matlab配合PCL点云库全是能落地的东西不是实验室里飘着的论文方案。基于图像的深度学习MVS三维重建全流程 可远程部署可定制 点云pclcmatlab开发基于图像三维重建点云算法开发 只需要提供摄的图像即可生成完整的三维模型(大小场景均可)先给大伙捋一遍完整流程拍照片→批量预处理→深度学习特征匹配→MVS生成深度图→点云优化→网格重建→纹理映射每一步都能改参数定制下面边唠边插点实际用的代码。第一步先把照片捋顺Matlab批量预处理你手机拍的照片肯定乱七八糟的有带镜头畸变的有分辨率不一样的还有糊掉的。我写了个Matlab脚本批量处理把这些破事都干了% 批量处理拍摄的图像去畸变统一分辨率 function batch_preprocess_img(src_dir, dst_dir, camera_param) if ~exist(dst_dir, dir), mkdir(dst_dir); end img_list dir(fullfile(src_dir, *.jpg)); for i 1:length(img_list) img_path fullfile(src_dir, img_list(i).name); img imread(img_path); % 用提前标定好的相机内参去畸变手机镜头自带畸变不去的话匹配会乱 undist_img undistortImage(img, camera_param.Intrinsics); % 统一缩放到1920x1080大场景的话缩更小点也行避免内存炸了 resized_img imresize(undist_img, [1080, 1920]); imwrite(resized_img, fullfile(dst_dir, sprintf(proc_%04d.jpg, i))); end end这段代码没啥花活就是帮你把照片都整成一个模子——要是你不知道相机内参用Matlab自带的相机标定工具箱拍个棋盘格就行5分钟就能搞定比网上那些在线标定工具靠谱多了。第二步聪明的特征匹配CONNX深度学习传统的SIFT匹配不仅慢还容易把山上的石头和旁边的树认错我用了LoFTR这个预训练模型比SIFT聪明一百倍而且能转成ONNX格式在C里跑不用装Python环境方便打包部署。// C 加载LoFTR ONNX模型做特征匹配 #include onnxruntime_cxx_api.h #include opencv2/opencv.hpp int main() { // 初始化ONNX运行环境线程开8个适合服务器跑 Ort::Env env(ORT_LOGGING_LEVEL_WARNING, loftr_matcher); Ort::SessionOptions session_options; session_options.SetIntraOpNumThreads(8); auto session Ort::Session(env, loftr_outdoor.onnx, session_options); // 读取两张预处理后的图像转成灰度图加快推理 cv::Mat img1 cv::imread(proc_0001.jpg, cv::IMREAD_GRAYSCALE); cv::Mat img2 cv::imread(proc_0002.jpg, cv::IMREAD_GRAYSCALE); cv::resize(img1, img1, {640, 480}); cv::resize(img2, img2, {640, 480}); // 这里省略把图像转成ONNX需要的张量代码说白了就是归一化转成通道在前的格式 // 跑推理拿到匹配的特征点然后用RANSAC过滤掉错误的匹配对 // ...省掉的代码都是些杂活核心就是跑模型拿匹配结果 return 0; }为啥要用这个我之前用COLMAP自带的匹配器跑景区照片跑了3小时还一堆错配换了LoFTR之后只花了40分钟而且错误匹配少了90%说白了就是省时间还省心。第三步点云整容手术PCL点云优化MVS生成的原始点云简直没法看有一堆噪点比如风吹动的树叶留下的杂点还有太密的地方电脑根本跑不动这时候就轮到PCL出场了我写了段C代码做去噪、下采样和法线估计// PCL 点云预处理去噪下采样法线估计 #include pcl/io/pcd_io.h #include pcl/filters/statistical_outlier_removal.h #include pcl/filters/voxel_grid.h #include pcl/features/normal_3d.h int main() { pcl::PointCloudpcl::PointXYZRGB::Ptr cloud(new pcl::PointCloudpcl::PointXYZRGB); // 加载MVS生成的原始点云文件 if (pcl::io::loadPCDFilepcl::PointXYZRGB(mvs_output.pcd, *cloud) -1) { PCL_ERROR(Couldnt read the point cloud file!\n); return (-1); } // 第一步去掉离群点比如那些孤零零的噪点 pcl::StatisticalOutlierRemovalpcl::PointXYZRGB sor; sor.setInputCloud(cloud); sor.setMeanK(50); // 每个点看周围50个邻居 sor.setStddevMulThresh(1.0); // 偏离标准差1倍以上的就删掉 pcl::PointCloudpcl::PointXYZRGB::Ptr cloud_filtered(new pcl::PointCloudpcl::PointXYZRGB); sor.filter(*cloud_filtered); // 第二步体素下采样把太密的点云弄稀疏不然大场景跑不动 pcl::VoxelGridpcl::PointXYZRGB vg; vg.setInputCloud(cloud_filtered); vg.setLeafSize(0.01f, 0.01f, 0.01f); // 1cm的体素小场景用0.005大场景用0.05都行 pcl::PointCloudpcl::PointXYZRGB::Ptr cloud_downsampled(new pcl::PointCloudpcl::PointXYZRGB); vg.filter(*cloud_downsampled); // 第三步估计法线后面生成网格需要这个来贴纹理 pcl::NormalEstimationpcl::PointXYZRGB, pcl::Normal ne; ne.setInputCloud(cloud_downsampled); pcl::search::KdTreepcl::PointXYZRGB::Ptr tree(new pcl::search::KdTreepcl::PointXYZRGB()); ne.setSearchMethod(tree); pcl::PointCloudpcl::Normal::Ptr cloud_normals(new pcl::PointCloudpcl::Normal); ne.setKSearch(10); ne.compute(*cloud_normals); // 保存处理好的干净点云 pcl::io::savePCDFileASCII(clean_cloud.pcd, *cloud_downsampled); return 0; }这段代码就是给点云做美容先把脸上的痘痘噪点挤掉再把脸瘦下来下采样最后给脸做个发型法线不然后面生成的网格就是黑乎乎的一团啥也看不清。第四步远程部署和定制这套流程我打包成了Docker镜像不管是阿里云还是腾讯云一键就能部署甚至可以写成REST API别人不用装任何环境只要上传照片就能拿到3D模型——我用FastAPI写了个demo接口大概长这样from fastapi import FastAPI, UploadFile, File import subprocess import os app FastAPI() app.post(/reconstruct) async def reconstruct(files: list[UploadFile] File(...)): save_dir upload_imgs os.makedirs(save_dir, exist_okTrue) for i, file in enumerate(files): with open(f{save_dir}/img_{i}.jpg, wb) as f: f.write(await file.read()) # 调用我们的C重建脚本支持传参数自定义精度 subprocess.run([bash, run_reconstruct.sh, save_dir, --leaf-size0.02]) return {download_url: https://your-server.com/output/model.obj}定制化的空间也很大要是你做工业零件检测就把滤波参数调严一点去掉更多杂点要是你做无人机航拍的大场景就加上分块重建的逻辑不然几百张航拍图直接跑内存直接炸甚至可以把生成的模型直接导入Unity或者Unreal里做可视化这些都能改。最后唠两句我上周用这套流程跑了那座山的200张照片服务器上跑了大概20分钟生成的模型细节还挺全的路边的石头、树上的枝桠都能看清不管是小到钥匙扣大到整个景区都能搞定。要是你也有照片想要生成3D模型或者想要定制这套流程随时来唠
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2457054.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!