1
General / Re: MicaSense RedEdge-MX - Calibration Panels
« on: April 26, 2020, 06:40:02 AM »
Thank you for the clarification Alexey.
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
Hello jmgc,
Yes, Metashape considers the timestaps, if there are calibration images of the panel available before and after the flight.
I would try importing following file specifying that it is USGS camera calibration format...
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()
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
fltr = ps.PointCloud.Filter()
fltr.init(chunk, ps.PointCloud.Filter.ReconstructionUncertainty)
fltr.selectPoints(2 * thresh)
Dragline,
it would be very interesting to have some data set to test it... Using RTK to just fix the camera perspective centers can often bring a problem in elevation as focal is directly correlated to flight altitude... So the higher you are from ground, the Z error will increase relative to some error in focal…..