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 4
16
В новой версии появились проблемы с собственноручно сделанным модулем. Точнее с импортом объектов 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", надеюсь ничего не сломается. Но все же это танец с бубном

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

18
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

19
Здравствуйте, Алексей.
Все пишу скрипт выравнивания по камерам. "Нашел" плоскость камер. Пытаюсь построить базиз, чтобы трансформировать. Почему-то если выставляю собственный вектор (без плавающей запятой), то скалярное произведение по всем векторам равно 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()


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

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







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

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

Пишу и пытаюсь найти связь. Я так понял метода возвращающего именно вычисленные координаты, которые можно посмотреть в окне просмотра нет. Их нужно вычислять через 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]])

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

23
Other Languages / Запекание смещения
« on: March 17, 2015, 10:24:43 AM »
Здравствуйте, Алексей.
Есть ли возможность запекания смещений одной поверхности к другой непосредственно в Agisoft на python в 32 бит TIFF? Если например в одном блоке находится поверхность с преобразованным текстурным атласом, а другой поверхность изменения на которой нужно оценить. Карты смещения одного блока относительно другого были бы хорошим подспорьем для внедрения инструментов первичного анализа результатов фотограмметрии.
Заранее спасибо,
С уважением,
Александр.

24
Сделал плагин для Cinema 4D для создания масок по модели и делюсь им с вами.
Иной раз при предварительной обработке импорта масок из модели не достаточно. так как часто бывают различные предметы перед объектом или же нужно вычесть из обработки внутренние части. Если пользоваться обычным импортом масок из объекта. то маски будут создаваться для всех участком. где луч из камеры пересекает геометрию объекта (в том числе и полигоны с обращенными нормалями).
Пользоваться плагином просто. Распаковываем архив в директорию Cinema 4D в папку plugins. Экспортируете из Photoscan предварительную модель в fbx вместе с камерами (лучше. чтобы дисторсия всех фотографий была уже скорректирована например в LigthRoom иначе для каждого цикла съемки притеняется править параметры фокусного расстояния, так как камеры Cinema 4D не имеют как таковой дисторсии). Импортируем модель fbx в Cinema 4D. Далее создаем примитивы для тех участком, где у нас находятся объекты не желательные для обработки и на некоторых снимках заслоняющие частично модель. Этим примитивам присваиваем материал с отключенными всеми флажками, чтобы он был черный (т.е. не цвета. ни бликов и т.д.). Самой модели присваиваем материал только с белым самосвечением (если хотите можно присвоить черно-белую  текстуру в качестве самосвечения, где черным вы исключите из обработки участки поверхности модели, допустим дырки в керамике при съемки находок археологических раскопов). В сцене больше ничего быть не должно, при пробном рендринге у Вас должна получаться черно-белая картинка. Все камеры группируем в <Ноль объект>(en:<Null>) или создаем его и помещаем все камеры в этот родительский объект. Выделяем <Ноль объект>. Далее запускаете плагин. Здесь два варианта: используем постоянные настройки разрешения растра по горизонтали и вертикали, или задаем путь к папке с фотографиями где в цикле берутся значения для каждой камеры (активна по-умолчанию). Последнее необходимо в случае если Вы меняли ориентировку камеры при съемке. далее задаем папку для сохранения масок. Желательно окно плагина сдвинуть немного влево, иначе окно просмотра изображений (которое появится сразу после обработки первой камеры) заслонит окно плагина и Вы не увидите статус обработки. Нажимаем кнопку Обработать. Ждем. Импортируем маски из файла ({filename}.jpg) для всех камер в Photoscan. Все. С наступившим всех.

P.S. Если кто захочет доработать плагин - пожалуйста. Только, пожалуйста, выкладывайте в общий доступ.

25
Здравствуйте, Алексей.
Я так понимаю "качество обработки" - коэффициент изменения dpi снимков при обработке. В связи с этим хотелось бы узнать, существует ли возможность задать отдельным снимкам отдельный коэффициент качества обработки в одной сцене. Для чего это нужно? Преимущество фотограмметрии в отличии от лазерного не только в стоимости, но и в том. что можно объединять разновременные снимки одного и того же объекта* (сам так объединял).  Бывает так, что оборудование имеет различный dpi. Конечно можно обработать отдельно в разных блоках, но в этом случае появляются швы и искажения, а иногда есть только несколько снимков, например объекта сверху не очень высокого качества снятого с беспилотника - при этом для реконструкции верхушки они тоже нужны. В этом случае было бы полезно для отдельных снимков задать очень высокое качество обработки. а для других высокое.
Заранее спасибо
С уважением
Александр.



*Последние исследования показали, что качество вычисленных точек так же выше, чем у измеренных лазерным сканером, так как не вводятся поправки на измерения.

26
Other Languages / Иcправление дисторсии в ligthroom
« on: September 26, 2014, 01:00:38 PM »
Здравствуйте, Алексей.
По-моему уже такой вопрос задавался, но я не нашел топик, а ответ на него я не помню.
Есть ли смысл править дисторсию в Ligthroom перед импортом в Photoscan или эта процедура только медвежью услугу окажет?
Заранее спасибо
С уважением
Александр.

27
Other Languages / Баги в программе
« on: September 16, 2014, 10:06:31 AM »
Здравствуйте, Алексей.
Несколько багов:
1. При импорте модели (в obj) с несколькими блоками для текстурирования построение ведется только одной текстуры с одним текстурным атласом.
2. Не всегда в процессе обработки срабатывает "отмена". проводится обработка и только потом происходит отмена - смысл тогда весь теряется.
С уважением
Александр

28
Здравствуйте, Алексей.
Появилась необходимость получать пространственные координаты якоря(ancor/proxy) заданной в программе системы координат, при экспорте модели в локальной системе, непосредственно через Photoscan, не прибегая к сторонним приложениям (т.е. манипуляции экспорта в системе координат проекции одновременно с локальной, и вытеснение координат якоря с импортом первой в c4d).
Это необходимо при импорте модели в ArcGIS Pro - новое приложение ESRI для Desctop. Да, свершилось, теперь ArcGIS ест модели более чем 80 тыс. полигонов ранее (проверено на 2,5 млн.). Но инструмент остался тот же, в котором нужно создать точечный объект, к которому будет привязоваться объект. По модели будет совершаться оцифровка кровли стенок раскопа с учетом картографии пласта в 3D. Метод оцифровки по ортосрезам не эффективен, так как он не дает учитывать плановую картографию и соответственно контуры объектов раскопа на пасте и на стенке расходятся.
заранее спасибо, Александр.

29
Здравствуйте, Алексей. Есть ли возможности или скрипт для инициализации процедуры расчета цветов вершин импортированной модели после обработке в сторонней программе (zBrush)? К сожалению, не смотря на то, что zBrush работает с Polypaint (цвета вершин), он не поддерживает ply. А obj не записывает цвета вершин. Сам же zBrush очень хорош для фильтрации модели, исправления огрехов.
Заранее спасибо.
С уважением.
Александр.

30
Здравствуйте.
Нельзя ли реализовать импорт масок для всех фотографий из модели в пакетной обработке для каждого блока. Очень полезно построить сначала модель низкого качества или вообще из разреженного облака, отрезать все, что не нужно и граничить область обработки для построения более качественной модели. А блоков, порой, несколько бывает.
Заранее спасибо.
С уважением, Александр.

Pages: 1 [2] 3 4