费了半天劲,终于把这个WMesh类搞懂了,可惜效果不佳,比Matlab中的mesh差多了。

使用WMesh前,需要有一个Mesh对象,Mesh是三维数据点的基本几何信息、颜色信息、索引信息等集成的对象。Mesh对象无法直接在Viz3d中显示,需要转换为WMesh对象,然后才可以显示。

首先了解Mesh类:

我们先看看Mesh的定义,在Mesh中有四个Mat型的成员变量,分别是cloud、colors和normals。

望名知意,cloud表示点云,它实际上是点云中每个点的坐标组成的二维矩阵,它的通道数为3,所以cloud的数据类型为:CV_32FC3,cloud的三个通道[0]、[1]、[2]分别对应坐标的x、y、z。对cloud还有一个特殊要求,那就是一行、N列,也就是一个一位矢量。需要预先把每个点坐标依次赋值给cloud的一些列元素,比如点P(x,y,z),赋值给cloud的第0行、j列元素:cloud.ptr<Vec3f>(0)[j][0]=x; cloud.ptr<Vec3f>(0)[j][1]=y; cloud.ptr<Vec3f>(0)[j][2]=z。

在Mesh中的第二个成员colors也是一个一维矩阵,1行、N列,与cloud的尺度一致。colors通常是3通道或四通道,但绝不以是2通道。三通道时,分别对应红、绿、蓝三原色。colors的每个元素与cloud中的元素一一对应,分别给cloud中对应元素赋予颜色。还有一点需要注意,colors的每个通道上的数据类型必须是CV_8U,因此colors的数据类型通常为CV_8UC3。

第三个公有成员是normals,它与colors类似,具体内容还没有研究。

第四个共有成员是polygons,它也是一个一维行矢量,但是列数要比cloud多一列,在polygons的第一个

还有一个公有静态成员函数load,大家自己研究吧!

class CV_EXPORTS Mesh
{
public:
Mat cloud, colors, normals;
//! Raw integer list of the form: (n,id1,id2,...,idn, n,id1,id2,...,idn, ...)
//! where n is the number of points in the poligon, and id is a zero-offset index into an associated cloud.
Mat polygons;
//! Loads mesh from a given ply file
static Mesh load(const String& file);
};

接下来,我们以一个实例来说明Mesh的用法。在本示例中,我读取了一幅图像,将图像的灰度值作为z值,这样就可以以三维的形式观察二维图像数据:

#include <opencv2/viz/vizcore.hpp>
#include <opencv2/opencv.hpp> #include <iostream>
using namespace cv;
using namespace std;
//#include "myfunction.h" int main()
{
Mat img=imread("D:/CodeWork/MyImage/opencv_logo.png"); Mat gray;
img.convertTo(gray,CV_32FC1); int rows=img.rows,cols=img.cols;
//为了赋值方便,这里我用了与img同行、同列的矩阵
Mat cloud(rows,cols,CV_32FC3);
int cx=cols/,cy=rows/; //为cloud矩阵赋值
for(int i=;i<rows;i++)
{
float y=i-cy;
for(int j=;j<cols;j++)
{
float x=j-cx;
cloud.ptr<Vec3f>(i)[j][]=x;
cloud.ptr<Vec3f>(i)[j][]=-y;
cloud.ptr<Vec3f>(i)[j][]=(img.ptr<Vec3b>(i)[j][]
+img.ptr<Vec3b>(i)[j][]
+img.ptr<Vec3b>(i)[j][])/;
}
}
///创建polygons矩阵,并为其赋值,它的第0个元素是三维点的个数
/// 剩下的元素值分别为1、2、3......、N。此次的N表示总的三维点数
Mat polygon(,cols*rows+,CV_32SC1,Scalar::all());
polygon.ptr<int>()[]=rows*cols;
for(int i=;i<=polygon.cols;i++)
polygon.ptr<int>()[i]=i;
///下面是把二维的cloud转化为一维的cloud
Mat cloud1d=cloud.reshape(,cloud.rows*cloud.cols);
cloud1d=cloud1d.t();
///创建并赋值Mesh对象
viz::Mesh mesh;
mesh.cloud=cloud1d;
mesh.polygons=polygon;
///创建颜色矩阵
Mat color;
color=img.reshape(,rows*cols);
color=color.t();
mesh.colors=color;
///mesh本身无法在三维窗口中显示,需要经过WMesh处理,得到WMesh对象wmesh
viz::WMesh wmesh(mesh); ///显示wmesh
imshow("original image",img);
viz::Viz3d my3DWin("My 3D Window");
my3DWin.setBackgroundColor(viz::Color::cyan());
my3DWin.showWidget("wmesh",wmesh); my3DWin.spin(); return ;
}

Opencv中的WMesh的更多相关文章

  1. opencv中Mat与IplImage,CVMat类型之间转换

    opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...

  2. 解析opencv中Box Filter的实现并提出进一步加速的方案(源码共享)。

    说明:本文所有算法的涉及到的优化均指在PC上进行的,对于其他构架是否合适未知,请自行试验. Box Filter,最经典的一种领域操作,在无数的场合中都有着广泛的应用,作为一个很基础的函数,其性能的好 ...

  3. OpenCV中IplImage图像格式与BYTE图像数据的转换

    最近在将Karlsruhe Institute of Technology的Andreas Geiger发表在ACCV2010上的Efficent Large-Scale Stereo Matchin ...

  4. opencv中的SIFT,SURF,ORB,FAST 特征描叙算子比较

    opencv中的SIFT,SURF,ORB,FAST 特征描叙算子比较 参考: http://wenku.baidu.com/link?url=1aDYAJBCrrK-uk2w3sSNai7h52x_ ...

  5. 混合高斯模型:opencv中MOG2的代码结构梳理

    /* 头文件:OurGaussmix2.h */ #include "opencv2/core/core.hpp" #include <list> #include&q ...

  6. opencv中的.at方法

    opencv中的.at方法是用来获取图像像素值得函数: interpolation:差值 histogram:直方图

  7. 【OpenCV】OpenCV中GPU模块使用

    CUDA基本使用方法 在介绍OpenCV中GPU模块使用之前,先回顾下CUDA的一般使用方法,其基本步骤如下: 1.主机代码执行:2.传输数据到GPU:3.确定grid,block大小: 4.调用内核 ...

  8. openCV中IplImage的使用

    http://blog.csdn.net/welcome_xu/article/details/7650680 IplImage结构详细分析   IplImage 结构解读: typedef stru ...

  9. Opencv中直线的表示方法

                               [blog算法原理]Opencv中直线的表示方法  一.问题的提出:​          在实际项目编写过程中,需要对直线(Line)进行特定的处 ...

随机推荐

  1. 使用CreateWindowEx创建子窗口的注意事项

    比如: 使用 HWND child = CreateWindowEx(0,L"childclass",NULL,WS_CHILD | WS_VISIBLE | WS_CLIPSIB ...

  2. Java开发必备技能!Eclipse快捷方式助力提升开发效率

    插件开发快捷方式 注意:包括org.eclipse.pde.runtime插件,用于Plug-in Spy功能. Shift + Alt + F1—Plug-in Selection Spy. Shi ...

  3. Acwing-203-同余方程(扩展欧几里得)

    链接: https://www.acwing.com/problem/content/205/ 题意: 求关于x的同余方程 ax ≡ 1(mod b) 的最小正整数解. 思路: 首先:扩展欧几里得推导 ...

  4. 对称加密算法DES、3DES和AES 原理总结(转载)

    1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发 ...

  5. win.10 禁止自动更新

             ·  Windows 10:“我已经更新完毕,请重启我吧主人!” ·  Windows 10:“好吧,主人在忙,我重启了先~” ·  Windows 10: “正在配置windows ...

  6. [Docker]docker搭建私有仓库(ssl、身份认证)

    docker搭建私有仓库(ssl.身份认证) 环境:CentOS 7.Docker 1.13.1 CentOS 7相关: https://www.cnblogs.com/ttkl/p/11041124 ...

  7. maven项目创7 配置分页插件

    页面编写顺序   首先确定是否拥有想要的pojo(对象实体类)———>dao层mybatis配置——>service层的接口及实现类——>controller(web下) 分页插件作 ...

  8. 2019牛客暑期多校训练营(第八场)A 单调栈

    题意 给一个\(n*m\)的01矩阵,找有多少个全1子矩阵不被其他全1子矩阵包括. 分析 用单调栈找到的全1子矩阵是不能向上扩展和向右扩展的,只需判断该子矩阵能否向左和向下扩展,若四个方向都不能扩展, ...

  9. HTML5属性备忘单

    在网上闲逛的时候看到了文章,感觉总结的这个html5文章,决定转载过来,在排版的时候也帮助自己重新梳理复习一遍.毕竟学习基础最重要. by zhangxinxu from http://www.zha ...

  10. Android_activity实现一个简单的新建联系表

    项目展示: 第一个Activity用于显示联系人信息 第二个Activity输入联系人信息 要求: 运行“新建联系人”程序,结果如下图所示: 点击“新建联系人”按钮,打开输入信息界面并输入姓名.公司. ...