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.


Topics - aldanstar

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

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

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

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

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

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

3
Other Languages / Доступ к экземляру QMainWindow
« on: November 19, 2018, 02:10:45 PM »
Здравствуйте, Алексей
А можно ли получить доступ к экземпляру объекта QMainWindow не прибегая к ухищрениям с его поиском среди всех потомков (поиск наименования класса виджета центрального окна -> ремап его позиции ву глобальную -> получение виджета в позиции -> три раза предок) приложения для размещения своих QDockWidget для плагина?
И если не сложно не подскажите в какой объект инсталлирован транслятор?
Заранее, спасибо.

4
Python Scripting / Using exist progressBar through the Python
« on: November 01, 2018, 12:02:43 PM »
Is there way to use stock ProgressBar object included to the photoscan through the Python? If not, is there way to hide it with aim sending callback results to own progressBar queue?

5
Other Languages / Обращение к progressBar через Python
« on: November 01, 2018, 11:54:17 AM »
Существует ли способ обращаться к встроенному progressbar через python. Если нет, то как его скрыть, чтобы через Callback я кидал значения прогресса в квоту своего прогрессбара?
Заранее, спасибо

6
Здравствуйте, Алексей
В руководстве python API  что-то не могу найти функцию возврата рассчитанных значении и ошибки для положения камер(понял, что center + T.mulp и получается хорошо) и всех поворотов через питон (думаю должно возвращаться что-то одно, другое пересчитывается относительно начальной привязки). Полагл для каждой камеры должно быть что-то типа класса reference только с возвратом, но это не так. Не подскажите?

РАЗОБРАЛСЯ


И еще вопросы:

1.Что такое Мастер-камера?
2.как через python перекидывать камеры в другой чанк, на данный момент я просто считываю камеры и заново импортирую фотографии. На это времени больше у программы похоже уходит.

Заранее спасибо, с уважением
Александр

7
Здравствуйте, Алексей
Я не уверен будет ли эта идея нова для Вас, но все же я обязан ее озвучить.
На данный момент у вас реализована система распределенного вычисления не только на гпу, но и на нескольких машинах. Многие уже приобрели соответствующее оборудование. Но иногда нужна быстрая и эффективная обработка на собственных мощностях. У вас реализована система пакетной обработки, а значит это некий сценарий. Было бы классно иметь модуль и соответствующее мобильное приложение для связи, обработки и получения результатов на роддом 123д катч (бывшем) или scann3d, но с использованием собственных ресурсов, масштабируя их по собственному желанию и возможностям. Систему пакетной обработки можно использовать для создания сценариев обработки и представления результатов. Arcore и arkit для предварительных измерений и гида при съемке (например для раскопов контролировать технику фиксации углов, ее нет в вашем мануале, но она эффективнее), Gnss для привязки и преселекции.
С уважением, Александр

8
Здравствуйте, Алексей
Возникла небольшая дилемма:
Как найти ближайшее расстояние от камеры (конечно будет от каждой камеры) до твердотельной модели через API?
Заранее спасибо

9
В новой версии появились проблемы с собственноручно сделанным модулем. Точнее с импортом объектов QTCore.

2017-05-03 18:18:11 Traceback (most recent call last):
2017-05-03 18:18:11   File "C:/Users/astarovo/AppData/Local/Agisoft/PhotoScan Pro/scripts/KernScanTools.py", line 5, in <module>
2017-05-03 18:18:11     from kstools.kerntools import alignKern
2017-05-03 18:18:11   File "C:\Users\astarovo\AppData\Local\Agisoft\PhotoScan Pro\scripts\kstools\kerntools.py", line 10, in <module>
2017-05-03 18:18:11     from PySide.QtCore import QObject, SIGNAL
2017-05-03 18:18:11   File "E:\Program Files\Agisoft\PhotoScan Pro\python\lib\site-packages\qtconsole\qt_loaders.py", line 56, in load_module
2017-05-03 18:18:11     """ % (fullname, loaded_api()))
2017-05-03 18:18:11 ImportError:
2017-05-03 18:18:11     Importing PySide disabled by QtConsole, which has
2017-05-03 18:18:11     already imported an incompatible Qt Binding: pyside2

Что делать? Что изменить?
Смотрю тут PySide2, но там нет нужных мне объектов.
Попробую "E:\Program Files\Agisoft\PhotoScan Pro\python>python -m pip install pyside", надеюсь ничего не сломается. Но все же это танец с бубном

10
Other Languages / вырубается видеокарта с CUDA
« on: April 08, 2017, 01:46:17 PM »
С новым режимом CUDA вырубается видеокарта (Quadro 4000) при построении плотного облака точек.

11
Other Languages / Проблемы с Model.volume() и Model.area()
« on: October 01, 2016, 12:23:06 PM »
Здравствуйте, Алексей
Функция Model.volume() и Model.area() работают от раза к разу, т.е. срабатывает не всегда, хотя встроенным инструментом программы вычисляется. Написал скрипт для сохранения линейных компонент, а вот с площадью и объемом беда из-за данного бага.


vol=mod.volume()
ar=mod.area()


Code: [Select]
class lineParam(object):   
    def __init__(self, object):
        self.chunk = object
        print(u"Экспорт размеров")
       
    def export(self):   
        try:
            mod=self.chunk.model
            T = self.chunk.transform.matrix
            saveVol=False
            print(u"ar " +str(ar))
            xo=self.lenghByAxis(mod,T,0)
            print(u"xo " +str(xo))
            yo=self.lenghByAxis(mod,T,1)
            print(u"yo " +str(yo))
            zo=self.lenghByAxis(mod,T,2)
            print(u"zo " +str(zo))
           
            try:
                vol=mod.volume()
                ar=mod.area()
                if  vol==0:
                    PhotoScan.app.messageBox(u"Внимание! Объем равен нулю. Проверьте герметичность модели.")
                saveVol=True
            except IOError:
                print(u"Не могу вычислить объем и площадь")
            path = PhotoScan.app.getExistingDirectory(u"Сохранить параметры")
            paramFile = open(path+"\\"+str(self.chunk.label).split('_', 1)[0]+"_PARAMETERS.txt", 'w+')
            if saveVol==True:
                paramFile.write("V= "+str(round(vol, 4))+" mm^3")
                paramFile.write('\n')
                paramFile.write("S= "+str(round(ar, 4))+" mm^2")
                paramFile.write('\n')
            paramFile.write("x= "+str(round(xo, 4))+" mm")
            paramFile.write('\n')
            paramFile.write("y= "+str(round(yo, 4))+" mm")
            paramFile.write('\n')
            paramFile.write("z= "+str(round(zo, 4))+" mm")
            paramFile.write('\n')
            paramFile.close()
            print(u"Параметры сохранены")
        except IOError:
            print(u"Не удалось сохранить параметры")


    def lenghByAxis(self, mod,T, axis):

        coordinate=mod.vertices[0].coord

        coordinate=T.mulv(coordinate)

       
        min = max = coordinate[axis]
           
        for v in mod.vertices:
            coordinate=v.coord

            coordinate=T.mulv(coordinate)
            if min>coordinate[axis]:
                min = coordinate[axis]
            if max<coordinate[axis]:
                max = coordinate[axis]

        dif = max - min
        return dif

12
Здравствуйте, Алексей.
Все пишу скрипт выравнивания по камерам. "Нашел" плоскость камер. Пытаюсь построить базиз, чтобы трансформировать. Почему-то если выставляю собственный вектор (без плавающей запятой), то скалярное произведение по всем векторам равно 0. Если же нормаль плоскости или вектор с запятой, то 3-ий вектор не ортогональным получается.

Проекты и скрипт: ftp://gisserver.kpfu.ru/Public/Porjects/

Вот скрипт (в самом конце скрипта):

import PhotoScan
import math

doc = PhotoScan.app.document
chunk = doc.chunk
Cameras = chunk.cameras
T = chunk.transform.matrix

sCamera = Cameras[0]
correction = sCamera.key #нужен потому что иногда камера 0 становится большей непонятно почему
#cam_index = PhotoScan.app.getInt("Input camera index (starting from zero): ")
#save_path = PhotoScan.app.getSaveFileName("Specify output file:")
def realCoord(C): #Coordinates to real
    newCoord = PhotoScan.Vector( [T[0,0]*C[0]+T[0,1]*C[1]+T[0,2]*C[2]+T[0,3],T[1,0]*C[0]+T[1,1]*C[1]+T[1,2]*C[2]+T[1,3],T[2,0]*C[0]+T[2,1]*C[1]+T[2,2]*C[2]+T[2,3]] )
    return newCoord

def distBeatPoins(C1,C2): #Distance between points
    dist = math.sqrt((C1[0]-C2[0])*(C1[0]-C2[0])+(C1[1]-C2[1])*(C1[1]-C2[1])+(C1[2]-C2[2])*(C1[2]-C2[2]))
    return dist

def furtherCamera(C):#Mead and further camera in circle

    find=False
    index=C.key-correction
    D2=0

    while find == False:
        index +=1
        D1=distBeatPoins(C.center,Cameras[index].center)
        if D1 < D2:
            find=True
        else:
            D2=D1
            maxIndex=index

    find=False

    while find == False:
        D1=distBeatPoins(C.center,Cameras[index].center)
        if D1 > D2:
            find=True
        else:
            D2=D1
            minIndex = index
        index +=1
    print([Cameras[maxIndex],Cameras[minIndex]])
    return [Cameras[maxIndex],Cameras[minIndex]]

def planeBy3Cameras(C1,C2,C3):
    C1=C1.center
    C2=C2.center
    C3=C3.center
    return planeBy3Points(C1,C2,C3)


def planeBy3Points(C1,C2,C3):


    A = C1[1]*(C2[2] - C3[2]) + C2[1]*(C3[2] - C1[2]) + C3[1]*(C1[2] - C2[2])
    B = C1[2]*(C2[0] - C3[0]) + C2[2]*(C3[0] - C1[0]) + C3[2]*(C1[0] - C2[0])
    C = C1[0]*(C2[1] - C3[1]) + C2[0]*(C3[1] - C1[1]) + C3[0]*(C1[1] - C2[1])
    D =-( C1[0] * (C2[1] * C3[2] - C3[1] * C2[2]) + C2[0] * (C3[1] * C1[2] - C1[1] * C3[2]) + C3[0] * (C1[1] * C2[2] - C2[1] * C1[2]))

    return PhotoScan.Vector( [A, B, C, D] )

def meanPlaneBeatCameras(sCamera,fCamera):
    pList = []

    for i in range(sCamera.key-correction, fCamera.key-correction):
        C1 = Cameras
        if int(i+fCamera.key-correction/3)> fCamera.key-correction:
            C2 = Cameras[int(i+fCamera.key-correction/3)-fCamera.key-correction+(sCamera.key-correction-1)]
        else:
            C2 = Cameras[int(i+fCamera.key-correction/3)]

        if int(i+2*fCamera.key-correction/3)> fCamera.key-correction:
            C3 = Cameras[int(i+2*fCamera.key-correction/3)-fCamera.key-correction+(sCamera.key-correction-1)]
        else:
            C3 = Cameras[int(i+2*fCamera.key-correction/3)]

        P = planeBy3Cameras(C1, C2, C3)
        pList.append([i, int(i+fCamera.key-correction/3), int(i+2*fCamera.key-correction/3), P])

    return pList

def meanPlane(pList):
    summA =0
    summB =0
    summC =0
    summD =0
    for i in range(0,len(pList)):
        summA += pList[3][0]
        summB += pList[3][1]
        summC += pList[3][2]
        summD += pList[3][3]
    return PhotoScan.Vector( [summA/len(pList), summB/len(pList), summC/len(pList), summD/len(pList)] )

def cameraToPlaneDist(Plane, Camera):
    Point = Camera.center
    return pointToPlaneDist(Plane, Point)

def pointToPlaneDist(Plane, Point):
    return (Plane[0]*Point[0]+Plane[1]*Point[1]+Plane[2]*Point[2]+Plane[3])/math.sqrt(Plane[0]*Plane[0]+Plane[1]*Plane[1]+Plane[2]*Plane[2])

def maxDistToPlane(Plane, sCamera, eCamera):
    maxDist=0
    distList = []
    distListWithMax = []
    for i in range(sCamera.key-correction,eCamera.key-correction+1):
        disPoint = math.fabs(round(cameraToPlaneDist(meanP, Cameras),2))
        distList.append(disPoint)
        if disPoint>maxDist:
            maxDist=disPoint
    distListWithMax.append(distList)
    distListWithMax.append(maxDist)
    return distListWithMax

def degbeatPlane(plane1, plane2):
    return math.acos(math.fabs(plane1[0]*plane2[0]+plane1[1]*plane2[1]+plane1[2]*plane2[2])/math.sqrt((plane1[0]*plane1[0]+plane1[1]*plane1[1]+plane1[2]*plane1[2])*(plane2[0]*plane2[0]+plane2[1]*plane2[1]+plane2[2]*plane2[2])))


fCamera = furtherCamera(sCamera)[0]
pList = meanPlaneBeatCameras(sCamera,fCamera)
meanP = meanPlane(pList)
#print(pList)
#print(meanP)


def intersectVector(P1,P2):
    return PhotoScan.Vector( [ (P1[1]*P2[2]-P1[2]*P2[1]),(P1[0]*P2[2]-P1[2]*P2[0]),(P1[0]*P2[1]-P1[1]*P2[0]) ] )

def scalar(vec1,vec2):
    return vec1[0]*vec2[0]+vec1[1]*vec2[1]+vec1[2]*vec2[2]

def degrBVect(vec1, vec2):
    scalar = scalar(vec1,vec2)
    veclen = math.sqrt((vec1[0]*vec1[0]+vec1[1]*vec1[1]+vec1[2]*vec1[2])*(vec2[0]*vec2[0]+vec2[1]*vec2[1]+vec2[2]*vec2[2]))
    return math.acos(scalar/veclen)

def alignByVector(V):
    V=PhotoScan.Vector([0,1,2])


    V1 = PhotoScan.Vector([V[0],V[1],V[2]])
    V2 = PhotoScan.Vector([1,1,-(V1[0]+V1[1])/V1[2]])
    V3 = PhotoScan.Vector([V1[1]*V2[2]-V1[2]*V2[1],V1[2]*V2[0]-V1[0]*V2[2],V1[0]*V2[1]-V1[1]*V2[0]])

    print(T)
    print(V1)
    print(V2)
    print(V3)
    print(scalar(V1,V2))
    print(scalar(V1,V3))
    print(scalar(V2,V3))

    """rotation = PhotoScan.Matrix([[V1[0],V1[1],V1[2]],[V2[0],V2[1],V2[2]],[V3[0],V3[1],V3[2]]])

    R = rotation
    C = chunk.region.center

    if chunk.transform:
       T = chunk.transform.matrix
       s = math.sqrt(T[0,0]*T[0,0] + T[0,1]*T[0,1] + T[0,2]*T[0,2])
       S = PhotoScan.Matrix( [[s, 0, 0, 0], [0, s, 0, 0], [0, 0, s, 0], [0, 0, 0, 1]] )
    else:
       S = PhotoScan.Matrix( [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]] )


    T = PhotoScan.Matrix( [[-R[2,0],-R[2,1],-R[2,2],C[2]], [R[1,0],R[1,1],R[1,2],C[1]],[R[0,0],R[0,1],R[0,2], C[0]], [0,0,0,1]])

    chunk.transform.matrix = S * T.inv()"""

alignByVector(meanP)



P.S. есть еще один вопрос. Пытаюсь прикрутить библиотеки http://vpython.org/. Возможно ли это. Нужно просто после выравнивания сгенерировать цилиндр без шапок с цилиндрической UV для запекания в xNormals. Закидываю DLL и Libs от x64 пишет не совместим за данной версией Python, если 2.7 или 3.2 то не является Win32.

Я вижу так же, что Вы используете PyQt. Может можно через него сгенерировать.
По крайней мере, выполнял то ошибок не возникло, только вот как его добавить с цилиндрической UV и без шапок:

import PhotoScan
import math
import sys
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtOpenGL import *

class MyWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setFixedSize(200, 120)

        self.quit = QtGui.QPushButton("Quit", self)
        self.quit.setGeometry(62, 40, 75, 30)
        self.quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))

        self.connect(self.quit, QtCore.SIGNAL("clicked()"),
                     QtGui.qApp, QtCore.SLOT("quit()"))


widget = MyWidget()
widget.show()


Соответственно я разобрался как создавать свои окна

Заранее спасибо,
С уважением,
Александр







13
Здравствуйте, Алексей.
Еще вопрос:
Можно ли сделать модель без автоматического упрощения модели?
Или задать порог упрощения?
Я снимаю керн, иной раз я уверен в правильности встроенных точек в плотном облаке. Но в результате автоматического упрощения я теряю пористость.
Далее я описываю идеальным цилиндром с известными высотой и диаметром с цилиндрическим UV. После запекаю через xNormal в RAW TIF смещения. Координаты камер из предыдущего топика мне нужны, чтобы найти ось цилиндра, вектор на который я его насажу (сгенеририрую через smesh, если нет способа генерировать примитив с цилиндрическим UV в библиотеках Photoscan).
С уважением,
Александр.

14
Все уже перепробовал и связи не вижу.

Пишу и пытаюсь найти связь. Я так понял метода возвращающего именно вычисленные координаты, которые можно посмотреть в окне просмотра нет. Их нужно вычислять через center и трансформацию чанка. но связи не вижу.

import PhotoScan
import math

doc = PhotoScan.app.document
chunk = doc.chunk
MyCameras = chunk.cameras
T = chunk.transform.translation

#for i in range(len(chunk.cameras)):
#   XYZCameas = chunk.cameras

name = MyCameras[0].label
location = MyCameras[0].center

location2 = chunk.transform.matrix

print(name)
print(location)

print(location2)






IMG_7694.jpg
Vector([0.3959250019867274, 19.478713480698204, 27.990800049616045])
Vector([-399.4386617266875, -291.0967091797766, 37.34514322392177])
IMG_7694.jpg
Vector([0.3959250019867274, 19.478713480698204, 27.990800049616045])
Matrix([[0.17809865964712732, -12.617669579419818, 19.435907363345162, -399.4386617266875],
       [0.19390938456149315, 19.43661239013898, 12.616350412484358, -291.0967091797766],
       [-23.171587770425443, 0.06567316498308629, 0.25496473754271476, 37.34514322392177],
       [0.0, 0.0, 0.0, 1.0]])

15
Здравствуйте,
В последних версиях перестали импортироваться UV координаты для FBX. Из Cinmea 4D с UV тегом, в просмотре UV пусто. При запекании получаем синюю фигуру.

Pages: [1] 2 3