基于OpenCV的三维数据点的曲面重构_MySurefaceReconstruction
2024-09-05 05:48:29
在Opencv中有个Viz模块,可以显示三维物体,还可以实现三维动画,本来是很好的东东,但是里面的函数、类的说明太过简单,始终不得要领。不过其中一个扩展功能非常好,就是你可以在vtk中设计自己的模型类,在Opencv中的Viz3d窗口中显示。
在这里我用vtk中的vtkSurfaceReconstructionFilter类,这是一个对空间点拟合曲面的函数,重新封装了该函数,创建了自己的类:MySurfaceReconstruction,该类可以直接在Viz中的Viz3d窗口中显示。
本程序中所需要的头文件如下:
#ifndef INITIAL_OPENGL
#define INITIAL_OPENGL
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL)
VTK_MODULE_INIT(vtkInteractionStyle)
#endif #include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/viz/vizcore.hpp>
#include <opencv2/viz/viz3d.hpp>
#include <opencv2/viz/widget_accessor.hpp>
using namespace cv;
using namespace std; #include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkSmartPointer.h"
#include "vtkProperty.h"
#include "vtkPoints.h"
#include "vtkCellArray.h"
#include "vtkSurfaceReconstructionFilter.h"
#include "vtkContourFilter.h"
下面是该类的代码:
class MySurfaceReconstruction:public viz::Widget3D
{
public:
MySurfaceReconstruction(const Mat&src, const viz::Color color = viz::Color::white()); };
MySurfaceReconstruction::MySurfaceReconstruction(const Mat &src, const viz::Color color)
{ vtkSmartPointer<vtkPoints>m_Points=vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkCellArray>vertices=vtkSmartPointer<vtkCellArray>::New();
int numOfpixs=;
for(int i=;i<src.rows;i++)
{
for(int j=;j<src.cols;j++)
{
double x=j,y=i;
double z=src.at<double>(i,j);
m_Points->InsertPoint(numOfpixs,x,y,z); //_加入点信息
vertices->InsertNextCell(numOfpixs); //_加入细胞顶点信息----用于渲染点集
vertices->InsertCellPoint(numOfpixs);
numOfpixs ++;
}
} vtkSmartPointer<vtkPolyData>points=vtkSmartPointer<vtkPolyData>::New();
points->SetPoints(m_Points);
vtkSmartPointer<vtkSurfaceReconstructionFilter>surf=vtkSmartPointer<vtkSurfaceReconstructionFilter>::New();
surf->SetInputData(points); vtkSmartPointer<vtkContourFilter>contour=vtkSmartPointer<vtkContourFilter>::New();
contour->SetInputConnection(surf->GetOutputPort());
contour->SetValue(,0.0); vtkSmartPointer<vtkPolyDataMapper>pointMapper=vtkSmartPointer<vtkPolyDataMapper>::New();
pointMapper->SetInputConnection(contour->GetOutputPort());
vtkSmartPointer<vtkActor>actor=vtkSmartPointer<vtkActor>::New();
actor->SetMapper(pointMapper);
// Store this actor in the widget in order that visualizer can access it
viz::WidgetAccessor::setProp(*this, actor);
// Set the color of the widget. This has to be called after WidgetAccessor.
setColor(color); }
为了方便测试,自定义了一个高斯分布函数:
//*9. 获取二维高斯卷积核
Mat Gaussian_kernel(int kernel_size, double sigma)
{
int c = (kernel_size) / ;
Mat kernel(kernel_size, kernel_size, CV_64FC1);
double s = * sigma*sigma;
for (int i = ; i < kernel_size; i++)
{
for (int j = ; j < kernel_size; j++)
{
double x = j - c;
double y=i - c;
kernel.ptr<double>(i)[j] = exp(-(x*x+y*y)/s) ;
}
}
Scalar sumOfKernel= cv::sum(kernel);//求kernel的所有像素值之和
kernel /=sumOfKernel[];//归一化,避免卷积过程中增大总能量
return kernel;
}
下面是测试程序,通过上面的高斯函数创建一个高斯分布二维矩阵mat,作为MySurfaceReconstruction类的初始输入,MySurfaceReconstruction可以将mat转化成Widget3d类物体,并通过Viz3d显示。
int main()
{
/// Create a window
viz::Viz3d myWindow("Creating Widgets");
/// Create a triangle widget
cv::Mat mat=Gaussian_kernel(,);
mat *=;
MySurfaceReconstruction tw(mat, viz::Color::red());
/// Show widget in the visualizer window
myWindow.showWidget("my surface", tw);
/// Start event loop
myWindow.spin();
return ;
}
下面是运行结果:
最新文章
- 深入学习HBase架构原理
- visual stdio 2015安装配置及原理
- android Camera 中如何修改缩放变焦参数
- c++ builder xe2 (Embarcadero rad studio) 远程调试 同样适用于 delphi 远程调试 教程
- linux信息查找
- iOS - UITableViewCell Custom Selection Style Color
- List<;T>;对元素的查找。
- Lsyncd - 实时文件同步工具(精译)
- SQLServer修改登陆账户信息
- MySQL5.7 关键字和保留关键字
- 关于db2处理特殊字段出现异常java.io.charConversionException
- [物理学与PDEs]第1章第2节 预备知识 2.3 Faraday 电磁感应定律
- jenkins命令行修改时间
- NonAction与ChildActionOnly
- 在EntityFramework6中执行SQL语句【转】
- 《DSP using MATLAB》Problem 4.2
- iOS - PairProgramming 结对编程
- RabbitMQ学习在windows下安装配置
- Java学习---多线程的学习
- macOS Sierra上Opencv的安装与使用