Forum

Author Topic: Import markers from multiple files  (Read 135 times)

Mrblonde8888

  • Newbie
  • *
  • Posts: 2
    • View Profile
Import markers from multiple files
« on: November 09, 2019, 05:54:41 AM »
Hello,
Is there a way to upload more than one xml file of markers into my project? I'm used to adding many markers in my projects (around 1000). The marker projections in photos are not only useful but fundamental in my workflow. But adding too many markers slows the reactivity of the software to commands. I was wondering if there is a method to export groups of markers (sort of 300-500 per time) in different xml files, then delete them in the project to speed it up, and once finished the entire "marking" process, upload not one single group but all xml files containing each a single group. I tried conventionally but Metashape allows only one file to be uploaded.
Also, I want to add that dense clouds are already created and I don't need to use these markers as GCP to allineate the images.
Thanks

SB

  • Newbie
  • *
  • Posts: 38
    • View Profile
Re: Import markers from multiple files
« Reply #1 on: November 14, 2019, 11:31:54 PM »
A few years ago I wrote a python script to do this.  It will need rewriting for the current API but you can see the workflow in the code


Code: [Select]
import PhotoScan
from xml.dom import minidom

path = PhotoScan.app.getOpenFileName("Specify input XML file:")

doc = PhotoScan.app.document
chunk = doc.chunk

xml = minidom.parse(path)
main = xml.childNodes[0]

xml_markers_reference = xml.childNodes[0].childNodes[1].childNodes[5]
xml_markers_proj = xml.childNodes[0].childNodes[1].childNodes[7].childNodes[1].childNodes[1]
xml_camera = xml.childNodes[0].childNodes[1].childNodes[3]

cameras = dict()
markers = dict()
marker_proj = dict()
marker_proj_pins = dict()

for i in range(1, len(xml_camera.childNodes) - 1, 2):
camera_id = xml_camera.childNodes[i].getAttribute("id")
camera_label = xml_camera.childNodes[i].getAttribute("label")
cameras[camera_label] = camera_id

for i in range(1, len(xml_markers_reference.childNodes) - 1, 2):
marker_id = xml_markers_reference.childNodes[i].getAttribute("id")
marker_label = xml_markers_reference.childNodes[i].getAttribute("label")
markers[marker_id] = marker_label

for i in range(1, len(xml_markers_proj.childNodes) - 1, 2):
cam_list = dict()
pinned_list = dict()
marker_id = xml_markers_proj.childNodes[i].getAttribute("marker_id")

for j in range(1, len(xml_markers_proj.childNodes[i].childNodes) - 1, 2):

camera_id = xml_markers_proj.childNodes[i].childNodes[j].getAttribute("camera_id")
x = float(xml_markers_proj.childNodes[i].childNodes[j].getAttribute("x"))
y = float(xml_markers_proj.childNodes[i].childNodes[j].getAttribute("y"))
pinned = xml_markers_proj.childNodes[i].childNodes[j].getAttribute("pinned")

cam_list[camera_id] = PhotoScan.Vector([x, y])
pinned_list[camera_id] = pinned.lower() in ("yes", "true", "1")
       

marker_proj[marker_id] = cam_list

marker_proj_pins[marker_id] = pinned_list



for marker_id in marker_proj.keys():

        dup_found = False
        for mrkr in chunk.markers:
                if mrkr.label == markers[marker_id]:
                        m = mrkr
                        print ("Duplicate Marker found " + mrkr.label + " - using it")
                        dup_found = True
       
        if not dup_found:
                chunk.addMarker()
                m = chunk.markers[-1]
                m.label = markers[marker_id]

        for camera in chunk.cameras:
                if camera.label in cameras.keys():
                        if cameras[camera.label] in marker_proj[marker_id].keys():
                                print ("Adding camera " + camera.label + " to marker " + m.label )
                                m.projections[camera] = marker_proj[marker_id][cameras[camera.label]]
                                if marker_proj_pins[marker_id][cameras[camera.label]] :
                                        print ("Setting pin to True")
                                        m.projections[camera].pinned = marker_proj_pins[marker_id][cameras[camera.label]]

print("Script finished")

Mrblonde8888

  • Newbie
  • *
  • Posts: 2
    • View Profile
Re: Import markers from multiple files
« Reply #2 on: November 16, 2019, 11:51:43 PM »
Thanks, very much appreciated!