8

プロジェクト: ビデオのすべてのフレームに実行日時のスタンプを追加します。(デジタル ビデオ カメラの結果で、父はタイムスタンプを (ミリ秒単位の解像度で) 永続的にビデオに追加する方法を私に尋ねました。

友人が私に opencv (実際には emgucv) を教えてくれました。私の好みのために、私は Python で opencv を試してみました。

ドキュメントは不十分で、パッケージをインストールするだけでも苦労しました(5時間ほどかかりました)。ソース:

私は Windows 7 x64 で作業しているため、python をダウングレードして numpy で動作させる必要がありました (win64 の numpy バ​​ージョンはありません)。

PyCharm IDE での作業。

インストールの結果、ファイル C:\Python27\Lib\site-packages\cv2.pyd が作成されました

作業を開始するためのドキュメントを見つけようとしていますが、非常に混乱しており、どこから始めればよいかわかりません。すべての例が混乱しています-つまり:

私の質問:

  1. 私は何か間違ったことをしていますか?これはopencvをインストールする方法ではありませんか?
  2. 適切なドキュメントはどこにありますか?
  3. テキストの準備ができているとします (文字列) 誰かが私のアプリケーションの開始を手伝ってくれますか?

ありがとう

4

2 に答える 2

18

OpenCV と Python を使用すると、タスクを比較的簡単に実行できるはずです。あなたは OpenCV を初めて使用するようです。そのため、説明を徹底するよう努めますが、明確にする必要がある場合はお気軽にお尋ねください。

ライブカメラのビデオフィードからデータを取得しているのか、記録された映像を後処理しているのかはわかりません. どちらにしても...

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

capture = cv2.VideoCapture(0)

録画映像を使用する場合:

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

ビデオライタを初期化します。コーデックのヘルプについては、この質問を参照してください。動作するコーデックを見つけるのは簡単ではありません。私も 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.) その他のフォントについては、いくつかあります。簡単な概要については、この質問を参照してください。関連するドキュメントは次のとおりです。

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.
于 2012-09-08T17:45:27.117 に答える
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
于 2012-09-11T08:33:47.570 に答える