Visual Hull基于序列图像的三维重建

Visual Hull方法依赖于序列图像和相机投影矩阵P进行三维重建。在实际操作中,相机标定是个关键步骤,不确定是只需标定一次,还是需要随着图像角度变化进行多次标定。尽管激光标定板旋转一周的方法常见,但对于小物体和不同焦距的镜头,可能不适用。无论采用何种标定方式,只要获得每张图像的P矩阵,就能进行三维重建。开发环境包括Windows8.1、VS2010、OpenCV2.4.9和VTK。通过修改从GitHub找到的松鼠模型示例代码,实现了成功的三维重建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Visual Hull是基于轮廓信息的三维重建,输入是序列图像以及对应序列图像的相机投影矩阵P。如果换成自己想要的序列图像,

相应的P矩阵也需要更换,因为P矩阵是相机标定后得到的。现在感觉自己作标定遇到了些许困难,不知是只作一次标定,还是

需要标定板也旋转一周,根据图像数量的多少旋转相应的角度,标定一周?我看过github上码主的视频,用的是激光标定板旋转一周作的标定,但是针对小物体,标定板也相对更小,镜头的焦距也相应变小,此时感觉这个办法就不是很通用了。不过可以放心的是,不论用什么办法标定,只要拿到每张图像对应的P矩阵,就能完成物体的三维重建。

开发环境:windows8.1,vs2010,opencv2.4.9,vtk;

完整代码我是在github上找到的,以松鼠模型为例子,代码原本有些错误,改了改之后,可以成功运行。

啥也不多说,直接贴代码吧。

// trySquirral.cpp : 定义控制台应用程序的入口点。
//
// Squirral.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#include <vtkSmartPointer.h>
#include <vtkStructuredPoints.h>
#include <vtkPointData.h>
#include <vtkPLYWriter.h>
#include <vtkFloatArray.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkImageCast.h>  
#include <vtkImageShiftScale.h>  
#include <vtkMetaImageReader.h>  
#include <vtkImageViewer2.h>  
#include <vtkRenderWindowInteractor.h>
#include <vtkMarchingCubes.h>
#include <vtkCleanPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkProperty.h>
#include <vtkAutoInit.h>
#include <vtkImageCanvasSource2D.h>

VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
 
using namespace cv;




const int IMG_WIDTH = 1280;
const int IMG_HEIGHT = 960;
const int VOXEL_DIM = 128;
const int VOXEL_SIZE = VOXEL_DIM*VOXEL_DIM*VOXEL_DIM;
const int VOXEL_SLICE = VOXEL_DIM*VOXEL_DIM;
const int OUTSIDE = 0;

struct voxel {
    float xpos;
    float ypos;
    float zpos;
    float res;
    float value;
};

struct coord {
    int x;
    int y;
};

struct startParams {
    float startX;
    float startY;
    float startZ;
    float voxelWidth;
    float voxelHeight;
    float voxelDepth;
};

struct camera {
    cv::Mat Image;
    cv::Mat P;
    cv::Mat K;
    cv::Mat R;
    cv::Mat t;
    cv::Mat Silhouette;
};

void exportModel(char *filename,
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值