code: def _save_images_txt(self, output_file):
      with open(output_file, "w") as fid:
          print(
              "# Image list with two lines of data per image:", file=fid
          )
          print(
              "#   IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME",
              file=fid,
          )
          print("#   POINTS2D[] as (X, Y, POINT3D_ID)", file=fid)
          print(
              "# Number of images: {},".format(len(self.images)),
              file=fid,
          )
          print("# mean observations per image: unknown", file=fid)
  
          for image_id, image in self.images.items():
              print(image_id, file=fid)
              print(" ".join(str(qi) for qi in image.q.q), file=fid)
              print(" ".join(str(ti) for ti in image.tvec), file=fid)
              print(image.camera_id, image.name, file=fid)
  
              data = np.rec.fromarrays(
                  (
                      image.points2D[:, 0],
                      image.points2D[:, 1],
                      image.point3D_ids.astype(np.int64),
                  )
              )
              if len(data) > 0:
                  np.savetxt(fid, data, "%.2f %.2f %d", newline=" ")
                  fid.seek(-1, os.SEEK_CUR)
              fid.write("\n")
  
imports: from collections import OrderedDict, defaultdict
  from io import StringIO
  from itertools import combinations
  import os
  import struct
  from .camera import Camera
  from .image import Image
  import numpy
  from .rotation import Quaternion
label_desc: Use image node_id 19 for calling the SceneManager obj's underlying member method code with example usage: obj._save_images_txt(output_file) without return types