2012-09-05 20 views
8

プロジェクト:ビデオの各フレームごとに実行日時スタンプを追加します。 (デジタルビデオカメラの結果、私の父は私に、どのようにタイムスタンプを(ミリ秒の分解能で)永久にビデオに追加できるのか尋ねました。友人は私のopencv(実際にはemgucv) 。私は、ドキュメントはラメで、私はパッケージをインストールする(5時間かそこらのように私を取った)にも苦労していたOpenCV 2.4 in python - ビデオ処理

PythonでOpenCVのと私の運を試してみました 出典:。

win64のnumpyバージョン)

PyCharm IDEでの作業

結果のインストールは、ファイルC持っている私を得た:私は作業を開始するためのドキュメントを見つけようとしています\ Python27 \ Libの\のsite-packages \ cv2.pyd

を、私は非常に混乱していますし、持っていません開始する場所を手掛かり、すべての例が混乱している - すなわち:http://docs.opencv.org/doc/user_guide/ug_mat.html

  • 例のpythonのためのものに近い合理的ではないようだ。

    私の質問:

    1. 私が何か間違ったことをやっていますか?これはopencvをインストールする方法ではありませんか?
    2. 良い文書はどこにありますか?
    3. テキストを準備して(文字列で)、誰かが私のアプリケーションの開始を手助けしようとすることができますか?

    おかげ

  • +1

    が可能な代替としてのようSimpleCV(http://simplecv.org/docs/)に見て。 – Blender

    +0

    私はそれを試みますが、私はすでに彼らのウェブサイトを概観しました。私は対話型シェルのことを実際に理解していません(私はそれを使う必要がありますか?私はPythonスクリプトを通してしか動かすことはできませんか?) –

    +0

    私は対話型シェルを使用しません。ドキュメンテーションは機能が存在することを示すためのものですが、残りの機能はかなり自明です。 – Blender

    答えて

    18

    あなたの仕事は、OpenCVのとPythonを使って達成することは比較的容易でなければなりません。あなたはOpenCVの初心者だと思われますので、私は自分の解説を徹底させていきますが、明快さが必要かどうか質問してください。

    ライブカメラビデオフィードからデータを取得しているのか、録画済み画像を後処理しているのかわかりません。いずれにせよ...

    データを取得します。 ライブフィードを使用している場合:

    capture = cv2.VideoCapture("your_reading_file.avi") 
    

    初期化映像作家:

    capture = cv2.VideoCapture(0) 
    

    記録映像を使用している場合。 at this questionのコーデックに関するヘルプを参照してください。動作するコーデックを見つけることは簡単なことではありません。私もWindows 7 x64を使用しています。下記のコーデックだけが私のために働いていました。また、変数fpsを実際の入力ビデオフレームレートにできるだけ近い値に設定します。フレーム書き込みを開始した後は変更できません。

    flag, frame = capture.read() # **EDIT:** to get frame size 
    width = np.size(frame, 1) #here is why you need numpy! (remember to "import numpy as np") 
    height = np.size(frame, 0) 
    writer = cv2.VideoWriter(filename="your_writing_file.avi", 
    fourcc=cv2.cv.CV_FOURCC('I', 'Y', 'U', 'V'), #this is the codec that works for me 
    fps=15, #frames per second, I suggest 15 as a rough initial estimate 
    frameSize=(width, height)) 
    

    このデータを処理してテキストを追加します。最後に、編集したフレームをビデオファイルに書き込みます。

    while True: 
        flag, frame = capture.read() #Flag returns 1 for success, 0 for failure. Frame is the currently processed frame 
    
        if flag == 0: #Something is wrong with your data, or the end of the video file was reached 
         break 
        x = width/2 
        y = height/2 #change to the desired coordinates 
        text_color = (255,0,0) #color as (B,G,R) 
        cv2.putText(frame, "your_string", (x,y), cv2.FONT_HERSHEY_PLAIN, 1.0, text_color, thickness=1, lineType=cv2.CV_AA) 
    
        writer.write(frame) #write to the video file 
    

    同様に簡単です!私はほぼ毎日ビデオファイルにテキストを書き込むために上記のコードを使用しているので、間違いなく動作します。私が予見できる唯一の潜在的な問題は、残念なことに多くのことを知らないコーデックです。私はこれがあなたの問題を解決するかもしれないことを願って、より多くの質問をしてください。

    編集:コメントの質問に回答してください。

    1.)私が知る限り、OpenCVで非圧縮形式を使用する必要があるため、.aviのみを使用できます。私は他の(圧縮された)フォーマットを使用する知識は持っていません。たぶん、サードパーティのプログラムを使用して変換前/変換後に行うことはできますか? frame例外の理由は私の間違いでした。私は、欠落した行を含めるように答えを編集しました。

    2.)私はメタデータの読み方がわかりません。私が知っていれば、私はあなたに知らせるでしょう。ビデオフレームレートを見つけるための自分のハックな解決策は、平均フレームレートを計算するためにTimeモジュールを使用して、OpenCVにビデオを1回実行させることです。この推定値は、ビデオファイルを書き込むときに使用できます。

    3.)結果ビデオのサイズはいくつかの要因によって大きく異なる場合があります。最も重要なことは、選択したfpsが実際の元のフレームレートにどれくらい近いかということです。

    4.他のフォントについては、いくつかのものがあります。私は簡単な概要についてはthis questionを参照することができます。

    fontFace – Font type. One of FONT_HERSHEY_SIMPLEX, 
    FONT_HERSHEY_PLAIN, 
    FONT_HERSHEY_DUPLEX, 
    FONT_HERSHEY_COMPLEX, 
    FONT_HERSHEY_TRIPLEX, 
    FONT_HERSHEY_COMPLEX_SMALL, 
    FONT_HERSHEY_SCRIPT_SIMPLEX, or 
    FONT_HERSHEY_SCRIPT_COMPLEX, 
    where each of the font ID’s can be combined with FONT_HERSHEY_ITALIC to get the slanted letters. 
    
    +0

    素晴らしい!これは私が必要とするものに非常に近いです。 1.なぜAVIファイルのみを開くことができるのですか?(フレームの幅/高さを読み取ろうとすると例外がスローされます)2.ファイルのメタデータを読み込むにはどうすればよいですか? 3.結果のビデオが3倍または4倍大きくなる(もちろん、フレームではなく、スペース)4.フォントには何がありますか? –

    +0

    あなたの新しい質問のいくつかを含めるように私の回答を編集しました。元のコードに間違いがありましたが、修正されています。まだ不明な点があればお尋ねください! – casper

    +0

    お元気ですか?私はビデオの音声に何が起こっているのかわかりません。 –

    1

    は(フレームレート、高さと幅を含むビデオファイルのメタデータを読み取るためにhachoir-metadataを使用し

    インポート:ここに関連する文書がある。

    from hachoir_core.error import HachoirError 
    from hachoir_core.cmd_line import unicodeFilename 
    from hachoir_parser import createParser 
    from hachoir_core.tools import makePrintable 
    from hachoir_metadata import extractMetadata 
    from hachoir_core.i18n import getTerminalCharset 
    from hachoir_metadata.metadata_item import QUALITY_BEST 
    

    機能:

    def metaDataFile(filePath): 
        filename, realname = unicodeFilename(filePath), filePath 
        parser = createParser(filename, realname) 
        try: 
         metadata = extractMetadata(parser, QUALITY_BEST) 
        except HachoirError, err: 
         print "Metadata extraction error: %s" % unicode(err) 
         metadata = None 
        if not metadata: 
         print metadata 
         print "Unable to extract metadata" 
         exit(1) 
        return metadata 
    

    用途:

    関連するプロパティを参照する
    metadata = metaDataFile(videoPath) 
    width = metadata.get('width') 
    height = metadata.get('height') 
    fps = metadata.get('frame_rate') 
    

    for data in sorted(metadata): 
        if len(data.values) > 0: 
         print data.key, data.values[0].value