opencv python Треугольная сетка с координатами

У меня есть сетка в файле stl ( https://dl.dropboxusercontent.com/u/710615/stlMidpoint.stl )

С этим кодом:

from stl import mesh
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import cv2

def unique(a):
   order = np.lexsort(a.T)
   a = a[order]
   diff = np.diff(a, axis=0)
   ui = np.ones(len(a), 'bool')
   ui[1:] = (diff != 0).any(axis=1) 

  return a[ui]

 A = np.loadtxt("vectors.txt")
 A = A[np.logical_not(A[:,2] > 0)]
 uniqA = unique(A)
 coordA = A[:,0:2]

Я могу получить координаты, которые соответствуют (я думаю) точкам поверхности треугольников. Я пытаюсь нарисовать треугольники без успеха. Точки есть, но не в формате треугольников. Я использую полисы:

img= cv2.imread('nimg.jpg')
imgMask = np.ones(img.shape[:2], dtype="uint8")*255
m_xor= np.ones(imgMask.shape, dtype="uint8") * 255

points = np.array(uniqA[:,0:2], np.int32)
print points
cv2.polylines( m_xor,[points], 1, (0,0,0))
cv2.imwrite('result.jpg', m_xor)

vectors.txt: https://dl.dropboxusercontent.com/u/710615/vectors.txt

nimg: https://dl.dropboxusercontent.com/u/710615/nimg.jpg


person marco    schedule 17.03.2016    source источник


Ответы (1)


Используя numpy-stl (https://github.com/WoLpH/numpy-stl), я может легко открывать, читать и отображать файл:

from stl import mesh
from matplotlib import collections
from matplotlib import pyplot

# Create a figure and axes
figure, axes = pyplot.subplots()

# Read the STL file
your_mesh = mesh.Mesh.from_file('stlMidPoint.stl')

# Scale the image to the STL dimensions
axes.set_xlim(your_mesh.min_[0], your_mesh.max_[0])
axes.set_ylim(your_mesh.min_[1], your_mesh.max_[1])

# Add the polygons, but only the X and Y axis since it's 2D
axes.add_collection(collections.PolyCollection(your_mesh.vectors[:, :, :2]))

# Make sure the aspect ratio stays correct
pyplot.gca().set_aspect('equal')

# Render!
pyplot.show()

Однако огромный размер делает его очень медленным.

введите здесь описание изображения

person Wolph    schedule 23.03.2016
comment
Как я могу экспортировать как вектор numpy и наложить на другие изображения? Например, как я могу применить эту сетку к этому изображению dl.dropboxusercontent.com/u/710615/La1.png. Извлекая массив numpy с помощью matplotlib, я получаю точки, а не треугольники. - person marco; 24.03.2016
comment
Вы можете использовать figure.savefig('image.png', dpi=...) для сохранения изображения как изображения с высоким разрешением. Или используйте fig.canvas для прямого доступа к данным. Вектор на самом деле уже легко доступен через your_mesh.vectors[:, :, :2] - person Wolph; 25.03.2016
comment
Знаете ли вы способ рисования в другом контексте, отличном от matplotlib? - person marco; 29.03.2016
comment
Вы можете использовать Pillow (pillow.readthedocs.org) для рендеринга изображения. Просто нарисуйте многоугольники напрямую: pillow.readthedocs.org/en/3.1.x/reference/ Но я должен сказать, что я все еще не совсем уверен, чего вы пытаетесь достичь здесь, и является ли это самым простым решением вашей проблемы. . - person Wolph; 29.03.2016
comment
Мне нужно применить эту сетку к такому изображению: dl.dropboxusercontent.com/u/ 710615/La1.png . Поэтому мне нужно убедиться, что размеры одинаковы, и лучше использовать один и тот же модуль. Я работал с opencv - person marco; 30.03.2016
comment
Хорошо, 2 вопроса в таком случае. 1. Что вы имеете в виду под картой? Как найти пиксели треугольника? 2. Как соотносятся числа? Например 1 в stl файле это 1 пиксель, или это 10 пикселей или что-то совсем другое? - person Wolph; 30.03.2016
comment
Я думаю, что это просто то, что вы думаете. Я создал stl с помощью модуля trimesh (pypi.python.org/pypi/trimesh /1.12.4 ). Исходное изображение, которое я обработал для создания сетки (которое я экспортировал в stl), — это LA1. Но как и LA1 есть много разных картинок с одинаковым размером LA1. Мне нужно использовать сетку, созданную как слой для каждого из этих изображений, для последующего расчета площадей, вторых моментов и т. д. (для каждого треугольника). Сетка сама по себе является только описанием программного обеспечения FEM. - person marco; 31.03.2016
comment
Сопоставление этих двух элементов кажется тривиальным, но все же требует немалого поиска, чтобы сделать правильно, с сеткой такого размера, которая может занять довольно много времени, поскольку масштаб неизвестен. Я думаю, что это ваша самая большая проблема, написать быстрый и умный алгоритм, чтобы сопоставить их вместе. Это может уже работать, просто отображая через (max(x_mesh) - min(x_mesh)) / (max(x_image) - min(y_image)), но я не совсем уверен. Вам придется попробовать это на себе. - person Wolph; 02.04.2016
comment
У меня есть несколько вопросов. Наверное я не все понял. Можно ли одновременно нарисовать изображение (LA1) с сеткой? Предполагая, что это возможно, могу ли я, например, экспортировать график в виде изображения в формате png? - person marco; 06.04.2016
comment
Да, вы можете рисовать их одновременно, при условии, что у вас есть сопоставление пикселей изображения с координатами X и Y в сетке. Что касается сохранения изображения в формате png, посмотрите мой предыдущий комментарий относительно savefig - person Wolph; 06.04.2016
comment
Я пытаюсь наложить оба графика, но это сложно. Оси совсем другие, не знаю как сделать. Даже происхождение (0,0) другое! На картинке он вверху, на коллекции внизу. - person marco; 08.04.2016
comment
Верно, именно это делает этот процесс очень трудным. Алгоритмы конечно есть. Некоторые материалы для чтения: en.wikipedia.org/wiki/Image_stitching - person Wolph; 09.04.2016
comment
Попробую, нетривиальная задача! - person marco; 09.04.2016