Forum

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - aldanstar

Pages: [1] 2 3 ... 10
1
Здравствуйте, Алексей.
Есть идея удобной вещи - экспорт модели с точкой смещения по маркеру. Думаю так удобнее, создал маркер на готовой модели, а далее при экспорте или (импорте в том числе) не вводишь 3 координаты, а просто выбираешь этот маркер в выпадающем списке окна экспорта/импорта.
Спасибо

2
Python and Java API / Re: Elevation Data as array
« on: March 28, 2022, 02:01:49 PM »
Code: [Select]
import Metashape as ps
import os
import numpy as np
from PIL import Image
from zipfile import ZipFile
import xml.etree.ElementTree as ET

def read_elev():
    chunk = ps.app.document.chunk

    path = os.path.dirname(ps.app.document.path)
    name = os.path.basename(ps.app.document.path).split('.')[0]
    recurces_path = os.path.normpath(os.path.join(path, '{}.files'.format(name)))
    current_chunk_recurces_path = os.path.normpath(os.path.join(recurces_path, '{}'.format(chunk.key)))
    current_elevation_recurces_path = os.path.normpath(
        os.path.join(current_chunk_recurces_path, '0', 'elevation')) if chunk.elevation.key == 0 else os.path.normpath(
        os.path.join(current_chunk_recurces_path, '0', 'elevation.{}'.format(chunk.elevation.key)))

    if not os.path.exists(current_elevation_recurces_path): return

    elevation_zip_path = os.path.normpath(os.path.join(current_elevation_recurces_path, 'elevation.zip'))

    if not os.path.exists(elevation_zip_path): return

    with ZipFile(elevation_zip_path, 'r') as zipObj:
        listOfFileNames = zipObj.namelist()
        metaXml = zipObj.open(listOfFileNames[0])
        metaXmlData = metaXml.read()

    root = ET.fromstring(metaXmlData)

    tileWidth = int(root.findall("./params/dimensions/tileWidth")[0].text)
    tileHeight = int(root.findall("./params/dimensions/tileHeight")[0].text)

    width = int(root.findall("./params/dimensions/width")[0].text)
    height = int(root.findall("./params/dimensions/height")[0].text)

    tiles = []

    for child in root.findall("./tiles/tile"):
        try:
            child.attrib['level']
        except KeyError:
            tile = {}
            tile['x'] = int(child.attrib['x']) * tileWidth
            tile['y'] = int(child.attrib['y']) * tileHeight
            tile['path'] = os.path.normpath(
                os.path.join(current_elevation_recurces_path, child.findall("./path")[0].text))
            tiles.append(tile)

    arr = np.zeros((height, width))

    for tile in tiles:
        im = Image.open(tile['path'])
        imarray = np.array(im)
        x = tile['x']
        y = tile['y']
        arr[y:y + tileHeight, x:x + tileWidth] = imarray

    result = Image.fromarray(arr)

    result.show()

3
Здравствуйте,
Как получить в python количество точек в отдельно взятом классе, чтобы не проводить процедуру классификации, если точки там уже есть.
Также интересно, можно ли работать с отдельными точками и получать их атрибуты, например нормаль. Допустим перегнать их в numpy, а потом после обработки обратно.
Спасибо

4
Other Languages / Re: Пожелания
« on: March 11, 2022, 12:30:19 PM »
Подключусь к пожеланиям

1. Раскрашивание облака точек по скалярным полям (если они есть, допустим по времени или по нормали для данных Lidar)
2. Вычисление скалярных полей, например наследование высоты в поле
3. SOR фильтр точек

5
Здравствуйте.
Как Вы знаете я использую собственные python плагины с pyside2.
Также использую методы локализации с установкой своего QTranslator.
Программа сама работает в штатном режиме.
Только при выходе из нее, если устанавливать транслятор вылезает окно ошибки с обратной связью.
Жалуется что не может сохранить состояние для моего QToolBar (QMainWindow::saveState()).
Если транслятор не устанавливать, то все норм.
Что можно сделать, чтобы игнорировалось сохранение состояние для моих виджетов? Или все-таки срабатывал saveState при использовании собственного дополнительного транслятора.

Транслятор устанавливаю следующим образом:

 
Code: [Select]
   @staticmethod
    def install_translation(app, lang):
        translator = QTranslator(app)
        translator.load('lang/KFU_{0}'.format(lang), os.path.dirname(__file__))

        if not app.installTranslator(translator):
            print(app.installTranslator(translator))
            print("Can not install translation!")
        else:
            print("Translation instaled!")



Спасибо

6
Спасибо. Понятно. Я просто думал, что раз использую подход с использованием Тасков, может можно засунуть все в один прогресс бар. Сделаю, значит, как делал. Свой виджет с Qthread и очередью.

7
Здравствуйте,
В продолжении темы работы с данными сканирования. Немного сначала уточню задачу. Я уверен Вы знаете компанию AGM System, по крайней мере GeoScan с ними плотно сотрудничает. Как выяснялось при должном дополнением функциями Metashape очень хорошо подходить для постобработки данных с MC3 200. Снимки там сразу привязываются с параметрами центра фотографирования, углом, креном, тангажем в PPK. Т.е. фактически они почти выровнены и можно не взирая не на что сразу использовать для проецирования.
Особенно в зимнее время, снимки не всегда выравниваются полностью, что не позволяет построить ортофотоплан, не смотря на то, что облако точек есть измеренное уже в  Metashape. Хотелось бы сделать функцию, которая временно делала снимки выровненными на основе данных PPK обработки и создавала ортофото, а потом опять сбрасывала выравнивание для не выровненных в Metashape снимков.
Узнать какие выровнены, а какие нет понятно можно через
Code: [Select]
import Metashape
chunk = Metashape.app.document.chunk
print([camera.center for camera in chunk.cameras])
Так как у нас есть матрица трансформации
Code: [Select]
print([chunk.transform.matrix])Можно подменить все none на пересчитанные значения центров.
Так ли это, или все немного не так. Ведь есть еще и углы.
Как наследовать значения привязки с углами в систему координат Metashape, чтобы снимки стали "выровненными"
Спасибо

8
Здравствуйте,
Возможно ли выполнение процедур, оформленных в python в виде Task в одном окне с единым прогрессбаром. Т.е. есть ли менеджер, в который в виде списка можно было отправить свои задачи, а он внутри бы уже выполнял apply.
Допусти к примеру предыдущего поста, нужно импортировать LAS файлы, а потом их объединить:

Code: [Select]
        ImportTask = Metashape.Tasks.ImportPoints()
        ImportTask.format = Metashape.PointsFormatLAS
        ImportTask.calculate_normals = False
        ImportTask.crs = self.chunk.crs

        MergeTask = Metashape.Tasks.MergeAssets()
        MergeTask.source_data = Metashape.DataSource.DenseCloudData

        for i,item in enumerate(files):
            print('{} from {}'.format(i+1,len(files)))
            self.chunk.dense_cloud = None
            ImportTask.path = item
            ImportTask.apply(self.chunk)
            self.chunk.dense_cloud.label = os.path.basename(item.split('.')[0])

        curent_clouds = self.chunk.dense_clouds
        intesection = [x for x in curent_clouds if x not in prev_clouds]

        self.chunk.dense_cloud = None
        MergeTask.assets = [dense_cloud.key for dense_cloud in intesection]
        MergeTask.apply(self.chunk)
        self.chunk.dense_cloud.label = 'LiDAR cloud'

        self.chunk.remove(intesection)

В какой контейнер отправить ImportTask и MergeTask, чтобы они исполнялись в одном окне прогресса?

Спасибо

9
Спасибо

10
Other Languages / Объединение плотных облаков
« on: March 04, 2022, 08:42:49 AM »
Здравствуйте,
Как с помощью python объединить несколько облаков точек (dense_clouds), находящихся в одном чанке?
Спасибо

11
Здравствуйте,
Ранее еще для Фотоскан был скрипт PS104_footprint_by_photo, который считал границы снимков при проецировании их на рельеф. такого рода накидной монтаж часто нужен. Существует ли возможность сделать это в текущей версии программы?
Спасибо

12
Еще раз здравствуйте, Алексей
Не подскажите как можно работать с данными ортомозайки через numpy? Есть необходимость обработки, но своими методами без использования растрового калькулятора. Посмотрел на данные проекта, думал непосредственно с файлами работать, чтобы создавать новую ортомозайку с измененными данными. Необходимые тайлы записаны в непонятный пока мне формат с правильным shape-пом но значениями до 4294967295. Так бы я соединил их через vstark, но не понятен формат хранения. Хотя меташейп говорит о DataType8u.
Заранее спасибо
С ужением, Александр

13
Спасибо большое. Все работает как часы теперь.

14
Здравствуйте, Алексей

Как сделать, чтобы после добавления новой мозайки (addOrthomosaic) и ее генерации (buildOrthomosaic) она появлялась в дереве проекта. Я так понимаю buildOrthomosaic сохраняет результаты в последний объект в orthomosaics. Это создает трудности с переименованием ее в цикле (в итоге получаются имена не соответствующие содержимому). Чтобы было яснее в одном чанке содержаться фотографии одного объекта, но с двух камер в разных диапазонах спектра соосно направленных на объект, а для видимого диапазона делается еще и с УФ подсветкой для флюоресценции. Все это выравнивается вместе и содается общее облако точек. Для создания ортофото в скрипте поочередно блокируются камеры, оставляя активными только в нужном диапазоне.  Сейчас, чтобы оставить все в дереве я генерирую мозайку и копирую ее, после завершения всех процедур я чищу инфу у самой первой мозайки и остается три, но как я уже сказал имена не ответствуют контенту. Поэтому приходится использовать "китайский" код для наименования вне цикла, что противно.

P.S. Я Вам высылал проект для понимания вопроса о запекании ортофото в цилиндрической проекции на базе карты высот. Так понимаю это не возможно?

P.S.2 Есть предложение включать модули numpy, scipy и PIP в образ python программы по умолчанию:)

Заранее спасибо
Александр

15
Other Languages / Re: Доступ к экземляру QMainWindow
« on: November 25, 2018, 09:48:59 AM »
Здравствуйте, Александр,

Пожалуйста, попробуйте воспользоваться следующим кодом (в версии 1.4.4):
Code: [Select]
from PySide2 import QtWidgets, shiboken2
top_window = None
for w in QtWidgets.qApp.allWidgets():
if w.inherits("QMainWindow"):
ptr = shiboken2.getCppPointer(w)
top_window = shiboken2.wrapInstance(int(ptr[0]), QtWidgets.QMainWindow)
Устанавливать дополнительные модули не требуется.

Спасибо большое
Помогло
Теперь не зависим от скорости загрузки Фотоскана
Запекание по цилиндру пока не опробовал с ГУИ вожусь

Вопрос по ортотрансформированием на карту рельефа при использовании цилиндра и неадекватными искажением в этом случае так не решен?

Pages: [1] 2 3 ... 10