Agisoft Metashape Professional 2 May 2026
Agisoft Metashape Professional 2 is a desktop photogrammetry software for creating 3D models, dense point clouds, orthophotos, DEMs, and textured meshes from overlapping images or laser scans. It's used in surveying, cultural heritage, mapping, agriculture, and visual effects.
At its core, Agisoft Metashape Professional 2 is a standalone software product that performs photogrammetric processing of digital images and 4D reconstruction. It takes thousands of overlapping 2D photos—captured by drones, terrestrial cameras, or even smartphones—and generates high-resolution 3D spatial data, including dense point clouds, textured polygonal meshes, digital elevation models (DEMs), georeferenced orthomosaics, and 3D models ready for export to CAD, GIS, or game engines.
Version 2 is not merely a patch or a service update; it represents a fundamental overhaul of the processing pipeline, leveraging modern GPU architectures and introducing AI-assisted workflows.
Problem: "Depth maps generation fails with 'Out of memory'." Fix: Go to Tools > Preferences > GPU. Reduce the "Max texture count per pass" from 0 (auto) to 50 or 25. This processes fewer images simultaneously.
Problem: The AI mask misses small objects. Fix: Run Tools > Calibrate Colors first. Contrast-normalized images improve neural net accuracy by ~15%. agisoft metashape professional 2
Problem: Python script from version 1.8 breaks.
Fix: Change PhotoScan.app.document to Metashape.app.document. Also replace chunk.buildDenseCloud() with chunk.buildDepthMaps() followed by chunk.buildDenseCloud().
While previous versions were 64-bit, Metashape Professional 2 fully exploits memory addressing beyond 256GB. Users can now align over 50,000 50-megapixel images in a single chunk without crashing—a feat impossible in v1. The new chunk management system also allows for seamless merging of sub-models.
Agisoft has integrated a lightweight neural network for semantic segmentation. Version 2 can automatically classify points into categories: ground, vegetation, buildings, and water. This is a game-changer for GIS professionals who previously spent hours manually cleaning point clouds. Additionally, the mesh reconstruction algorithm now produces smoother surfaces on organic shapes while preserving hard edges for man-made structures—all without additional post-processing.
As datasets grow from hundreds of images to tens of thousands (common in aerial LiDAR and photogrammetry fusion), data management becomes the primary constraint. Metashape 2.0 introduces a Nested Chunk Hierarchy. Agisoft Metashape Professional 2 is a desktop photogrammetry
This structural change allows for a tree-like organization of project data, where "child" chunks can inherit coordinate systems and control point data from "parent" chunks. This hierarchical approach facilitates the processing of massive, multi-site projects within a single file container. It allows for region-based processing where local high-resolution scans can be embedded within a broader lower-resolution geodetic survey, resolving the "level of detail" conflict inherent in large-scale mapping.
This script is designed to be run directly within the Metashape "Run Script" dialog or integrated into a custom menu plugin.
# -*- coding: utf-8 -*- """ Agisoft Metashape Professional 2 - Feature Script Feature: Automated Vegetation Classification & DTM Generation Author: AI Assistant Version: 1.0 Compatible: Metashape Pro 2.x """import Metashape from PySide2 import QtWidgets, QtCore
class DTMGeneratorDialog(QtWidgets.QDialog): """ GUI Dialog for configuring the DTM generation parameters. """ def init(self, parent=None): super(DTMGeneratorDialog, self).init(parent) Preset 1: Medium
self.setWindowTitle("Auto Vegetation & DTM Tool") self.setMinimumWidth(300) layout = QtWidgets.QVBoxLayout() # Preset Selector self.form_layout = QtWidgets.QFormLayout() self.preset_combo = QtWidgets.QComboBox() self.preset_combo.addItems(["Light Vegetation (Grass/Fields)", "Medium Vegetation (Orchards)", "Dense Forest"]) self.form_layout.addRow("Environment:", self.preset_combo) # Advanced Parameters self.cell_size_spin = QtWidgets.QDoubleSpinBox() self.cell_size_spin.setRange(0.1, 50.0) self.cell_size_spin.setValue(2.0) # Default 2 meters self.form_layout.addRow("Cell Size (m):", self.cell_size_spin) self.max_terrain_angle = QtWidgets.QDoubleSpinBox() self.max_terrain_angle.setRange(0, 90) self.max_terrain_angle.setValue(15.0) self.form_layout.addRow("Max Slope (deg):", self.max_terrain_angle) layout.addLayout(self.form_layout) # Buttons self.btn_run = QtWidgets.QPushButton("Process DTM") layout.addWidget(self.btn_run) self.btn_run.clicked.connect(self.accept) self.setLayout(layout) def get_params(self): """Returns the parameters selected by the user.""" preset = self.preset_combo.currentIndex() return "preset": preset, "cell_size": self.cell_size_spin.value(), "max_slope": self.max_terrain_angle.value()def classify_ground_and_vegetation(params): """ Core logic to separate ground and vegetation points. """ doc = Metashape.app.document chunk = doc.chunk
if not chunk: Metashape.app.messageBox("No active chunk found!") return False if not chunk.point_cloud: Metashape.app.messageBox("No point cloud found. Please align photos and build dense cloud first.") return False print(f"Starting Classification with params: params") # 1. Reset Classification (Optional, good for debugging) # chunk.point_cloud.resetClasses() # 2. Progressive Morphological Filter (Ground Classification) # This identifies points that fit a surface model within the cell size and slope constraints. # Mapping Presets to Filter Arguments # Preset 0: Light, Preset 1: Medium, Preset 2: Dense max_road_height = [0.5, 2.0, 5.0][params['preset']] # Max height of non-ground object print("Running Ground Classification Filter...") # Metashape 2.x specific API for ground filtering # We attempt to classify Class 2 (Ground) try: chunk.point_cloud.classifyGroundPoints( max_angle=params['max_slope'], max_distance=max_road_height, cell_size=params['cell_size'], classes=[Metashape.PointClass.Created, Metashape.PointClass.Unclassified] # Process unclassified points ) print("Ground classification complete.") except Exception as e: print(f"Error during ground classification: e") return False # 3. Vegetation Identification Logic # Any point NOT classified as Ground, but high above the ground plane, is Vegetation. # We can use a distance filter or simply assume remaining unclassified points in height ranges are vegetation. # For this feature, we will assume standard Photogrammetry logic: # Points significantly higher than the 'Ground' surface in the local cell are Vegetation. print("Refining Vegetation Classes...") # We use a custom logic here: # Reclassify 'Unclassified' points that are > 0.5m above nearest 'Ground' point