2015-11-11 14 views
13

का उपयोग करके विशिष्ट फ्रेम पढ़ें VideoCapture() विधि का उपयोग कर एक विशिष्ट फ्रेम प्राप्त करने का कोई तरीका है?ओपनसीवी/पायथन: वीडियो कैप्चर

मेरे वर्तमान कोड है:

import numpy as np 
import cv2 

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

This मेरे संदर्भ ट्यूटोरियल है।

उत्तर

16

धन्यवाद जीपीपीके।

वीडियो पैरामीटर को पूर्णांक के रूप में दिया जाना चाहिए। प्रत्येक ध्वज का अपना मूल्य होता है। कोड के लिए here देखें।

सही समाधान है:

import numpy as np 
import cv2 

#Get video name from user 
#Ginen video name must be in quotes, e.g. "pirkagia.avi" or "plaque.avi" 
video_name = input("Please give the video name including its extension. E.g. \"pirkagia.avi\":\n") 

#Open the video file 
cap = cv2.VideoCapture(video_name) 

#Set frame_no in range 0.0-1.0 
#In this example we have a video of 30 seconds having 25 frames per seconds, thus we have 750 frames. 
#The examined frame must get a value from 0 to 749. 
#For more info about the video flags see here: https://stackoverflow.com/questions/11420748/setting-camera-parameters-in-opencv-python 
#Here we select the last frame as frame sequence=749. In case you want to select other frame change value 749. 
#BE CAREFUL! Each video has different time length and frame rate. 
#So make sure that you have the right parameters for the right video! 
time_length = 30.0 
fps=25 
frame_seq = 749 
frame_no = (frame_seq /(time_length*fps)) 

#The first argument of cap.set(), number 2 defines that parameter for setting the frame selection. 
#Number 2 defines flag CV_CAP_PROP_POS_FRAMES which is a 0-based index of the frame to be decoded/captured next. 
#The second argument defines the frame number in range 0.0-1.0 
cap.set(2,frame_no); 

#Read the next frame from the video. If you set frame 749 above then the code will return the last frame. 
ret, frame = cap.read() 

#Set grayscale colorspace for the frame. 
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 

#Cut the video extension to have the name of the video 
my_video_name = video_name.split(".")[0] 

#Display the resulting frame 
cv2.imshow(my_video_name+' frame '+ str(frame_seq),gray) 

#Set waitKey 
cv2.waitKey() 

#Store this frame to an image 
cv2.imwrite(my_video_name+'_frame_'+str(frame_seq)+'.jpg',gray) 

# When everything done, release the capture 
cap.release() 
cv2.destroyAllWindows() 
+0

'अजगर में 3.5'' cap.set() 'का उपयोग कर, पहले तर्क रेंज 0.0-1.0 में फ्रेम संख्या को परिभाषित करता है। तो यह 'cap.set (1, frame_no)' है। – zinon

+1

cap.set() में पहला तर्क 'cv2.cv.CV_CAP_PROP_POS_FRAMES' होना चाहिए बिना किसी जादू '1' या '2'। दूसरा श्रेणी 0 - cv2.cv.CV_CAP_PROP_FRAME_COUNT में फ्रेम संख्या है - यह एक पूर्णांक संख्या है, 0.0 - 1.0 नहीं फ्लोट! –

9

जब आप एकदम सही फ्रेम चाहते हैं, आप सिर्फ इतना है कि फ्रेम करने के लिए VideoCapture सत्र सेट कर सकते हैं। स्वचालित रूप से उस फ्रेम पर कॉल करने के लिए यह अधिक सहज है। "सही" समाधान के लिए आपको ज्ञात डेटा इनपुट करने की आवश्यकता होती है: जैसे fps, length, और whatnot। आपको नीचे दिए गए कोड के साथ जानने की जरूरत है वह फ्रेम है जिसे आप कॉल करना चाहते हैं।

import numpy as np 
import cv2 
cap = cv2.VideoCapture(video_name) #video_name is the video being called 
cap.set(1,frame_no); # Where frame_no is the frame you want 
ret, frame = cap.read() # Read the frame 
cv2.imshow('window_name', frame) # show frame on window 

आप खिड़की धारण करने के लिए, जब तक आप बाहर निकलें प्रेस चाहते हैं:

while True: 
    ch = 0xFF & cv2.waitKey(1) # Wait for a second 
    if ch == 27: 
     break 
+1

'cap.set (1, frame_no)' में 1 क्या है? – Moondra

+0

नीचे दिए गए मेरे उत्तर पर एक नज़र डालें। –

5

हाँ, यह बहुत सीधे आगे है:

import cv2 
cap = cv2.VideoCapture(videopath) 
cap.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, frame_number-1) 
res, frame = cap.read() 

'frame_number' रेंज 0 में एक पूर्णांक है ... amount_of_frames। नोटिस: आपको फ्रेम 'frame_number' पढ़ने के लिए 'frame_number-1' सेट करना चाहिए। यह अच्छी तरह से प्रलेखित नहीं है लेकिन परीक्षण से पता चलता है कि VideoCapture मॉड्यूल का व्यवहार।

'res' ऑपरेशन का बुलियन परिणाम है, कोई यह जांचने के लिए इसका उपयोग कर सकता है कि फ्रेम सफलतापूर्वक पढ़ा गया था या नहीं। एक से तख्ते की राशि प्राप्त कर सकते हैं:

amount_of_frames = cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT) 
+2

'cv2.cv.CV_CAP_PROP_FRAME_COUNT' मेरे लिए उपलब्ध नहीं था। मुझे लगता है कि 'cv2.CAP_PROP_FRAME_COUNT' – user3731622

+2

मुझे लगता है कि आप सीवी 3.x का उपयोग कर रहे हैं। ओपनसीवी 3.x सीवी 2 मॉड्यूल के भीतर और सीवी_ उपसर्ग के बिना उन स्थिरांक को परिभाषित करता है। Opencv 2.x उन्हें cv2.cv मॉड्यूल के भीतर और सीवी_ उपसर्ग के साथ परिभाषित करता है। –

संबंधित मुद्दे