import Metashape
from pathlib import Path
def progress_print(p):
print('Current task progress: {:.2f}%'.format(p))
class metashape_tiepoint_filter:
def __init__(self,ms_path: Path):
if not ms_path == None:
self.doc = Metashape.Document()
self.doc.open(ms_path.as_posix(), read_only=False, ignore_lock=True)
else:
self.doc = Metashape.app.document
self.chunk = self.doc.chunk
self.total_tie_points = len(self.chunk.tie_points.points)
def standard_run(self):
if len(self.chunk.point_clouds) == 0:
self.filter_reconstruction_uncertainty()
self.optimize_cameras()
self.doc.save()
self.filter_projection_accuracy()
self.optimize_cameras()
self.doc.save()
self.filter_reprojection_error()
self.optimize_cameras()
self.set_label_naming_template()
self.doc.save()
#self.process_point_cloud_over_network()
else:
print("Dense cloud exists... Ignoring..")
def optimize_cameras(self, parameters = None):
print("optimize_cameras")
self.chunk.optimizeCameras(
tiepoint_covariance=True,
progress=progress_print
)
def filter_reconstruction_uncertainty(self, x = 10):
print("filter_reconstruction_uncertainty")
self.chunk = self.chunk.copy()
f = Metashape.TiePoints.Filter()
f.init(self.chunk, criterion = Metashape.TiePoints.Filter.ReconstructionUncertainty)
while (len([i for i in f.values if i >= x])/self.total_tie_points) >= 0.5:
x += 0.1
x = round(x,1)
self.chunk.label = f"RecUnc={x}"
f.removePoints(x)
def filter_projection_accuracy(self, x = 2):
print("filter_projection_accuracy")
self.chunk = self.chunk.copy()
f = Metashape.TiePoints.Filter()
f.init(self.chunk, criterion = Metashape.TiePoints.Filter.ProjectionAccuracy)
while (len([i for i in f.values if i >= x])/len(self.chunk.tie_points.points)) >= 0.5:
x += 0.1
x = round(x,1)
self.chunk.label = f"{self.chunk.label.split('Copy of ')[1]}_ProjAcc={x}"
f.removePoints(x)
def filter_reprojection_error(self, x = 0.3):
print("filter_reprojection_error")
self.chunk = self.chunk.copy()
f = Metashape.TiePoints.Filter()
f.init(self.chunk, criterion = Metashape.TiePoints.Filter.ReprojectionError)
#while (len([i for i in f.values if i >= x])/self.total_tie_points) <= 0.9:
# x -= 0.005
# print(x)
#x = round(x,3)
self.chunk.label = f"{self.chunk.label.split('Copy of ')[1]}_RepErr={x}"
f.removePoints(x)
def set_label_naming_template(self):
self.chunk.label = f"{self.chunk.label}_PcConf=XX_MeshCC=XX"
def process_point_cloud_over_network(self):
task1 = Metashape.Tasks.BuildDepthMaps()
task1.decode( {'downscale' : 2 })
task2 = Metashape.Tasks.BuildPointCloud()
task2.decode( {
'point_colors' : True,
'point_confidence' : True,
'points_spacing' : 0.001
}
)
client = Metashape.NetworkClient()
client.connect('svalbox')
network_tasks = []
network_tasks.append(task1.toNetworkTask(self.chunk))
network_tasks.append(task2.toNetworkTask(self.chunk))
batch_id = client.createBatch(self.doc.path, network_tasks)
client.setBatchPaused(batch_id, False)
a = metashape_tiepoint_filter(None)
a.standard_run()