October 1, 2013

#1009: TopoDOT “Open” Calibrated Image File Format

Technical specification detailing the file structure, calibration parameters, and data requirements for integrating calibrated imagery into TopoDOT workflows.
CAD Production
Data Requirements
File Formats
Imagery
MicroStation
Point Cloud
Support
System Requirements
Technical Reference
7 min read
What’s new (October 2026)
To export 360° panoramas to TopoDOT, add a panorama camera (Type=5) to your existing IPRJ export and give each panorama a position and a 3×3 rotation matrix. Everything else about the IPRJ format stays the same. The only new idea is how the matrix says which way the panorama is facing.

Background

The TopoDOT® application offers the capability to import calibrated images and map the image pixel orientation to the perspective view of the selected MicroStationTM view.  This unique tool makes it possible to overlay extracted CAD elements over the image in the selected view with very high precision thereby employing this image information as a reference in feature identification.

TopoDOT® places specific requirements on the calibrated image if this feature is to be successfully employed.  These requirements can be summarized briefly as:

The responsibility for providing the tools necessary to extract this information lies with the system manufacturer.  The operator should follow manufacturer’s process procedures necessary to acquire this data efficiently and accurately.

Certainty 3D will cooperate with any manufacturer to import their specific file formats.  As increasing numbers of manufacturers add such calibrated image capability to their systems or individual operators attempt to develop their own solutions, Certainty 3D has seen a need for an “open” format to support our customers and the industry. This document identifies and explains the file format necessary for effective application of this unique TopoDOT® feature.

Image Project File (*.iprj)

The image project file contains information pertaining to the project directories, units, and available cameras.

[Image Project]
Version=2
Units=sf
RotationOrder=6

CameraCount=1
Name0=Camera 1
ImageDirectory0=.\
CalFile0=.\camera1.cal

[Image Project] – Header required for the file.

Version– Current version of the file format. Use value of 2

Units– Units in which the coordinates are specified in the image project.

Valid values are:

RotationOrder– Documented value of 6 allows for the transformation matrix of each image to be directly specified in the image list file.  Other values are no longer supported.

CameraCount– If multiple camera calibrations are available, set this value to the total

number of cameras in the project. For each Camera, there must be a Name and CalFile associated with it.

Name(index) – Name of the camera calibration

ImageDirectory(index) – Each calibration file may contain a unique directory. This

directory is a relative path from the location of the image project file to the

directory where all of your images are located. This may be left as “.\” if you wish to define the directory per image in the Image List file below.

CalFile(index) – Relative path from the location of the image project file to the location of the camera calibration file.

Camera Calibration File(*.cal)

The camera calibration file contains distortion coefficients and intrinsic properties of the camera used by TopoDOT to remove distortion of the images on the fly. It is important to note that should the images provided with the image project already have their distortion removed, the radial and tangential distortion coefficients (k and P values) should be set to 0.

[Calibration]
Version=2
Type=1
dx=8.4E-6
dy=8.4E-6
Nx=4256
Ny=2832
fx=1689.97897707826
fy=1691.03752169727
Cx=2122.84859490073
Cy=1432.31598208073
k1=0.00403931369502396
k2=-0.0754263253765206
k3=-0.0852103024783204
k4=0.121648640543892
P1=-0.00028428014657276
P2=8.05378517964374E-5

[Calibration] – Header required for the file.

Version– Current version of the camera calibration file. Use value of 2

Type– Type of Lens used. Valid values are:

dx– Dimensions of a single pixel of the CCD sensor in meters. Value is typically specified by the manufacturer.

dy– Dimensions of a single pixel of the CCD sensor in meters. Value is typically specified by the manufacturer.

Nx– Number of pixels in the horizontal direction.

Ny– Number of pixels in the vertical direction.

fx – Focal length in the x direction. The parameters fx are normalized by the pixel size. fy – Focal length in the y direction. The parameters fy are normalized by the pixel size.

fx......[pix]
f........focal length [m]
dx.....[m]

Cx– Principal point in the x direction.

Cy– Principal point in the y direction.

k1– Radial distortion coefficient.

k2– Radial distortion coefficient.

k3– Radial distortion coefficient. Used for higher-order modeling of the radial distortion.

Value of 0 is valid.

k4– Radial distortion coefficient. Used for higher-order modeling of the radial distortion.

Value of 0 is valid.

P1– Tangential distortion coefficient.

P2– Tangential distortion coefficient.

Camera Location/Orientation

The image list file contains all images tagged with the camera location, orientation and filename as shown below.  It is important to note that the camera location must be in the overall project coordinate system.  Similarly, the orientation must be referenced to the project coordinate axes.

Image List File (*.lst) – Version 1

[Image List]
Image=image0.jpg
Xyz=302080.545548 65029.935632 106.612940
Mat=-0.399553 -0.000395 0.916710 -0.916698 -0.005088 -0.399549 0.004822 -0.999987 0.001671
Camera=0
Image=image1.jpg
Xyz=302080.545548 65029.935632 106.612940
Mat=0.399553 0.916710 -0.000395 0.916698 -0.399549 -0.005088 -0.004822 0.001671 -0.999987
Camera=0
Image=image2.jpg
Xyz=302080.545548 65029.935632 106.612940
Mat=0.399553 -0.000395 -0.916710 0.916698 -0.005088 0.399549 -0.004822 -0.999987 -0.001671
Camera=0

[Image List] – Header required for the file.

Image– Filename for the image which is appended to the cameras ImageDirectory property. Optionally, the image path may be prefixed with a relative directory for accessing the imagery. Example: .\TrackA\DSC_0044.JPG

The image must be in either a JPG, JPEG, or PNG file format.

Xyz– Coordinates of the camera sensor at the moment the image was taken.

Mat– 3×3 Rotation matrix defining the orientation of the camera at the moment the image was taken. The matrix values are specified as space separated values. r1c1 r1c2 r1c3 r2c1 r2c2 r2c3 r3c1 r3c2 r3c3

The matrix should be defined in a right-handed coordinate system, representing a transformation from local to the world frame.

Combining Xyz with Mat should result in a final transformation matrix that orients the axes (defined in a local frame) to the world frame as shown in This Image

Camera– Index for the camera calibration to use for the image.

‍

Panorama Images

‍

The panorama image

Each panorama is a single equirectangular image that covers the whole sphere around the camera.

Moving left to right across the image turns you a full circle around the camera. Every column of pixels is one direction you could face:

The centre column is the vertical strip of pixels exactly halfway across the image. Where it crosses the horizon row is the direction the +Z axis points. It does not have to be the direction of travel; it is wherever the middle of your image looks.

Camera file (.cal)

A panorama camera needs only its type and its image size. Write one .cal for each panorama camera, the same way you write one for each frame camera today.

[Calibration]
Version=2
Type=5
Nx=12288
Ny=6144

Only Type, Nx (image width) and Ny (image height) are needed. Type=5 is what marks the camera as a panorama; without it, TopoDOT treats it as a frame camera. Leave out the frame-camera keys (focal length, principal point, distortion) and Adjust / AdjustmentMatrix: the whole orientation goes in each panorama’s matrix.

Project file (.iprj)

Set RotationOrder=6. It tells TopoDOT to read each image’s orientation from a Mat= rotation matrix. This spec defines panorama orientation only as a matrix. TopoDOT does apply heading/roll/pitch (RotationOrder 1–4 with Hrp=) to a panorama camera the same way it does to a frame camera, but we have not validated panoramas that way, so use Mat=.

The panorama camera is listed like any other camera:

[Image Project]
Version=2
Units=m
RotationOrder=6
CameraCount=1
Name0=Pano
ImageDirectory0=.\Pano\
CalFile0=.\Pano\Pano.cal

ImageDirectoryN must end with a backslash (\). TopoDOT joins it to each Image= name as plain text, so without the backslash every image is skipped.

RotationOrder applies to every image in the project, not to each camera. If your frame cameras use Hrp= today, choose one of these:

  1. Export panoramas as their own project (recommended). Write a second .iprj and .lst that hold only the panorama camera, with RotationOrder=6. Your existing frame-camera export does not change.
  2. Put everything in one project. Set RotationOrder=6 and write a Mat= line for your frame images too. The same matrix rules apply to them.

Image list (.lst)

Each panorama is four lines, in this order:

[Image List]
Image=pano_000125.jpg
Xyz=500123.456 4200456.789 102.345
Mat=1.000000000 0.000000000 0.000000000 0.000000000 0.000000000 1.000000000 0.000000000 -1.000000000 0.000000000
Camera=0

Two rules:

Orientation: the rotation matrix

The matrix says which way each of the panorama’s three axes points in the real world. Each column of the matrix is one axis, written as a direction in project coordinates (X = east, Y = north, Z = up):

‍

Matrix columnPanorama axisWhere it is in the image
1st+X, rightA quarter turn right of centre (¾ of the width), on the horizon row
2nd+Y, downStraight down in the camera's frame (the bottom row)
3rd+Z, forwardThe centre column, on the horizon row
Matrix rowColumn 1: right (X)Column 2: down (Y)Column 3: forward (Z)
Row 1: eastXxYxZx
Row 2: northXyYyZy
Row 3: upXzYzZz

‍

Here X, Y and Z are the right, down and forward directions. In the .lst, the matrix is written row by row: Mat=Xx Yx Zx Xy Yy Zy Xz Yz Zz.

Building the matrix from your own data

The simplest way is to ask your own software where two pixels of the panorama point:

  1. Forward (+Z): the pixel in the centre column on the horizon row, at (W/2, H/2). Take its direction in project coordinates and scale it to length 1.
  2. Right (+X): the pixel at ¾ of the width on the horizon row, at (3W/4, H/2). Take its direction the same way.
  3. Down (+Y): the cross product forward × right.
  4. Put right, down and forward in columns 1, 2 and 3, then write the matrix row by row.

This works whatever convention your system uses internally, because it only depends on where the pixels look.

Shortcut for a level panorama

If the panorama is level, and its centre column faces heading H (degrees clockwise from grid north):

Mat=cos(H) 0 sin(H) -sin(H) 0 cos(H) 0 -1 0

Centre column facesMat=
North (H = 0°)1 0 0 0 0 1 0 -1 0
East (H = 90°)0 0 1 -1 0 0 0 -1 0
South (H = 180°)-1 0 0 0 0 -1 0 -1 0
West (H = 270°)0 0 -1 1 0 0 0 -1 0

A real mobile panorama is rarely exactly level, so use the recipe above for production data.

Rules

Complete example

This is a panorama-only project with two level panoramas: the first faces east, the second faces northeast (heading 45°).

Run01_Panoramas\
   Run01_Panoramas.iprj
   Run01_Panoramas.lst
   Pano\
       Pano.cal
       pano_000001.jpg
       pano_000002.jpg

‍

Run01_Panoramas.iprj

[Image Project]
Version=2
Units=m
RotationOrder=6
CameraCount=1
Name0=Pano
ImageDirectory0=.\Pano\
CalFile0=.\Pano\Pano.cal

Pano\Pano.cal

[Calibration]
Version=2
Type=5
Nx=8192
Ny=4096

Run01_Panoramas.lst

[Image List]
Image=pano_000001.jpg
Xyz=500123.456 4200456.789 102.345
Mat=0.000000000 0.000000000 1.000000000 -1.000000000 0.000000000 0.000000000 0.000000000 -1.000000000 0.000000000
Camera=0
Image=pano_000002.jpg
Xyz=500128.912 4200461.020 102.410
Mat=0.707106781 0.000000000 0.707106781 -0.707106781 0.000000000 0.707106781 0.000000000 -1.000000000 0.000000000
Camera=0

Requirements

Calibrated images combined with point cloud data greatly improve the productivity and quality of the extraction process. Typically, a user simply clicks on a point and TopoDOT will search through thousands of images to quickly find the closest image and import it automatically. Once the image is loaded, the user is able to switch between cameras to view adjacent areas. TopoDOT® users continuously exploit the detail in high resolution calibrated images to identify features and assets within the point cloud. Thus maintaining an organized image project format is imperative for overall process performance.

In order to effectively identify and locate the images closest to the selected location, TopoDOT® places specific requirements on how the image project (*.iprj) should be exported.

Example Image Project Directory Structure*Note that highlighted labels are directory names.

Please contact your TopoDOT support team for any further information.

Any questions?

Talk to the Experts

Talk with TopoDOT Solutions about production workflows, governance strategy, and the right next step for your organization.