博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于OpenCV的三维数据点的曲面重构_MySurefaceReconstruction
阅读量:5173 次
发布时间:2019-06-13

本文共 3343 字,大约阅读时间需要 11 分钟。

在Opencv中有个Viz模块,可以显示三维物体,还可以实现三维动画,本来是很好的东东,但是里面的函数、类的说明太过简单,始终不得要领。不过其中一个扩展功能非常好,就是你可以在vtk中设计自己的模型类,在Opencv中的Viz3d窗口中显示。

在这里我用vtk中的vtkSurfaceReconstructionFilter类,这是一个对空间点拟合曲面的函数,重新封装了该函数,创建了自己的类:MySurfaceReconstruction,该类可以直接在Viz中的Viz3d窗口中显示。

本程序中所需要的头文件如下:

#ifndef INITIAL_OPENGL#define INITIAL_OPENGL#include 
VTK_MODULE_INIT(vtkRenderingOpenGL)VTK_MODULE_INIT(vtkInteractionStyle)#endif#include
#include
#include
#include
#include
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
m_Points=vtkSmartPointer
::New(); vtkSmartPointer
vertices=vtkSmartPointer
::New(); int numOfpixs=0; for(int i=0;i
(i,j); m_Points->InsertPoint(numOfpixs,x,y,z); //_加入点信息 vertices->InsertNextCell(numOfpixs); //_加入细胞顶点信息----用于渲染点集 vertices->InsertCellPoint(numOfpixs); numOfpixs ++; } } vtkSmartPointer
points=vtkSmartPointer
::New(); points->SetPoints(m_Points); vtkSmartPointer
surf=vtkSmartPointer
::New(); surf->SetInputData(points); vtkSmartPointer
contour=vtkSmartPointer
::New(); contour->SetInputConnection(surf->GetOutputPort()); contour->SetValue(0,0.0); vtkSmartPointer
pointMapper=vtkSmartPointer
::New(); pointMapper->SetInputConnection(contour->GetOutputPort()); vtkSmartPointer
actor=vtkSmartPointer
::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) / 2;    Mat kernel(kernel_size, kernel_size, CV_64FC1);    double s = 2 * sigma*sigma;    for (int i = 0; i < kernel_size; i++)    {        for (int j = 0; j < kernel_size; j++)        {            double x = j - c;            double y=i - c;            kernel.ptr
(i)[j] = exp(-(x*x+y*y)/s) ; } } Scalar sumOfKernel= cv::sum(kernel);//求kernel的所有像素值之和 kernel /=sumOfKernel[0];//归一化,避免卷积过程中增大总能量 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(15,1);    mat *=10;    MySurfaceReconstruction tw(mat, viz::Color::red());    /// Show widget in the visualizer window    myWindow.showWidget("my surface", tw);    /// Start event loop    myWindow.spin();   return 0;}

 下面是运行结果:

 

转载于:https://www.cnblogs.com/phoenixdsg/p/8439285.html

你可能感兴趣的文章
【poj3294-不小于k个字符串中最长公共子串】后缀数组
查看>>
java如何获取其它用户登录的真是IP地址
查看>>
Jquery通过指定层次关系获取元素
查看>>
c# for 和 foreach 的区别
查看>>
docfx (一)
查看>>
HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
查看>>
深度学习之前馈神经网络(前向传播和误差反向传播)
查看>>
IEnumerable<T>和IQueryable<T>区别
查看>>
(转)MFC界面风格
查看>>
Centos7 tmux1.6 安装
查看>>
二叉树(三)
查看>>
linux加密文件系统 fsck 无法修复一例
查看>>
【linux配置】VMware安装Redhat6.5
查看>>
AI自主决策——有限状态机
查看>>
《http权威指南》阅读笔记(二)
查看>>
软件工程
查看>>
http协议
查看>>
js替换问题replace和replaceAll
查看>>
c++11 : range-based for loop
查看>>
中国农历2013,2014 (zz.IS2120@BG57IV3)
查看>>