2012-12-03 11 views
8

बहुत धन्यवाद, अगर कोई भी मेरी मदद कर सकता है। इम कोशिश,, पुस्तक "अजगर के साथ जहाजों प्रोग्रामिंग कंप्यूटर विजन" का एक उदाहरण का उपयोग पृष्ठ के अंत में 216.ओपनसीवी पायथन कैल्क ऑप्टिकलफ्लोफ़र्नबैक

#!/usr/bin/env python 

import cv2 
def draw_flow(im,flow,step=16): 
    h,w = im.shape[:2] 
    y,x = mgrid[step/2:h:step,step/2:w:step].reshape(2,-1) 
    fx,fy = flow[y,x].T 

    # create line endpoints 
    lines = vstack([x,y,x+fx,y+fy]).T.reshape(-1,2,2) 
    lines = int32(lines) 

    # create image and draw 
    vis = cv2.cvtColor(im,cv2.COLOR_GRAY2BGR) 
    for (x1,y1),(x2,y2) in lines: 
     cv2.line(vis,(x1,y1),(x2,y2),(0,255,0),1) 
     cv2.circle(vis,(x1,y1),1,(0,255,0), -1) 
    return vis 


cap = cv2.VideoCapture(0) 

ret,im = cap.read() 
prev_gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 

while True: 
    # get grayscale image 
    ret,im = cap.read() 
    gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 

    # compute flow 
    #flow = cv2.calcOpticalFlowFarneback(prev_gray,gray,None,0.5,3,15,3,5,1.2,0) 
    flow = cv2.calcOpticalFlowFarneback(prev_gray,gray,float(0),float(0),3,15,3,5,float(1),0) 
    prev_gray = gray 

    # plot the flow vectors 
    cv2.imshow('Optical flow',draw_flow(gray,flow)) 
    if cv2.waitKey(10) == 27: 
     break 

इम टर्मिनल में निष्पादित (LXUbuntu, lxterminal) और मैं पालन त्रुटि मिलती है:

VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
Traceback (most recent call last): 
    File "hw.py", line 35, in <module> 
    flow = cv2.calcOpticalFlowFarneback(prev_gray,gray,None,0.5,3,15,3,5,1.2,0) 
TypeError: a float is required 

मैं समझता हूं कि समस्या calcOpticalFlowFarneback में है, क्योंकि इसे फ्लोट में एक संख्या की आवश्यकता है, इसलिए, मैं calcOpticalFlowFarneback (prev_gray, ग्रे, कोई नहीं, फ्लोट (0.5), 3,15,3,5, फ्लोट (1.2)), 0) लेकिन काम नहीं करते हैं।

बहुत बहुत धन्यवाद।

+0

का उपयोग करना चाहिए "एक नाव की आवश्यकता है" शायद गैर की चर्चा करते हुए किया जाएगा तर्क सूची में फ्लोट, गैर-int तर्क .. – asheeshr

उत्तर

13

आपको कोड को थोड़ा सा बदलने की जरूरत है।

सबसे पहले, mgrid, int32, vstack जैसी विधियों के बाद से, Numpy लाइब्रेरी शामिल हैं, numpy फ़ंक्शंस हैं।

तो कोड के शीर्ष पर, जोड़ें:

from numpy import * 

दूसरा, अपने प्रश्न के लिए आ रहा है, चौथे तर्क एक int होना चाहिए। आपने इसे फ्लोट के रूप में आपूर्ति की है। इसे 1 (या 3, जैसा आप चाहें) बनाओ। और अंतिम तर्क खुद ही आउटपुट है। आपको इसकी आवश्यकता नहीं है तो इसे हटा दें।

तो मेरा अंतिम बयान नीचे की तरह लग रहे (और यह मेरे लिए ठीक काम करता है):

flow = cv2.calcOpticalFlowFarneback(prev_gray,gray,0.5,1,3,15,3,5,1) 

इस प्रयास करें, और मुझे पता है किसी भी त्रुटि आता है करते हैं।

2

जब मैं समारोह आह्वान इस प्रकार, निम्न त्रुटि संदेश प्रदर्शित होता है:

flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0) 

त्रुटि:

flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0) 
TypeError: a float is required 

जब मैं मूल्य None हटाने के बाद फिर मेरा कार्यक्रम सही ढंग से काम करता है:

flow = cv2.calcOpticalFlowFarneback(prvs, next, 0.5, 3, 15, 3, 5, 1.2, 0) 

फ़ंक्शन calcOpticalFlowFarneback() आकार लेता है:

cv2.calcOpticalFlowFarneback(prev, next, pyr_scale, levels, winsize, iterations, poly_n, poly_sigma, flags[, flow]) → flow 

ऐसा लगता है कि हम पैरामीटर pyr_scale के लिए None का मूल्य पारित नहीं करना चाहिए। हम पैरामीटर flow पर None पास कर सकते हैं।

  • pyr_scale: एक पैरामीटर, छवि पैमाने (< 1) प्रत्येक छवि के लिए पिरामिड के निर्माण के लिए निर्दिष्ट करने; pyr_scale = 0.5 का अर्थ शास्त्रीय पिरामिड है, जहां प्रत्येक अगली परत पिछले एक की तुलना में दोगुनी छोटी है।

  • flow: गणना की गई फ्लो छवि जिसका आकार prvs जैसा है और CV_32FC2 टाइप करें।

+0

जैसा कि उन्होंने नोट किया, यह असंबंधित टिप्पणी है, हालांकि यहां ऐसा क्यों हो रहा है: क्योंकि फ़ंक्शन पायथन 2 और पायथन 3 में विभिन्न मानकों को स्वीकार करता है। इसलिए, सुनिश्चित करें कि आप अपने पर्यावरण से मेल खाने वाले मैन्युअल को पढ़ रहे हैं। आप इसे cv2.cv .__ संस्करण__ के साथ देख सकते हैं – GrigorisG

3

@sunside

flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0) 

cv2.calcOpticalFlowFarneback(prev, next, flow, pyr_scale, levels, winsize, iterations, poly_n, poly_sigma, flags) → flow 

है opencv3.x ग्राम, alose opencv3.x doc

अन्यथा

देखें:

flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0) 
TypeError: a float is required 

cv2.calcOpticalFlowFarneback(prev, next, pyr_scale, levels, winsize, iterations, poly_n, poly_sigma, flags[, flow]) 

आप opencv2.x में समाप्त हो चुकी थी चाहिए, यह हो सकता है इस तरह जोर दिया:

import cv2 
print cv2.__version__ 

देखें opencv2.x doc

1

आप python3 उपयोग करते हैं, सम्मिलित में def draw_flow

y, x = np.mgrid[step/2:h:step, step/2:w:step].reshape(2,-1).astype(int) 
flow = cv2.calcOpticalFlowFarneback(prevgray, gray, None, 0.5, 3, 15, 3, 5, 1.2, 0) 

अजगर 2 के लिए आप

y, x = np.mgrid[step/2:h:step, step/2:w:step].reshape(2,-1) 
flow = cv2.calcOpticalFlowFarneback(prevgray, gray, 0.5, 3, 15, 3, 5, 1.2, 0) 
संबंधित मुद्दे