Hello Christian,
To estimate reprojection error in pixels you can use the following modification of the older script:
import math
import PhotoScan
def calc_reprojection(chunk):
point_cloud = chunk.point_cloud
points = point_cloud.points
npoints = len(points)
projections = chunk.point_cloud.projections
err_sum = 0
num = 0
photo_avg = {}
for camera in chunk.cameras:
if not camera.transform:
continue
T = camera.transform.inv()
calib = camera.sensor.calibration
point_index = 0
photo_num = 0
photo_err = 0
for proj in projections[camera]:
track_id = proj.track_id
while point_index < npoints and points[point_index].track_id < track_id:
point_index += 1
if point_index < npoints and points[point_index].track_id == track_id:
if not points[point_index].valid:
continue
dist = camera.error(points[point_index].coord, proj.coord).norm() ** 2
err_sum += dist
num += 1
photo_num += 1
photo_err += dist
photo_avg[camera.label] = (math.sqrt(photo_err / photo_num), photo_num)
sigma = math.sqrt(err_sum / num)
rep_avg = sigma
return (rep_avg, photo_avg)
doc = PhotoScan.app.document
chunk = doc.chunk
total_error, ind_error = calc_reprojection(chunk)
print(total_error, ind_error)
We've added camera.error() function that allows to get the reprojection error of the 3D point in a more convenient way (without use of chunk.transform matrix).