2016-06-30 16 views
5

Tôi đang cố gắng sử dụng đầu ra của chức năng lưu lượng quang dày đặc của Opencv để vẽ một biểu đồ rung của các vectơ chuyển động nhưng không thể tìm thấy chức năng thực sự xuất ra. Đây là mã:Đầu ra từ chức năng lưu lượng quang dày đặc của OpenCV (Farneback) là gì? Làm thế nào điều này có thể được sử dụng để xây dựng một bản đồ lưu lượng quang học bằng Python?

import cv2 
import numpy as np 

cap = cv2.VideoCapture('GOPR1745.avi') 

ret, frame1 = cap.read() 
prvs = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY) 
hsv = np.zeros_like(frame1) 

hsv[...,1] = 255 
count=0 

while(1): 
    ret, frame2 = cap.read() 
    next = cv2.cvtColor(frame2,cv2.COLOR_BGR2GRAY) 
    flow = cv2.calcOpticalFlowFarneback(prvs,next,None, 0.5, 3, 15, 3, 10, 1.2, 0) 
    mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1]) 

    hsv[...,0] = ang*180/np.pi/2 
    hsv[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX) 
    rgb = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR) 
    if count==10: 
     count=0 

     print "flow",flow 

    cv2.imshow('frame2',rgb) 
    count=count+1 
    k = cv2.waitKey(30) & 0xff 
    if k == 27: 
     break 
    elif k == ord('s'): 
    prvs = next 

cap.release() 
cv2.destroyAllWindows() 

Đây là mã có hiệu quả như được đưa ra trong hướng dẫn OpenCv về dòng quang dày đặc. Tôi nhận được kết quả sau từ chức năng in:

flow [[[ 0.00000000e+00 0.00000000e+00] 
    [ 0.00000000e+00 0.00000000e+00] 
    [ 0.00000000e+00 0.00000000e+00] 
    ..., 
    [ 0.00000000e+00 0.00000000e+00] 
    [ 0.00000000e+00 0.00000000e+00] 
    [ 0.00000000e+00 0.00000000e+00]] 

..., 
[[ -3.54891084e-14 -1.38642463e-14] 
    [ -2.58058853e-14 -1.54020863e-14] 
    [ -5.56561768e-14 -1.88019359e-14] 
    ..., 
    [ -7.59403916e-15 1.16633225e-13] 
    [ 7.22156371e-14 -1.61951507e-13] 
    [ -4.30715618e-15 -4.39530987e-14]] 

[[ -3.54891084e-14 -1.38642463e-14] 
    [ -2.58058853e-14 -1.54020863e-14] 
    [ -5.56561768e-14 -1.88019359e-14] 
    ..., 
    [ -7.59403916e-15 1.16633225e-13] 
    [ 7.22156371e-14 -1.61951507e-13] 
    [ -4.30715618e-15 -4.39530987e-14]] 

Tôi muốn biết chính xác những giá trị này là gì? Gốc X, Y tọa độ? Các tọa độ X, Y cuối cùng? Đã di chuyển khoảng cách?

tôi có kế hoạch để thử và tìm tọa độ ban đầu và cuối cùng để thực hiện một âm mưu rung động sử dụng mã từ trang sau đây: https://www.getdatajoy.com/examples/python-plots/vector-fields Điều này là do trong python không có chức năng đó tôi nhận thức được rằng âm mưu một bản đồ quang học dòng chảy cho bạn.

Cảm ơn bạn trước!

Trả lời

5

Bạn sắp hoàn tất. Cho phép đầu tiên hãy nhìn vào các calcOpticalFlowFarneback Documentation nó nói có:

flow - hình ảnh dòng chảy tính có kích thước giống như prev và loại CV_32FC2.

Vì vậy, những gì bạn đang thực sự nhận được là ma trận có cùng kích thước với khung nhập của bạn.
Mỗi phần tử trong đó ma trận flow là điểm đại diện cho chuyển của pixel đó từ khung prev. Có nghĩa là bạn nhận được một điểm với các giá trị x và y (trong các đơn vị pixel) cung cấp cho bạn delta x và delta y từ frame cuối cùng.

+1

Tuyệt vời, Cảm ơn bạn. Vì vậy, ma trận dòng chảy sẽ là một ma trận có cùng kích thước với hình ảnh gốc, và các giá trị X và Y được lưu trữ trong nó ở các vị trí nhất định sẽ là khoảng cách X và Y di chuyển đến nơi chúng hiện đang ở. Vì vậy, nếu tôi đã tìm ra nơi họ di chuyển từ tôi chỉ đơn giản sẽ sử dụng vị trí điểm ảnh hiện tại của họ trong ma trận dòng chảy và trừ khoảng cách X và Y họ đi du lịch? –

+0

vâng, chính xác như vậy. –

+0

làm tất cả các thuật toán dòng quang cho đầu ra theo đơn vị pixel? – asdf

Các vấn đề liên quan