2016-11-01 7 views
2

я работал с функцией (Python, Numpy, OpenCV3) над изображением, и это пример вывода я -Почему HoughLinesP выводит 3D-массив вместо 2D-массива?

[[[539 340 897 538]] 

[[533 340 877 538]] 

[[280 460 346 410]] 

[[292 462 353 411]] 

[[540 343 798 492]]] 

Его размер (5,1,4)

I я пытаюсь понять, какой сценарий будет выводить функцию (5,2,4) или (5,3,4). Но я не могу думать о каких-либо изображениях, с которыми я работал сейчас, это трехмерный массив с числом столбцов как 1.

Не мог бы быть только 2D-массив и, возможно, более эффективным?

+0

потому что в openCV первые два измерения - это матрица, а третье измерение - размер элемента. Таким образом, обычно все 1D выходы в openCV представляют собой Nx1 2D-матрицы. с другим измерением для типа элемента (например, 1d для значений пикселей по шкале серого или значений расстояния поплавка, 2D для координат точек, 3D для значений rgb, 4D для пар точек или значений rgba и т. д.), поэтому часть Nx1 является из-за оптимизации для изображения, которые представляют собой 2D-матрицы с mD-пикселями в каждом элементе. – Micka

ответ

3

Я спросил на OpenCV Q & А и получил следующий ответ -

OpenCV является C++ библиотека, а питон обертки генерируется автоматически от некоторых сценариев, так и в C++ мы имеют:

векторные линии; чтобы сохранить результаты.

Сейчас, к сожалению, Vec4i является потомком Matx, который на самом деле 2D-вещь, так что в питоне вы получите:

[#ONE для вектора

[#ONE для 1-го тусклым из Vec4i (1, довольно бесполезно, правда :)

[#one для 2-го тусклым из Vec4i (4 элемента)

снова, я думаю, вы просто придется жить с этим.

1

Если вы не хотите, дополнительное измерение и так как это 1, просто используйте отжимают

>>> a = np.arange(5*4).reshape(5,1,4) 
>>> a 
array([[[ 0, 1, 2, 3]], 

     [[ 4, 5, 6, 7]], 

     [[ 8, 9, 10, 11]], 

     [[12, 13, 14, 15]], 

     [[16, 17, 18, 19]]]) 
>>> a.squeeze() 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15], 
     [16, 17, 18, 19]]) 

Иногда дополнительная ось пригождается

a.swapaxes(1,2) 
array([[[ 0], 
     [ 1], 
     [ 2], 
     [ 3]], 
    ... Snip 
     [[16], 
     [17], 
     [18], 
     [19]]]) 

в свете обновления и предполагая, что первый необходимо, чтобы один из них возвращал те же результаты, если дополнительный размер не нужен.

>>> a[0].squeeze() 
array([0, 1, 2, 3]) 
>>> a.squeeze()[0] 
array([0, 1, 2, 3]) 
+0

Спасибо. Это полезно. Но я все еще удивляюсь, зачем это 3D. Любая идея о том, почему он не был реализован для вывода 2D-массива? – sj22

+0

Я не знаю, что он делает конкретно, но я столкнулся с этим раньше, когда выдается дополнительное измерение 1 как (1,5,4) – NaN