Metashape导出深度图的两种方法

(2024/11/21)
需要Metashape导出权限

1、直接从构建3D模型的深度图中导出。可能会出现深度图缺失的情况,并且需要调整位深和分辨率(来源:https://www.agisoft.com/forum/index.php?topic=12549.0):

import Metashape
from PySide2 import QtGui, QtCore, QtWidgets

global NUMPY
NUMPY = True

try:
	import numpy
except ImportError:
	NUMPY = False
	print("numpy module not installed!")
	
	
class ExportDepthDlg(QtWidgets.QDialog):

	def __init__ (self, parent):
		QtWidgets.QDialog.__init__(self, parent)
		self.setWindowTitle("Export depth maps")
		
		self.btnQuit = QtWidgets.QPushButton("&Close")
		self.btnP1 = QtWidgets.QPushButton("&Export")
		self.pBar = QtWidgets.QProgressBar()
		self.pBar.setTextVisible(False)
		
		#self.selTxt =QtWidgets.QLabel()
		#self.selTxt.setText("Apply to:")
		self.radioBtn_all = QtWidgets.QRadioButton("Apply to all cameras")
		self.radioBtn_sel = QtWidgets.QRadioButton("Apply to selected")
		self.radioBtn_all.setChecked(True)
		self.radioBtn_sel.setChecked(False)
		
		self.formTxt = QtWidgets.QLabel()
		self.formTxt.setText("Export format:")
		self.formCmb = QtWidgets.QComboBox()
		self.formCmb.addItem("1-band F32")
		self.formCmb.addItem("Grayscale 8-bit")
		self.formCmb.addItem("Grayscale 16-bit")
		
		layout = QtWidgets.QGridLayout()   #creating layout
		#layout.setSpacing(10)	
		layout.addWidget(self.radioBtn_all, 0, 1)
		layout.addWidget(self.radioBtn_sel, 1, 1)	
		layout.addWidget(self.formTxt, 0, 2)	
		layout.addWidget(self.formCmb, 1, 2)	
		layout.addWidget(self.pBar, 2, 0)
		layout.addWidget(self.btnP1, 2, 1)
		layout.addWidget(self.btnQuit, 2, 2)
		self.setLayout(layout) 
		
		proc_depth = lambda : self.export_depth()
		QtCore.QObject.connect(self.btnP1, QtCore.SIGNAL("clicked()"), proc_depth)
		QtCore.QObject.connect(self.btnQuit, QtCore.SIGNAL("clicked()"), self, QtCore.SLOT("reject()"))	

		self.exec()


	def export_depth(self):
	
		global NUMPY
		if not NUMPY:
			Metashape.app.messageBox("Script aborted: numpy module is not installed.")
			return 0

		app = QtWidgets.QApplication.instance()
		global doc
		doc = Metashape.app.document
		chunk = doc.chunk #active chunk
		
		if self.formCmb.currentText() == "1-band F32":
			F32 = True
		elif self.formCmb.currentText() == "Grayscale 8-bit":
			F32 = False
		elif self.formCmb.currentText() == "Grayscale 16-bit":
			F32 = False
		else:
			print("Script aborted: unexpected error.")
			return 0
			
		selected = False
		camera_list = list()
		if self.radioBtn_sel.isChecked():
			selected = True
			for camera in chunk.cameras:
				if camera.selected and camera.transform and (camera.type == Metashape.Camera.Type.Regular):
					camera_list.append(camera)
		elif self.radioBtn_all.isChecked():
			selected = False
			camera_list = [camera for camera in chunk.cameras if (camera.transform and camera.type == Metashape.Camera.Type.Regular)]


		if not len(camera_list):
			print("Script aborted: nothing to export.")
			return 0	
			
		output_folder = Metashape.app.getExistingDirectory("Specify the export folder:")
		if not output_folder:
			print("Script aborted: invalid output folder.")	
			return 0

		print("Script started...")
		app.processEvents()
		if chunk.transform.scale:
			scale = chunk.transform.scale
		else:
			scale = 1
		count = 0
		
		for camera in camera_list:
			if camera in chunk.depth_maps.keys():
				depth = chunk.depth_maps[camera].image()
				if not F32:
					img = numpy.frombuffer(depth.tostring(), dtype=numpy.float32)
					depth_range = img.max() - img.min()
					img = depth - img.min()
					img = img * (1. / depth_range)
					if self.formCmb.currentText() == "Grayscale 8-bit":
						img = img.convert("RGB", "U8")	
						img = 255 - img
						img = img - 255 * (img * (1 / 255))#normalized
						img = img.convert("RGB", "U8")
					elif self.formCmb.currentText() == "Grayscale 16-bit":
						img = img.convert("RGB", "U16")
						img = 65535 - img
						img = img - 65535 * (img * (1 / 65535))#normalized		
						img = img.convert("RGB", "U16")
				else:
					img = depth * scale
				img.save(output_folder + "/" + camera.label + ".tif")
				print("Processed depth for " + camera.label)
				count += 1
				self.pBar.setValue(int(count / len(camera_list) * 100))
				app.processEvents()
		self.pBar.setValue(100)
		print("Script finished. Total cameras processed: " + str(count))
		print("Depth maps exported to:\n " + output_folder)
		return 1


def export_depth_maps():

	app = QtWidgets.QApplication.instance()
	parent = app.activeWindow()
	dlg = ExportDepthDlg(parent)
	
Metashape.app.addMenuItem("Custom menu/Export Depth Maps", export_depth_maps)	

2、从构建完成的模型中渲染深度图。(来源:https://www.agisoft.com/forum/index.php?topic=12392.msg55345#msg55345

for camera in chunk.cameras:

	depth = chunk.model.renderDepth(camera.transform, camera.sensor.calibration)
	depth = depth.convert(" ","F16")
	compr = Metashape.ImageCompression()
	compr.tiff_compression = Metashape.ImageCompression().TiffCompressionDeflate
	depth.save("savepath" + camera.label + ".tif", compression = compr)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/920465.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目实战(webshop)

一、搭建靶场webshop(www.example1.com) 二、信息收集 1、获取IP winR→cmd→ping www.example1.com→显示出ip(192.168.51.128) 注:TTL为IP包的生存时间,拿到TTL我们可以大概的判断一下目标机器的操作系统,但不是很准确,因为…

初识算法 · 分治(3)

目录 前言: 归并排序 题目解析 算法原理 算法编写 求逆序对总数 题目解析 算法原理 算法编写 前言: ​本文的主题是分治,通过两道题目讲解,一道是归并排序,一道是求逆序对。 链接分别为: 912. 排…

MyBatis——#{} 和 ${} 的区别和动态 SQL

1. #{} 和 ${} 的区别 为了方便,接下来使用注解方式来演示: #{} 的 SQL 语句中的参数是用过 ? 来起到类似于占位符的作用,而 ${} 是直接进行参数替换,这种直接替换的即时 SQL 就可能会出现一个问题 当传入一个字符串时&#xff…

学习threejs,导入FBX格式骨骼绑定模型

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.FBXLoader fbx 模型加…

【腾讯云产品最佳实践】腾讯云CVM入门技术与实践:通过腾讯云快速构建云上应用

目录 前言 什么是腾讯云CVM? 腾讯云CVM的技术优势 基于最佳技术实践,使用腾讯云CVM搭建应用 1. 开通CVM实例 2. 连接CVM实例 3. 配置Web环境 4. 部署PHP应用 腾讯云CVM行业应用案例:电商平台的双十一攻略 1. 弹性伸缩解决高并发问题…

mongodb多表查询,五个表查询

需求是这样的,而数据是从mysql导入进来的,由于mysql不支持数组类型的数据,所以有很多关联表。药剂里找药物,需要药剂与药物的关联表,然后再找药物表。从药物表里再找药物与成分关联表,最后再找成分表。 这里…

STL中vector实现——简单易懂版

本章内容 模拟实现 vector 的部分重要功能 1.迭代器的引入1.1 之前写法1.2 STL库中的写法 2.默认成员函数2.1构造与拷贝构造2.2拷贝赋值2.3析构函数 3.增删查改功能3.1插入3.2删除 4.为什么STL中vector没有find函数?5.🔥🔥迭代器失效场景&am…

Springboot + vue 健身房管理系统项目部署

1、前言 ​ 许多人在拿到 Spring Boot 项目的源码后,不知道如何运行。我以 Spring Boot Vue 健身房管理系统的部署为例,详细介绍一下部署流程。大多数 Spring Boot 项目都可以通过这种方式部署,希望能帮助到大家。 ​ 2、项目查看 ​ 首…

NuGet如何支持HTTP源

今天是2024年11月21号,最近更新了VisualStudio后发现HTTP的包源已经默认禁止使用了,生成时会直接报错。如下图: 官方也明确指出了要想使用HTTP包源的解决办法,这里就简单总结一下。 一、全局配置 1、全局NuGet包的配置文件路径在…

SpringBoot学习记录(四)之分页查询

SpringBoot学习记录(四)之分页查询 一、业务需求1、基本信息2、请求参数3、相应数据 二、传统方式分页三、使用PageHelper分页插件 一、业务需求 根据条件进行员工数据的条件分页查询 1、基本信息 请求路径: /emps 请求方式: …

JavaParser如何获取方法的返回类型

使用JavaParser 如何获取一个Java类中的某个方法的返回类型呢? 假如有一个如下的简单的Java 类: /*** Copyright (C) Oscar Chen(XM):* * Date: 2024-11-21* Author: XM*/ package com.osxm.ai.sdlc.codeparse.codesample;public class MyClass {public…

2024亚太杯国际赛C题宠物预测1234问完整解题思路代码+成品参考文章

中国宠物业发展趋势及预测模型 一、问题背景与研究目标 近年来,中国宠物业经历了快速发展,特别是在城市化进程加快、人口结构变化和消费水平提升的背景下,宠物作为家庭成员的角色变得愈发重要。根据相关数据,中国宠物数量&#…

Java实现离线身份证号码OCR识别

最近公司要求做离线身份证OCR功能,找了一圈总算是找到了,在这里对文档做个整理,方便后来者,感谢码龄23年博主的分享 系统:Windows11,红旗Linux Asianux8.1 文档中Linux全root用户操作;需先安装…

Gradle核心概念总结

这部分内容主要根据 Gradle 官方文档整理,做了对应的删减,主要保留比较重要的部分,不涉及实战,主要是一些重要概念的介绍。 Gradle 这部分内容属于可选内容,可以根据自身需求决定是否学习,目前国内还是使用…

鸿蒙网络编程系列50-仓颉版TCP回声服务器示例

1. TCP服务端简介 TCP服务端是基于TCP协议构建的一种网络服务模式,它为HTTP(超文本传输协议)、SMTP(简单邮件传输协议)等高层协议的应用程序提供了可靠的底层支持。在TCP服务端中,服务器启动后会监听一个或…

第5-1节:SpringBoot对SpringMVC的自动配置

我的后端学习大纲 SpringBoot学习大纲 1、SpringBoot对SpringMVC自动配置概览

Emacs进阶之插入时间信息(一百六十三)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…

嵌入式实验报告:家用计时器

实验目的和要求 1、实验目的 掌握STM32串口通信原理。学习编程实现STM32的UART通信掌握STM32中断程序设计流程。熟悉STM32固件库的基本使用。熟悉STM32定时器中断设计流程。2、实验要求 设计一个家用计时器,其功能如下: 利用串口设置计时时间,格式:XX:XX:X 例如01:59:…

【WRF理论第十二期】Registry.EM 文件详解

【WRF理论第十二期】Registry.EM 文件详解 Registry.EM 文件的作用Registry.EM 文件的结构Registry.EM 文件内容理解如何修改 Registry.EM 文件以输出特定变量WRF-Urban 修改 Registry.EM 文件以输出 UCM 相关变量1. 修改 Registry.EM 文件2. 重新编译 WRF 注意事项参考 在 WRF…

Midjourney 图生图,真人二次元保持一致性,场景多元可选择

Midjourney 拥有强大的图生图的功能,下面我们就来看一下,如何在我们的AceDataCloud网站上实现将照片切换成任意的二次元场景,同时保持人物的一致性。 我们可以按照如下的步骤去实现人物一致性。 下面我们来看看效果吧,原图如下。…