2
« on: November 11, 2019, 09:06:53 PM »
I need help understanding why the script attached here is crashing Metashape. It covers gradual selection and optimization and there is essentially three parts: reconstruction uncertainty, projection accuracy and reprojection error in that order. Executing reporjection error isnt as straight forward as I need the script to check total camera error and stop if it is already below some threshold (20cm) and not let the program iterate the process more than 4 times.
The reconstruction uncertainty and projection accuracy sections together run just fine. It's when I add the reporjection error section that Metashape crashes. I've also attached here the log file of the crash. It stops before recalculating and reporting camera error in the for-loop in the script. I believe something here is causing it to crash.
Do you have any ideas on how to fix this issue?
Script:
import Metashape, math, sys
doc = Metashape.app.document #specifies open document
chunk = doc.chunk #specifies active chunk
T = chunk.transform.matrix
crs = chunk.crs
pc = chunk.point_cloud #PointCloud object of sparse cloud points
pc_init = len(pc.points) #returns integer of number of sparse cloud points
print("****Number of starting points:", pc_init) #prints initial point number in raw sparse cloud
# Below starts the gradual selection, filtering and optimization process
#Reconstrution Uncertainty
threshold = 15
f = Metashape.PointCloud.Filter()
f.init(pc, criterion = Metashape.PointCloud.Filter.ReconstructionUncertainty)
values = f.values.copy()
values.sort()
thresh = values[int(len(values) * (1-threshold/100))]
f.selectPoints(thresh)
nselected = len([p for p in pc.points if p.selected])
pc.removeSelectedPoints()
print("****", nselected, " points removed during reconstuction uncertainty filtering")
#Camera optimization
chunk.optimizeCameras(fit_f=True, fit_cx=True, fit_cy=True, fit_b1=False, fit_b2=False, fit_k1=True,
fit_k2=True, fit_k3=True, fit_k4=False, fit_p1=True, fit_p2=True, fit_p3=False,
fit_p4=False, adaptive_fitting=False, tiepoint_covariance=False)
#Report Total Camera Error
sums = 0
num = 0
for camera in chunk.cameras:
if not camera.transform:
continue
if not camera.reference.location:
continue
estimated_geoc = chunk.transform.matrix.mulp(camera.center)
error = chunk.crs.unproject(camera.reference.location) - estimated_geoc
error = error.norm()
sums += error**2
num += 1
print("****Total Camera Error: ", round(math.sqrt(sums / num),3))
#doc.save()
#Projection Accuracy
threshold = 15
f = Metashape.PointCloud.Filter()
f.init(pc, criterion = Metashape.PointCloud.Filter.ProjectionAccuracy)
values = f.values.copy()
values.sort()
thresh = values[int(len(values) * (1-threshold/100))]
f.selectPoints(thresh)
nselected = len([p for p in pc.points if p.selected])
pc.removeSelectedPoints()
print("****", nselected, " points removed during projection accuracy filtering")
#Camera optimization
chunk.optimizeCameras(fit_f=True, fit_cx=True, fit_cy=True, fit_b1=False, fit_b2=False, fit_k1=True,
fit_k2=True, fit_k3=True, fit_k4=False, fit_p1=True, fit_p2=True, fit_p3=False,
fit_p4=False, adaptive_fitting=False, tiepoint_covariance=False)
#Report Total Camera Error
sums = 0
num = 0
for camera in chunk.cameras:
if not camera.transform:
continue
if not camera.reference.location:
continue
estimated_geoc = chunk.transform.matrix.mulp(camera.center)
error = chunk.crs.unproject(camera.reference.location) - estimated_geoc
error = error.norm()
sums += error**2
num += 1
print("****Total Camera Error: ", round(math.sqrt(sums / num),3))
#doc.save()
# Reprojection Error
# This step needs to be iterated until until camera accuracy reaches 20cm. Should
# sucessive iterations not decrease that number for some reason, this step will be
# limitted to 4 iterations.
for i in range(4):
if (round(math.sqrt(sums / num))) <= 0.20:
sys.exit('****Camera error has reached ~20cm')
#doc.save()
else:
threshold = 10
f = Metashape.PointCloud.Filter()
f.init(pc, criterion = Metashape.PointCloud.Filter.ReprojectionError)
values = f.values.copy()
values.sort()
thresh = values[int(len(values) * (1-threshold/100))]
f.selectPoints(thresh)
nselected = len([p for p in pc.points if p.selected])
pc.removeSelectedPoints()
print("****", nselected, " points removed during reprojection error filtering")
#Camera optimization
chunk.optimizeCameras(fit_f=True, fit_cx=True, fit_cy=True, fit_b1=True, fit_b2=True, fit_k1=True,
fit_k2=True, fit_k3=True, fit_k4=True, fit_p1=True, fit_p2=True, fit_p3=True,
fit_p4=True, adaptive_fitting=True, tiepoint_covariance=True)
#Report Total Camera Error
sums = 0
num = 0
for camera in chunk.cameras:
if not camera.transform:
continue
if not camera.reference.location:
continue
estimated_geoc = chunk.transform.matrix.mulp(camera.center)
error = chunk.crs.unproject(camera.reference.location) - estimated_geoc
error = error.norm()
sums += error**2
num += 1
print("****Total Camera Error: ", round(math.sqrt(sums / num),3))
#doc.save()
Log File:
2019-11-11 09:54:50 Agisoft Metashape Professional Version: 1.5.2 build 7838 (64 bit)
2019-11-11 09:54:50 Platform: Windows
2019-11-11 09:54:50 CPU: Intel(R) Core(TM) i7-7820HQ CPU @ 2.90GHz (laptop)
2019-11-11 09:54:50 CPU family: 6 model: 158 signature: 906E9h
2019-11-11 09:54:50 RAM: 31.9 GB
2019-11-11 09:54:51 OpenGL Vendor: NVIDIA Corporation
2019-11-11 09:54:51 OpenGL Renderer: Quadro M1200/PCIe/SSE2
2019-11-11 09:54:51 OpenGL Version: 4.6.0 NVIDIA 431.70
2019-11-11 09:54:51 Maximum Texture Size: 16384
2019-11-11 09:54:51 Quad Buffered Stereo: not enabled
2019-11-11 09:54:51 ARB_vertex_buffer_object: supported
2019-11-11 09:54:51 ARB_texture_non_power_of_two: supported
2019-11-11 09:54:51 Using simple console. Rich console can be enabled in Preferences dialog.
2019-11-11 09:54:51 LoadProject: path = C:/Users/smescarzaga/Google Drive/Thesis _ Proposal/CREST/NERTO/NPS_SfM_Scripting/AK2017_OB_Deadhorse_Job_East_delta.psx
2019-11-11 09:54:51 loaded project in 0.057 sec
2019-11-11 09:54:52 Finished processing in 0.058 sec (exit code 1)
2019-11-11 09:55:10 ****Number of starting points: 57847
2019-11-11 09:55:10 Analyzing point cloud...
2019-11-11 09:55:11 Finished processing in 0.198 sec (exit code 1)
2019-11-11 09:55:11 **** 8677 points removed during reconstuction uncertainty filtering
2019-11-11 09:55:11 OptimizeCameras: f, cx, cy, k1-k3, p1, p2, adaptive fitting = 0
2019-11-11 09:55:11 Optimizing camera locations...
2019-11-11 09:55:11 removed 60 cameras: 1115, 1116, 1117, 1118, 1119, 1120, 1122, 1123, 1124, 1125, 1126, 1135, 1136, 1137, 1148, 1149, 1150, 1151, 1152, 1154, 1155, 1156, 1157, 1158, 1159, 180, 181, 185, 186, 187, 188, 189, 190, 211, 212, 213, 214, 215, 217, 218, 219, 220, 221, 222, 223, 226, 889, 890, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923
2019-11-11 09:55:11 removed 60 stations
2019-11-11 09:55:11 adjusting: xxxx 0.197437 -> 0.197061
2019-11-11 09:55:13 coordinates applied in 0 sec
2019-11-11 09:55:13 Finished processing in 1.652 sec (exit code 1)
2019-11-11 09:55:13 ****Total Camera Error: 0.509
2019-11-11 09:55:13 Analyzing point cloud...
2019-11-11 09:55:13 Finished processing in 0.061 sec (exit code 1)
2019-11-11 09:55:13 **** 7375 points removed during projection accuracy filtering
2019-11-11 09:55:13 OptimizeCameras: f, cx, cy, k1-k3, p1, p2, adaptive fitting = 0
2019-11-11 09:55:13 Optimizing camera locations...
2019-11-11 09:55:14 adjusting: xxx 0.203232 -> 0.20322
2019-11-11 09:55:14 coordinates applied in 0 sec
2019-11-11 09:55:14 Finished processing in 1.054 sec (exit code 1)
2019-11-11 09:55:14 ****Total Camera Error: 0.507
2019-11-11 09:55:14 Analyzing point cloud...
2019-11-11 09:55:15 Finished processing in 0.067 sec (exit code 1)
2019-11-11 09:55:15 **** 4179 points removed during reprojection error filtering
2019-11-11 09:55:15 OptimizeCameras: f, cx, cy, b1, b2, k1-k4, p1-p4, adaptive fitting = 1
2019-11-11 09:55:15 Optimizing camera locations...
2019-11-11 09:55:15 adjusting: xxxxx 0.182986 -> 0.1827
2019-11-11 09:55:16 adjusting: x 0.182714 -> 0.182714
2019-11-11 09:55:16 coordinates applied in 0 sec