kinect fusion+opencv程序

2023-10-27

#define _CRT_SECURE_NO_WARNINGS
#include "pch.h"
// This file is part of OpenCV project.
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at http://opencv.org/license.html

// This code is also subject to the license terms in the LICENSE_KinectFusion.md file found in this module's directory

#include <iostream>
#include <fstream>
#include <opencv2/imgproc.hpp>
#include <opencv2/calib3d.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/rgbd/kinfu.hpp>

using namespace cv;
using namespace cv::kinfu;
using namespace std;


#define CV_ROOT "d:/opencv430contrib"
#define CV_VERSION_ID CVAUX_STR(CV_MAJOR_VERSION) CVAUX_STR(CV_MINOR_VERSION) CVAUX_STR(CV_SUBMINOR_VERSION)
#if CV_MAJOR_VERSION>2
#ifdef _DEBUG
#define cvLIB(name) CV_ROOT "/x64/vc15/lib/opencv_world" CV_VERSION_ID "d"
#else
#define cvLIB(name) CV_ROOT "/x64/vc15/lib/opencv_world" CV_VERSION_ID
#endif
#pragma comment( lib, cvLIB("any"))
#else
#ifdef _DEBUG
#define cvLIB(name) CV_ROOT "/build/x64/vc15/lib/opencv_" name CV_VERSION_ID "d"
#else
#define cvLIB(name) CV_ROOT "/build/x64/vc15/lib/opencv_" name CV_VERSION_ID
#endif
#pragma comment( lib, cvLIB("core"))
#pragma comment( lib, cvLIB("imgproc"))
#pragma comment( lib, cvLIB("highgui"))
#endif

static vector<string> readDepth(std::string fileList)
{
	vector<string> v;
	fstream file(fileList);
	if (!file.is_open())
		throw std::runtime_error("Failed to read depth list");
	std::string dir;
	size_t slashIdx = fileList.rfind('/');
	slashIdx = slashIdx != std::string::npos ? slashIdx : fileList.rfind('\\');
	dir = fileList.substr(0, slashIdx);

	while (!file.eof())
	{
		std::string s, imgPath;
		std::getline(file, s);
		if (s.empty() || s[0] == '#') continue;
		std::stringstream ss;
		ss << s;
		double thumb;
		ss >> thumb >> imgPath;
		ss >> imgPath;
		cout << imgPath << endl;
		v.push_back(dir + '/' + imgPath);
	}

	return v;
}

struct DepthSource
{
public:
	DepthSource(String fileListName) :
		depthFileList(fileListName.empty() ? vector<string>() : readDepth(fileListName)),
		frameIdx(0),
	//	undistortMap1(),
	//	undistortMap2(),
		useKinect2Workarounds(true)
	{ }

	UMat getDepth()
	{
		UMat out;
		if (frameIdx < depthFileList.size())
		{
			cout << depthFileList[frameIdx] << endl;
			Mat f = cv::imread(depthFileList[frameIdx++], IMREAD_ANYDEPTH);
			f.copyTo(out);
		}
		else
		{
			return UMat();
		}
		if (out.empty())
			throw std::runtime_error("Matrix is empty");
		return out;
	}

	bool empty()
	{
		return depthFileList.empty();
	}
	vector<string> depthFileList;
	size_t frameIdx;
//	UMat undistortMap1, undistortMap2;
	bool useKinect2Workarounds;
};

int main(int argc, char **argv)
{
	Ptr<DepthSource> ds = makePtr<DepthSource>("rgbd_dataset/depth.txt");
	Ptr<Params> params = Params::defaultParams();	
	cv::setUseOptimized(true);
//	params->frameSize = Size(512, 424);
	Ptr<KinFu> kf = KinFu::create(params);
	UMat rendered,points,normals;
/*	UMat cvt8;
	Mat frame = imread("images/8hao/depth/KinectScreenshot-Depth-05-27-31.bmp", IMREAD_ANYDEPTH);
	convertScaleAbs(frame, cvt8, 0.25*256. / params->depthFactor);
	imshow("depth", cvt8);
	if (!kf->update(frame))
	{
		kf->reset();
		std::cout << "reset" << std::endl;
	}
	kf->render(rendered);
	imshow("render", rendered);
	while (cv::waitKey(100) != 'q')//如果不使用数据集,程序到这里就结束了。
		;
*/



	int64 prevTime = getTickCount();
	int i = 0;
	for (UMat frame = ds->getDepth(); !frame.empty(); frame = ds->getDepth())
	{
		cout << i << endl;
		i++;
		UMat cvt8;
		convertScaleAbs(frame, cvt8, 0.25*256. / params->depthFactor);
		imshow("depth", cvt8);
		if (!kf->update(frame))
		{
			kf->reset();
			std::cout << "reset" << std::endl;
		} 
		kf->render(rendered);
		int64 newTime = getTickCount();
		putText(rendered, cv::format("FPS: %2d press R to reset, P to pause, Q to quit",
			(int)(getTickFrequency() / (newTime - prevTime))),
			Point(0, rendered.rows - 1), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 255));
		prevTime = newTime;
		imshow("render", rendered);
		int c = waitKey(1);
		switch (c)
		{
		case 'r':
			kf->reset();
		case 'q':
			return 0;
		default:
			break;
		}
		if (i > 10)//10帧停止
			break;
	} 
	return 0;
}

 上边这个主要是原版删减了大量无关内容,但对小白来说理解起来还是费劲。下面这个才是真正的小白版,全部代码加上链接lib文件和头文件不足50行。

#define _CRT_SECURE_NO_WARNINGS
#include "pch.h"
#include <iostream>
#include <fstream>
#include <opencv2/imgproc.hpp>
#include <opencv2/calib3d.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/rgbd/kinfu.hpp>
using namespace cv;
using namespace cv::kinfu;
using namespace std;
#define CV_ROOT "d:/opencv430contrib"
#define CV_VERSION_ID CVAUX_STR(CV_MAJOR_VERSION) CVAUX_STR(CV_MINOR_VERSION) CVAUX_STR(CV_SUBMINOR_VERSION)
#ifdef _DEBUG
#define cvLIB(name) CV_ROOT "/x64/vc15/lib/opencv_world" CV_VERSION_ID "d"
#else
#define cvLIB(name) CV_ROOT "/x64/vc15/lib/opencv_world" CV_VERSION_ID
#endif
#pragma comment( lib, cvLIB("any"))

int main()
{
	Ptr<Params> params = Params::defaultParams();	
	cv::setUseOptimized(true);
	params->frameSize = Size(512, 424);//自己深度图像的尺寸
	Ptr<KinFu> kf = KinFu::create(params);
	UMat rendered,points,normals,cvt8;
	Mat frame = imread("images/8hao/depth/KinectScreenshot-Depth-05-27-31.bmp", IMREAD_ANYDEPTH);
	convertScaleAbs(frame, cvt8, 0.25*256. / params->depthFactor);
	imshow("depth", cvt8);
	if (!kf->update(frame))
	{
		kf->reset();
		std::cout << "reset" << std::endl;
	}
	kf->render(rendered);
	imshow("render", rendered);
	while (cv::waitKey(100) != 'q')
		;
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

kinect fusion+opencv程序 的相关文章

  • Unity鼠标控制物体的旋转、移动、缩放等

    这个是控制相机 44条消息 unity 相机 旋转缩放查看 物体或地图 unity旋转查看物体 野区捕龙为宠的博客 CSDN博客 下面的是控制物体本身 知识点 Input GetMouseButton 0 获取鼠标输入 参数为一个int值
  • QT moveToThread解析

    目录 简介 源码分析 判断是否可以执行移动动作 执行移动动作 调用moveToThread helper 调用setThreadData helper 简介 每一个QObject子类都会关联到一个具体QThread线程上 QObject有一
  • 同一块磁盘下,非lvm的扩容

    1 想要给跟分区扩容 2 先安装growpart yum install cloud utils growpart 3 growpart dev sda 2 发现lsblk看到扩容了 但是实际df还是没扩容 4 需要执行xfs growfs
  • 数据库系统之NoSQL数据库系统

    NoSQL Database Systems 什么是NoSQL数据库系统 为什么使用NoSQL NoSQL数据库系统的属性 半结构化的 无模式的数据模型 专业分布模型 弱一致性 Relaxing durability Versioning
  • 操作系统_03_内存管理(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 为什么要有虚拟地址 使各个进程使用的内存 相互独立 单片机没有操作系
  • 论文笔记之DPG

    原论文地址 阅读DPG的必要性 A2C的难收敛使得policy based向着DDPG发展 而DDPG Deep DPG 因此想要理解DDPG算法 就必须先理解DPG Deterministic Policy Gradient Algori
  • 【QT5 带参connect语法记录】

    QT5 带参connect语法记录 slot版 lamda版 Qt4版 未测试 更多细节参考 slot版 void QListWidget itemClicked2 QListWidgetItem QListWidget itemClick
  • 第三章作业

    例3 1 在一个班级中随机抽取9名学生 得到每名学生的英语考试分数如下 91 69 75 78 81 96 92 88 86 计算9名学生的平均考试分数 解 根据式3 1有 x 91 69 75 78 81 96 92 88 86 9 84
  • 动态生成多个 React createRef

    有这么个需求 从接口获取数据 数据格式为 dataList 接口获取的数据 tableData 表格数据 const dataList tableData1 tableData2 tableData3 需要实现的效果大概长这样 dataLi
  • 【学习SLAM】Bundle Adjustment 光束法平差详解

    首先引述来自维基百科的定义 假设我们有一个3D空间中的点 他被位于不同位置的多个摄像机看到 那么所谓的光束法平差 Bundle Adjustment 就是能够从这些多视角信息中提取出3D点的坐标以及各个摄像机的相对位置和光学信息的过程 可能
  • C++ future async promise 用法详解 - shared_future

    shared future 文章目录 shared future 获得方式 作用 区别 原理 基本函数 基本用法 获得方式 只能由 future 得到 作用 同 future 区别 可以多线程 多次访问 shared state 原理 sh
  • C++分糖果

    题目背景 TDOG为大家准备了很多糖果作为节日礼物 由小T负责发放 题目描述 但是糖果被分开装在 nn 个袋子中 每个袋子里的糖果数量不一定相同 糖果一共要分发给 kk 个小伙伴 为了公平起见 发放给每个小伙伴的糖果数量要一致 小T想给小伙
  • 什么是LAMP?LAMP有什么优势?

    什么是LAMP LAMP 是指Linux 操作系统 Apache HTTP 服务器 MySQL 数据库 和 PHP 网络编程语言 一般用来建立 web 应用平台 和 Java J2EE 架构相比 LAMP 具有 Web 资源丰富 轻量 快速
  • 用Python完成毫秒级抢单,助你秒杀淘宝大单

    目录 引言 环境 需求分析 前期准备 淘宝购物流程回顾 秒杀的实现 代码梳理 总结 0 引言 年中购物618大狂欢开始了 各大电商又开始了大力度的折扣促销 我们的小胖又给大家谋了一波福利 淘宝APP直接搜索 小胖发福利 每天领取三次粉丝专属
  • Golang去除字符串前后空格

    v EthName strings Trim v EthName 两种方法都可以 v EthName strings TrimSpace v EthName
  • Python报错: python setup.py egg_info" failed with error code 1

    Python报错 Command python setup py egg info failed with error code 1 in private var folders 0m 7s1flm9j03d35pkr92jcsv3w000
  • 【PyTorch】torch.Tensor详解和常用操作

    学习教材 动手学深度学习 PYTORCH 版 DEMO https github com ShusenTang Dive into DL PyTorch PDF 制作by Marcus Yang https github com cheny
  • 排名第25位!众享比特连续两年上榜“北京民营企业中小百强”

    2022年9月26日 2022北京民营企业百强发布会成功召开 北京市工商业联合会发布了2022北京民营企业百强 1 4 榜单 北京众享比特科技有限公司连续两年荣登 北京民营企业中小百强榜单 排名前进57位 位列第25位 2022年 全市共有
  • 【AutoHotkey】 解析并执行 字符串中的 函数表达式

    预期效果 str func1 123 456 ExecFunc str 实现方式 正则文本解析出函数名及其参数 array形式 执行 该函数与其参数 难点
  • linux fseek函数用法详解

    1 功 能 重定位流 数据流 文件 上的 文件内部位置 指针 注意 不是 定位文件指针 文件指针指向文件 流 位置 指针指向文件内部的字节位置 随着文件的读取会移动 文件指针如果不重新赋值将不会改变指向别的文件 2 用 法 int fsee

随机推荐

  • JS算法之动态规划

    如果不能避免被剥削的命运 就要提高自己被剥削的价值 大家好 我是柒八九 今天 我们继续探索JS算法相关的知识点 我们来谈谈关于动态规划的相关知识点和具体的算法 如果 想了解其他数据结构的算法介绍 可以参考我们已经发布的文章 如下是算法系列的
  • MFC CPropertySheet控件

    步骤一 新建一个对话框 步骤二 新建三个属性页对话框资源 IDD PROPPAGE LARGE 并对新建的三个属性页对话框生成三个类 基类为CPropertyPage 步骤三 插入一个新的类 用于创建属性表单 基类为CPropertyShe
  • Twitter的like动画安卓版 - 备选方案

    英文 Twitter s like animation in Android alternative 相关动画网址 http frogermcs github io twitters like animation in android al
  • VCRUNTIME140_1.dll丢失是怎么回事?三个解决方法分享

    最近打开软件或者游戏的时出现了以下问题一开始以为是自己手残又误删了什么 重新安装了两次也没有解决 看网上有许多朋友安装其他软件时会出现缺少VCRUNTIME140 dll 其实VCRUNTIME140 1 dll是微软Visual C Re
  • JavaScript实现网页打印,可设置页眉、页脚、页边距

    WebBrowser是IE内置的浏览器控件 无需用户下载 即可实现客户端页面打印 关于这个组件还有其他的用法 列举如下 WebBrowser ExecWB 1 1 打开 Web ExecWB 2 1 关闭现在所有的IE窗口 并打开一个新窗口
  • fit_transform和transform

    1 二者区别 fit 用来求得训练集X的均值 方差 最大值 最小值 这些训练集X固有的属性 transform 在fit的基础上 进行标准化 降维 归一化等操作 fit transform 包含上述两个功能 2 为什么训练集用fit tra
  • 逻辑回归--Octave实现

    The logistic regression cost function is convex so gradient descent will always find the global minimum 问题一 采用逻辑回归 Suppo
  • 新出炉!谷歌AI #DreamFusion 从文本生成3D模型

    文本生成图像已有了大量模型工具 文本生成3D模型的工具到是很少见 我记得有一期推文介绍了文本生成数字人模型吧 现在有能生成通用3D模型的工具了 近期谷歌AI 发布了文本生成3D模型 Dreamfusion 赶紧去体验下有多神奇 DreamF
  • mysql join 一对多_leftjoin陷阱之一对多导致数据量增加

    从上面2张图可以看出 本来我们是想用一些left join来匹配出我们需要的信息 但却因此使得我们的统计数据量增大了 为什么呢 这个就是原因了 我们关联的一张表有1 n的情况 vcD4KCgoKCjxwPs6qwcvR3cq x Wz rr
  • React——函数组件与类组件

    一 函数组件 和 类组件介绍 1 函数组件 函数组件也称无状态组件 顾名思义就是以函数形态存在的 React 组件 在 hooks 出现之前 react 中的函数组件通常只考虑负责UI的渲染 没有自身的状态 没有业务逻辑代码 是一个纯函数
  • 软件开发中项目经理有那些职责

    搜集了一篇软件开发中项目管理的文章 大家看看 当项目繁多的时候 需要规范 并且定义到细节 只有这样 才能支持大规模的开发 PM非常重要 PM的能力将直接导致项目最后的质量 本文是根据公司当前的现状而描述的 并不一定普遍适用 合适的 就是最好
  • linux登录界面配置、\etc\motd有趣的图案

    linux登录显示图案 etc motd介绍 图案 佛祖保佑 佛祖瘫痪 fuck me 神兽羊驼 海贼旗 啪 初音未来 攻城狮 we wang you 自制图案 etc motd介绍 etc motd 这个文件是在你登录之后显示的 不管你是
  • sklearn中的datasets.make_moons函数

    make moons是函数用来生成数据集 from sklearn import datasets x y datasets make moons n samples 800 noise 0 3 shuffle True random st
  • 寻路算法——A*算法

    2 寻路算法 A 算法剖析 2 1 A 算法简介 原文链接 http www gamedev net reference articles article2003 asp 原作者文章链接 http www policyalmanac org
  • gitlab持续集成-部门官网文档

    https gitlab com gitlab org gitlab blob master lib gitlab ci templates Nodejs gitlab ci yml https gitlab com gitlab org
  • 软件测试外包公司怎么样?为什么没人去?看我终极解密外包!

    目录 导读 一 前言 什么是软件测试外包 二 软件测试外包的好处与坏处 三 进软件测试外包公司前的思考 四 软件测试外包流行的原因挖掘 五 总结 一 前言 什么是软件测试外包 随着最近10年创业风气的发起 已经涌起创业项目外包公司的兴起 已
  • 算法笔记5.6--N的阶乘

    题目描述 输入一个正整数N 输出N的阶乘 输入 正整数N 0 lt N lt 1000 输出 输入可能包括多组数据 对于每一组输入数据 输出N的阶乘 样例输入 0 4 7 样例输出 1 24 5040 代码 struct bign int
  • 史上最全的 Spring Boot 学习教程

    本文目录 一 Spring Boot入门 二 Spring Boot配置 三 Spring Boot与日志 四 Spring Boot与Web开发 五 Spring Boot与Docker 六 Spring Boot与数据访问 七 Spri
  • 历时130天784分通过了HCIE笔试

    这是自己送给自己2023年最好的礼物 从学习到备考笔试经历了130天 对我来说每天都是背负着一个沉重的包袱前行 活的很累很累 期间不被人理解 学到崩溃 并且放弃了n次又爬起来 不得不说这些我都熬过来了 其实感觉一张成绩单就能检验一个人的能力
  • kinect fusion+opencv程序

    define CRT SECURE NO WARNINGS include pch h This file is part of OpenCV project It is subject to the license terms in th