2017-12-06 2 views
0

PythonでOpenCVを使用してmp4ビデオファイルからオブジェクトを検出しようとしています。私はビデオ内のオブジェクトを検出することができます。PythonでOpenCVを使用してmp4ビデオから検出されたオブジェクトの位置のタイムスタンプを検出します

ビデオファイルでオブジェクトが検出された位置のタイムスタンプを取得し、テキストファイルに書きたいと思います。私はこのようなプロパティの識別子を使用して)VideoCaptureの方法は、(getを使用してみました

import cv2 

my_cascade = cv2.CascadeClassifier('toy.xml') 

def detect(gray, frame): 
    toys= my_cascade.detectMultiScale(gray, 1.3, 5) 
    for (x, y, w, h) in toys: 
     cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2) 
     #Logic to write time stamp to file goes here 
    return frame 

video_capture = cv2.VideoCapture('home.mp4') 
cv2.startWindowThread() 
while True: 
    _, frame = video_capture.read() 
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    canvas = detect(gray, frame) 
    cv2.imshow('Video', canvas) 
    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 
video_capture.release() 
cv2.destroyAllWindows() 

:ここ

は、これまでの私のコードです

video_capture.get(CV_CAP_PROP_POS_MSEC) 

が、エラー名 'CV_CAP_PROP_POS_MSEC' を取得します定義されていません

この方法またはprがないようです実装されたオペレーター識別子。

私が欲しいものを実装するためにcv2に他の方法がありますか?

助けてください。


これは、それがビデオで検出されたオブジェクトの毎回の位置のタイムスタンプを印刷する

を解決しました。 はここで働いコードです:

import cv2 

my_cascade = cv2.CascadeClassifier('toy.xml') 

def detect(gray, frame): 
    toys= my_cascade.detectMultiScale(gray, 1.3, 5) 
    for (x, y, w, h) in toys: 
     cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2) 
     print("Toy Detected at: "+str(video_capture.get(cv2.CAP_PROP_POS_MSEC))) 
    return frame 

video_capture = cv2.VideoCapture('home.mp4') 
cv2.startWindowThread() 
while True: 
    _, frame = video_capture.read() 
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    canvas = detect(gray, frame) 
    cv2.imshow('Video', canvas) 
    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 
video_capture.release() 
cv2.destroyAllWindows() 

答えて

1

CV2が実装プロパティを持っていますが、完全な名前を使用する必要があります。

これは

import cv2 

my_cascade = cv2.CascadeClassifier('toy.xml') 

def detect(gray, frame): 
    toys= my_cascade.detectMultiScale(gray, 1.3, 5) 
    for (x, y, w, h) in toys: 
     cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2) 
     #Logic to write time stamp to file goes here 
    return frame 

video_capture = cv2.VideoCapture('home.mp4') 
cv2.startWindowThread() 
while True: 
    _, frame = video_capture.read() 
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    canvas = detect(gray, frame) 
    print (video_capture.get(cv2.CAP_PROP_POS_MSEC)) 
    cv2.imshow('Video', canvas) 
    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 
video_capture.release() 
cv2.destroyAllWindows() 

はつまり、あなたがクラス cv2.が付けられインスタンス video_captureないジェネリッククラス VideoCaptureとプロパティ名のプロパティをしたい動作するはずです。プロパティ名は、 CAP_PROP_POS_MSECまたは CV_CAP_PROP_MSECのいずれかで、OpenCVのバージョンによって異なります( Can't get VideoCapture property as the property identifier are not defined参照)。

+0

はい、私はそれを変更しましたが、まだエラーが発生します。更新された質問。 – Ram

+0

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューから](/レビュー/低品質の投稿/ 18175262) – WOUNDEDStevenJones

+0

ありがとうございます@Chris Hill。 print(print_capture.get(cv2.CAP_PROP_POS_MSEC))の回りに中カッコを入れる必要がありました。これは動作します! – Ram

関連する問題