2014-12-03 6 views
0

저는 파이썬의 opencv 라이브러리에서 함수를 사용하여 손을 움직일 때 빛의 흐름을 얻고 있습니다. 구체적 http://docs.opencv.org/modules/video/doc/motion_analysis_and_object_tracking.html#calcopticalflowfarnebacknumpy의 항목으로 벡터가있는 행렬을 가장 빨리 반복하는 방법

이 함수

flow = cv2.calcOpticalFlowFarneback(prevgray, gray, 0.5, 3, 15, 3, 5, 1.2, 0) 
print flow.shape # prints (480,320,2) 

그래서 흐름은 각각의 엔트리 벡터와 행렬 인 NumPy와 배열을 출력한다. 나는이 행렬을 계량화하는 방법을 원한다. 그래서 L1 Matrix norm (numpy.linalg.norm (flow, 1))을 사용하여 표준 오차에 부적절한 차원을 던진다.

나는 모든 벡터의 유클리드 놈을 계산하고 벡터의 거리를 가진 행렬의 L1 놈을 찾음으로써 이것을 해결하려고 생각하고 있습니다.

효율적으로 플로우 매트릭스를 반복하는 데 문제가 있습니다. 나는 두 개의 for 루프를 사용하여 먼저 컬럼과 그 다음 로우로 진행했지만 너무 느리다. 나는 또한 numpy.nditer하지만

for x in numpy.nditer(flow, op_flags=['readwrite']): 
    print x 

를 사용하여 시도했다

  r,c,d = flow.shape 
      flowprime = numpy.zeros((r,c),flow.dtype) 
      for i in range(0,r): 
       for j in range (0,c): 
        flowprime[i,j] = numpy.linalg.norm(flow[i,j], 2) 
      print(numpy.linalg.norm(flowprime, 1)) 

은 벡터가 아닌 단일 값을 출력합니다.

벡터를 항목으로 사용하여 numpy 행렬을 반복하는 가장 빠른 방법은 무엇입니까? 그런 다음 L1 표준을 사용합니까?

답변

1

numpy 버전 1.9부터 normaxis 인수를 취합니다.

당신이 이상적으로 원하는 것을 말하면 거의 확실하게 numpy에게 물어볼 수 있습니다. 예 : 복잡한 항목이나 누락 된 값이 없다고 가정 할 때 가장 간단한 경우 np.sqrt((flow**2).sum()) 또는 사례로는 np.linalg.norm(np.sqrt((flow**2).sum(axis=-1)),1)이라고 생각합니다.

+0

안녕하세요, 오늘 밤 축 = -1 인수를 살펴봐야 할 것입니다. – RidinAGrvyTrain

관련 문제