Opencv中的WMesh

Stella981
• 阅读 915

费了半天劲,终于把这个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(0)[j][0]=x; cloud.ptr(0)[j][1]=y; cloud.ptr(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/2,cy=rows/2;

    //为cloud矩阵赋值
    for(int i=0;i<rows;i++)
    {
        float y=i-cy;
        for(int j=0;j<cols;j++)
        {
            float x=j-cx;
            cloud.ptr<Vec3f>(i)[j][0]=x;
            cloud.ptr<Vec3f>(i)[j][1]=-y;
            cloud.ptr<Vec3f>(i)[j][2]=(img.ptr<Vec3b>(i)[j][0]
                                      +img.ptr<Vec3b>(i)[j][1]
                                      +img.ptr<Vec3b>(i)[j][2])/3;
        }
    }
    ///创建polygons矩阵,并为其赋值,它的第0个元素是三维点的个数
    /// 剩下的元素值分别为1、2、3......、N。此次的N表示总的三维点数
    Mat polygon(1,cols*rows+1,CV_32SC1,Scalar::all(0));
    polygon.ptr<int>(0)[0]=rows*cols;
    for(int i=1;i<=polygon.cols;i++)
        polygon.ptr<int>(0)[i]=i;
    ///下面是把二维的cloud转化为一维的cloud
    Mat cloud1d=cloud.reshape(0,cloud.rows*cloud.cols);
    cloud1d=cloud1d.t();
    ///创建并赋值Mesh对象
    viz::Mesh mesh;
    mesh.cloud=cloud1d;
    mesh.polygons=polygon;
    ///创建颜色矩阵
    Mat color;
    color=img.reshape(0,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 0;
}

Opencv中的WMesh

Opencv中的WMesh

点赞
收藏
评论区
推荐文章
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
OpenWrt mesh组网设置
Mesh组网的主要是利用8021.s协议创建mesh结点结点之间进行数据同步kvr协议负责终端在各结点之间漫游同步操作三频路由器mesh结点数据同步都是走一个频段其他的数据走宁外两个频段,所以效果会好些一般的路由器只有5GHZ主要是5.2GHZ频段,2.4G频段本文主要是介绍路由器刷了Openwrt之后Mesh组网的设置,达到无缝
Wesley13 Wesley13
3年前
Unity Mesh基础系列(四)mesh变形(制作一个弹力球)
目录1场景搭建2Mesh调节器2.1准备2.2顶点速度3Mesh调节器的输入3.1输入检测3.2施加力3.3力偏移4最基础的变形4.1将力转换为速度4.2移动顶点5保持形状5.1弹簧5.2阻尼6处理变换6.1调整缩放本章内容重点向对象投射射线
Stella981 Stella981
3年前
Mecha:将 Mesh 进行到底
内容摘要:ServiceMesh落地实践三年,效果一直并不理想,到了该反思的时候了。Mecha作为面向服务的分布式能力抽象层,是ServiceMesh模式的自然进化版本,预计也将是云原生化和Mesh化的必然趋势,让我们将Mesh进行到底。Mecha介绍什么是Macha?Mecha一词,相信爱好动
Wesley13 Wesley13
3年前
Unity实现瓦片地图tile map
Unity自定义mesh绘制(https://my.oschina.net/kkkkkkkkkkkkk/blog/1545422) 基于上篇的mesh修改,实现tilemap第一步,修改mesh顶点和三角片信息,生成方格!(https://static.oschina.net/uploads/space/2017/1002/230643
Wesley13 Wesley13
3年前
Unity自定义mesh绘制
有些时候需要自定义mesh来绘制目标模型图形什么的,可以代码控制,也可以通过shader去控制,这里介绍代码控制的方法:基本思路是修改mesh的定点,三角达到自定义的目的,和上上篇垂直UI.Text显示异曲同工之处。由于一个mesh是有顶点信息,和对应三角形组合而成。!(https://static.oschina.net/uploads
Wesley13 Wesley13
3年前
2D实现背景图3D滚动效果(透视) !Cocos Creator !
\战斗地面效果!在2D中实现有纵深感(透视)的卷动效果。效果!(http://lamyoung.com//img/inpost/202006/2901.gif)回顾这次的纹理管理仍然是使用Sprite组件的渲染模式Mesh,需要的可以参考初探精灵中的网格渲染模式!(https://www.o
Wesley13 Wesley13
3年前
unity将 -u4E00 这种 编码 转汉字 方法
 unity中直接使用 JsonMapper.ToJson(对象),取到的字符串,里面汉字可能是\\u4E00类似这种其实也不用转,服务器会通过类似fastjson发序列化的方式,将json转对象,获取对象的值就是中文但是有时服务器要求将传参中字符串中类似\\u4E00这种转汉字,就需要下面 publ
Wesley13 Wesley13
3年前
Unity 凹多边形三角剖分
游戏中需要实现一个小功能,显示一个玩家的能力图,这个图是一个有6个顶点任意摆放组合的多边形。而绘制多边形主要用到的知识就是Mesh构建,mesh的构建主要需要顶点列表,三角形列表,法线列表、uv列表等等等等,在这里我们只考虑顶点列表和三角形列表。那么我们需要做的就是给定一组顶点之后,如何用三角形进行划分,以便绘制。以下讨论的多边形:1.三角形顶点列表为顺
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这