2014-03-27 4 views
1

다음 코드를 파이썬으로 작성했습니다. 그것은 이미지를 취하고 기본적으로 그것을 극좌표에서 직교 좌표로 변환합니다. 효과는 이미지가 점에 대해 펼쳐지는 것입니다.반복적 인 프로세스를 벡터화

def unravel(img, origin): 
    max_radius = min(origin) 

    out = np.zeros((max_radius,720,3), np.uint8) 

    for phi in range(0,720): 
    for r in range(0, max_radius): 
     target = cmath.rect(r,math.radians(phi/2)) 
     out[(r,phi)] = img[(max_radius + target.real, max_radius+target.imag)] 
    return out 

이 알고리즘은 실제로 느립니다. 라이브 비디오에서 작동하려면이 기능이 정말로 필요합니다. 이상적으로 기본 계산이 파이썬 루프가 아닌 C로 수행되도록하기 위해 이것을 '행렬 화'할 수 있기를 바랍니다. 나는 특히 이것을하는 경험이 없다; 가장 좋은 방법은 뭔가요?

+1

유용 할 수 있습니다. http://en.wikipedia.org/wiki/List_of_common_coordinate_transformations#To_Cartesian_coordinates_from_polar_coordinates – Hamish

답변

0

가능한 접근 방식은 사전에 인덱스의 적절한 세트를 생성하고 변환 NumPy와의 이미지 마법을 사용하는 것입니다, 당신의 질문을 확장하고있는 GStreamer 태그를 추가하는 시도 할 수 :

import numpy as np 

img = np.random.rand(140,100) # my sample image 

img_n,img_m = img.shape # dimensions of image 
p_n, p_m = int(np.ceil(np.linalg.norm(img.shape))), 360*2 # dimensions for out array 
cc = [img_n/2, img_m/2] # origin for polar coordinates 

# Generate sets of indexes of the polar array (do this only once): 
X,Y = np.meshgrid(np.arange(img_m), np.arange(img_n)) 
Z = (X - cc[0]) + 1j*(Y-cc[1]) # create complex array of image coordinates 
r,phi = np.abs(Z), np.angle(Z) + np.pi 
rc = np.array(np.rint(r), dtype=int) # radial indexes 
phic = np.array(np.rint(phi*(p_m-1)/(2*np.pi)), dtype=int) # angular indexes 

# Do the the conversion: 
out = np.zeros((p_n, p_m)) 
out[rc, phic] = img # utilize numpy's index magic 

동영상에 그런 일을하는 것은 나에게는 드문 일입니다. 기능 추출과 같은 작업을 수행하려는 경우 Hough transform과 같은 다른 기술도 있습니다.

1

약간 높은 수준이지만 매트릭스 변환으로 비디오를 스트리밍 할 수 있도록하려면 손을 더러워야합니다. 이것은 현재의 접근 방식으로 합리적으로 할 수있는 것이 아닙니다.

아마도 가장 접근하기 쉬운 방법은 GStreamer을 맞춤 플러그인과 함께 사용하는 것입니다. 파이프 라이닝을 시작하려면 python bindingsuseful tutorials이 있습니다. geometrictransform 플러그인 (또는 이미 원하는대로 할 수도 있음)에서 많이 빌리고 싶을 수도 있습니다.

또한 등