深度图转换成点云[通俗易懂]

深度图转换成点云[通俗易懂]一、概述最近由于课题需要数据源,但是没有直接获取的方法,所以只能在周老师http://www.qianyi.info/的网站上自己下载深度图转换成点云数据,大概花了三点的时间,终于弄得差不多了,这里做个记录。二、数据准备和环境配置1、数据下载在http://redwood-data.org/indoor/dataset.html上下载CleanDepthSequence和Groun…

大家好,又见面了,我是你们的朋友全栈君。

一、概述

最近由于课题需要数据源,但是没有直接获取的方法,所以只能在周老师http://www.qianyi.info/的网站上自己下载深度图转换成点云数据,大概花了三天的时间,终于弄得差不多了,这里做个记录。

二、数据准备和环境配置

1、数据下载
在 http://redwood-data.org/indoor/dataset.html 上下载Clean Depth Sequence和Ground-truth Trajectory下的文件,如图:
在这里插入图片描述
本文以Living Room 1作为示例。

2、环境配置
开发工具为QT。根据网站介绍,在进行空间坐标计算的时候需要使用到一个转换矩阵Tk,而这个Tk则是需要在相机的轨迹文件中提取的,而相机的轨迹文件需要使用第1步中的txt文件进行解析得到。解析代码在http://redwood-data.org/indoor/fileformat.html中,提供了C++、Python和MATLAB的版本。

因为使用工具是QT,所以首选了C++版本的解析代码(C++版本需要配置PCL环境,具体配置方案见QT+PCL配置过程),但是在编译时发生错误,经过摸索后发现可能是Eigen与C++版本的问题,暂时没有找到好的解决办法,所以就改成了Python代码,这就涉及到了如何在QT中调用Python的问题,具体方法见QT调用Python模块

3、轨迹文件解析
直接利用Python代码进行解析。
.py文件:

import numpy as np
import numpy.linalg
#import cv2
#import math
#from numpy import array as matrix, arange

class CameraPose:
    def __init__(self, meta, mat):
        self.metadata = meta
        self.pose = mat

    def __str__(self):
        return 'Metadata : ' + ' '.join(map(str, self.metadata)) + '\n' + \
            "Pose : " + "\n" + np.array_str(self.pose)

def read_trajectory(filename):
    traj = []
    with open(filename, 'r') as f:
        metastr = f.readline();
        while metastr:
            metadata = map(int, metastr.split())
            mat = np.zeros(shape = (4, 4))
            for i in range(4):
                matstr = f.readline();
                mat[i, :] = np.fromstring(matstr, dtype = float, sep=' \t')
            traj.append(CameraPose(metadata, mat))
            metastr = f.readline()
    return traj

def write_trajectory(traj, filename):
    with open(filename, 'w') as f:
        for x in traj:
            p = x.pose.tolist()
            f.write(' '.join(map(str, x.metadata)) + '\n')
            f.write('\n'.join(' '.join(map('{0:.12f}'.format, p[i])) for i in range(4)))
            f.write('\n')


def ext():
    write_trajectory(read_trajectory("livingroom1-traj.txt"), "extraction_file.txt")
    print('extraction file successfully')

main.cpp文件:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

#include <vector>
#include <fstream>
#include <Eigen/Core>
#include <Eigen/StdVector>
#include <Python.h>
using namespace std;

int main()
{ 
   
    Py_Initialize();
    if(!Py_IsInitialized())
    { 
   
        return -1;
    }
    PyObject* pModule = PyImport_ImportModule("transformMatrixExt");
    if(!pModule)
    { 
   
        cout<<"open fail"<<endl;
        return -1;
    }
    PyObject* pFunhello = PyObject_GetAttrString(pModule,"ext");
    if(!pFunhello)
    { 
   
// cout<<"get function ext failed"<<endl;
        return -1;
    }
    PyObject_CallFunction(pFunhello, NULL);
    Py_Finalize();

}

这样就会得到轨迹txt文件了。

三、深度图转换

第二步已经将轨迹文件提取,但是里面的数据非常多,而用C++进行字符串操作远不如使用Python简单,所以这里继续使用Python进行相关文件操作。另外,在http://qianyi.info/scenedata.html中已经给出深度图转换方法,
在这里插入图片描述
所以这里直接上代码。
.py文件:

import numpy as np
import numpy.linalg
import cv2
import math
from numpy import array as matrix, arange
def generate_XYZ(depthBuffer, res, u, v, T):
    fx = 525.0
    fy = 525.0
    cx = 319.5
    cy = 239.5
    z = depthBuffer[res[1]*u+v]/1000
    x = (v-cx)*z/fx
    y = (u-cy)*z/fy
    w = np.array([x, y, z, 1], dtype='f')

    x = T[0,0]*w[0]+T[0,1]*w[1]+T[0,2]*w[2]+T[0,3]*w[3]
    y = T[1,0]*w[0]+T[1,1]*w[1]+T[1,2]*w[2]+T[1,3]*w[3]
    z = T[2,0]*w[0]+T[2,1]*w[1]+T[2,2]*w[2]+T[2,3]*w[3]

    return x, y, z

def readimg():
# img = cv2.imread('00000.png', -1)
# img = cv2.imread('01500.png', -1)
    img = cv2.imread('02869.png', -1)
    res = img.shape
    print(img[1,1])

# print(img[0])
# img = cv2.flip(img, 0)
# cv2.imshow('hh',img)
# cv2.waitKey(0)
    depth_buffer = np.array(np.array(img,dtype=np.float32).flatten())#img.flatten().astype(float32)/255

    T1 = arange(16, dtype='f').reshape(4,4)
    i = 0

    with open("extraction_file.txt", 'r') as f:
        content = f.read().splitlines()
# for stringline in content[7496:7500]:
# for stringline in content[1:5]:
        for stringline in content[14346:14350]:
            j = 0
            for number in stringline.split(' '):
                T1[i,j] = float(number)
                j = j+1
            i = i+1
    print(T1)
    flag = []
    print(res[1])
    for u in range(res[0]):
        for v in range(res[1]):
            x, y, z = generate_XYZ(depth_buffer, res, u, v, T1)
            flag.append([x, y, z])

    with open('02869.ply', 'w') as f:
        f.write('ply\nformat ascii 1.0\nelement vertex '+str(len(flag))+'\nproperty float x\nproperty float y\nproperty float z\nend_header\n')
        for loc in flag:
            f.write(str(loc[0])+' '+str(loc[1])+' '+str(loc[2])+'\n')

    print('finish')

这里需要注意的是,在读取深度图时,需要使用imread( , -1)方法,这样才是读取深度图,而在转换时,网站提到的深度图(u, v, d)坐标分别就是横坐标,纵坐标和深度值(像素值)。另外,在需要用到OpenCV时,发现在python中直接安装cv2库即可,比C++环境下的配置简单很多,暂时还没有发现在功能上太大的区别。

main.cpp文件:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

#include <vector>
#include <fstream>
#include <Eigen/Core>
#include <Eigen/StdVector>
#include <Python.h>
using namespace std;

int main()
{ 
   
    Py_Initialize();
    if(!Py_IsInitialized())
    { 
   
        return -1;
    }
    PyObject* pModule = PyImport_ImportModule("transformMatrixExt");
    if(!pModule)
    { 
   
        cout<<"open fail"<<endl;
        return -1;
    }
    PyObject* pFunhello = PyObject_GetAttrString(pModule,"readimg");
    if(!pFunhello)
    { 
   
// cout<<"get function ext failed"<<endl;
        return -1;
    }
    PyObject_CallFunction(pFunhello, NULL);
    Py_Finalize();

}

转换结果截图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这三个分别是http://qianyi.info上面的livingroom1-depth-clean里面的00000.png,01500.png和02869.png三张深度序列图转换成点云的场景截图,如果要还原成一个完整的场景,好像需要把一共2870序列图都要转换。但是这里有个疑问,每张深度图转换出的点云数量是307200个,在网站上可以看到一个完整的点云数量是200多万个,而完整的序列是2870张,所以这个数量最终无法对上,需要继续探索。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/138949.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • bp神经网络的设计方法_bp神经网络例子

    bp神经网络的设计方法_bp神经网络例子基于BP神经网络的室内声源定位算法的实现(附有程序)问题描述现在有一个安静的房子,有一个人在房间里走动,我要利用屋里的麦克风接收这个人的脚步声,然后对这个人进行定位。问题的意义声源定位,这个问题的研究意义重大,它能克服视觉定位的缺点(即只能对看得到的地方进行定位)。问题的研究方法本文只讨论基于麦克风阵列的声源定位(即利用麦克风收集声源信息)。目前解决这个问题的主流方法有三个,分别是基于最大输出功率的可控波束形成技术、基于高分辨率谱估计技术、基于声达时间差的定位技术。这三种方法都是通过研究声音的

  • 开源服务器监控工具——zabbix(二)[通俗易懂]

    开源服务器监控工具——zabbix(二)[通俗易懂]基本知识及安装操作见:开源服务器监控工具——zabbix(一)使用脚本操作zabbix我们可以利用脚本来对zabbix进行操作,可以使用脚本进行登陆zabbix,发现、删除和创建要监控的主机,我们需要将要执行的操作写入脚本中。登陆mkdir/zabbixcd/zabbixvimzabbix-api.sh写入:curl-s-XPOST-H’Content-Type:a…

  • 马来西亚最大的电商平台_东南亚最受欢迎的跨境电商平台

    马来西亚最大的电商平台_东南亚最受欢迎的跨境电商平台一直以来,马来西亚电商市场几乎被Shopee和Lazada两大电商平台所统治,国际巨头占据主要市场。马来西亚电商平台TOP10中,Shopee和Lazada两大电商平台共占据了83.58%的网站流量,是马来电商入驻首选平台。然而直到2020年,Shopee超过了Lazada,拉开了距离,Shopee月均流量已达到Lazada的两倍以上。与此同时,马来西亚本土电商PGMall也在2020年的竞争中战胜Zalora与Lelong,稳固了他在马来西亚前三甲的地位。目前,无需注册马来西亚本地公司即可直接在

  • java工作流activity_activity 工作流学习(一)

    java工作流activity_activity 工作流学习(一)启动流程实例什么是流程实例?根据一个流程定义具体的一次执行过程就是一个流程实例,一个流程定义对应多个流程实例(一对多关系)为了演示:在流程图中指定办理人是谁,现在是写死的,表示只能张三能提交请假申请。后面会讲解如何动态指定。//根据流程定义的Id启动一个流程实例(操作ACT_RU_EXECUTION、ACT_RU_TASK、ACT_HI_PROCINST、ACT_HI_ACTINST、ACT_HI…

  • Tomcat的下载和安装教程,超级详细

    Tomcat的下载和安装教程,超级详细1、什么是Tomcat?tomcat是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP程序的首选。最初由Sun公司的软件架构师詹姆斯·邓肯·戴维森开发,后来他帮助将其变为开源项目并由Sun公司贡献给Apache软件基金会。2、Tomcat的下载1)下载地址http://tomcat.apache.org/2)版本选择进入官网主页,看到左侧栏的download的下载目录,尽量不选择最新的版本,选择较为稳定的版本。目前最新的版本是

  • Python安装失败_python第三方库安装失败

    Python安装失败_python第三方库安装失败详细内容相信很多刚开始入门Python的菜鸟们在安装python第三方库的时候,多多少少都会遇到一些安装失败的问题。下面,我将结合自身经验,分享一下在windows操作系统上此类问题的解决办法。一、清楚自己所安装的python版本(2.7或3.6,andmore);(推荐学习:Python视频教程)二、检查是否安装了pip,pip版本是否可以使用;三、网络是否正常;如果确认上面都没有问题的话,就…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号