記事ディレクトリ
この列の合計コード ライブラリ アドレス
https://github.com/xiawei20161308104/xv_opencv_tutorials
このセクションの
xv_opencv_tutorials/VideoRelated/get_started_with_videos.py
xv_opencv_tutorials/VideoRelated/get_and_set_video.py
xv_opencv_tutorials/VideoRelated/save_video.py
公式サイト参照
https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html
0. このセクションに関係する新しい opencv 関数
- デバイスからは、カメラまたはローカルビデオ、ビデオを取得する関数になります
cv.VideoCapture()
❗️この関数は、VideoCapture
orVideoWriter
オブジェクトを作成することであり、実際の読み取りと書き込みは、作成されたオブジェクトを通じて読み取りと書き込みを呼び出すことです。ビデオは、AVI、MP4、MOV などのさまざまな形式にすることができます。これらの形式は、ビデオ ファイルのエンコード方法、解像度、フレーム レート、その他のパラメータを定義します。 - ビデオ書き込み機能
cv.VideoWriter()
- ビデオを読む
cv.VideoCapture.read()
- ビデオを書く
cv.VideoWriter.write(frame)
- 開く、開くかどうかを決定する
isOpened ()
open()
- パラメータの取得、パラメータの変更
cv.VideoCapture.get(propId)
cv.VideoCapture.set(propId, value)
- リリースビデオ
cv.VideoCapture.release()
1. ビデオとは
1️⃣ フレームとは何か、フレームの速度とは何か、それに何が影響するか
ビデオの基本コンポーネントはフレームです。これは、1 秒あたり 30 フレームなどの動的な画像を形成するために、特定のレートで連続的に再生される一連の静止画像です。ビデオの 1 秒あたりのフレーム数はフレーム レート(Frame Rate) と呼ばれ、通常は「fps」(Frames Per Second) で表されます。たとえば、30fps は、ビデオに 1 秒あたり 30 フレームが含まれていることを意味します。フレーム レートはビデオの滑らかさとリアルさを決定します。フレーム レートが高いと、画像がより速く更新されるため、ビデオがよりスムーズに表示されます。たとえば、60fps のビデオは 30fps のビデオよりも滑らかに見えます。さらに、フレーム レートが高くなると、モーションがより正確にキャプチャされるため、ビデオのぼやけやジャダーも軽減されます。ただし、フレーム レートが高くなると、より多くのフレームを処理する必要があるため、ファイルが大きくなり、コーデックがより複雑になります。
全体として、適切なフレーム レートを選択すると、ビデオの視聴エクスペリエンスが向上し、可能な限り最高のビジュアルを確保できます。通常、映画やテレビ番組のフレーム レートは 24 fps または 30 fps ですが、ゲームやアニメーションのフレーム レートは通常 60 fps、現在はそれより高い 120 fps が一般的です。
2️⃣フレームとは何ですか、ビデオ解像度とは何ですか、そして解像度に関連するものは何ですか
各フレームは、色と明るさの情報を含むことができる画像内の最小単位であるピクセルで構成されます。ビデオ解像度は、ビデオ内のフレームあたりのピクセル数を指し、通常は水平ピクセルと垂直ピクセルで表されます。たとえば、解像度が 1920x1080 のビデオは、各フレームに水平 1920 ピクセルと垂直 1080 ピクセルがあることを意味します。解像度はキャプチャおよび再生デバイスによって異なります。
カメラの解像度:カメラの解像度によって、ビデオの各フレームのピクセル数が決まります。高解像度カメラはより多くのピクセルをキャプチャするため、ビデオの解像度が高くなります。
再生デバイスの解像度:再生デバイスの解像度によって、ビデオの最終的な解像度が決まります。ビデオの解像度が再生デバイスの解像度より高い場合、ビデオは再生デバイスに合わせて縮小されるため、画像が歪んだりぼやける場合があります。
2. カメラからビデオを取得します
1️⃣ステップ
- 最初にオブジェクトを作成し
VideoCapture
、そのパラメータはデバイス インデックスまたはビデオ ファイルの名前です。デバイス インデックスはカメラの番号を指定するためにのみ使用されます。通常、ノートブックのデフォルトのカメラを表すには 0 を書き込みます。外部カメラの場合、2 番目のカメラを選択するには 1 を渡す必要があります。 - その後は
逐帧获取
イメージできるようになります。 - 最後に、
释放资源
VideoCapture オブジェクトを作成します。
2️⃣コード
import cv2 as cv
# 创建VideoCapture对象,用创建的对象去做之后的操作
cap = cv.VideoCapture(0)
# 检测有无摄像头正常使用
# 这是一个必要的验证,当cap为空的时候,后续调用会报错。
if not cap.isOpened():
print("Cannot open camera")
exit()
# 获取视频流是一个连续的循环过程,一直在获取,不是说获取到一帧就可以了
while True:
# 通过创建的VideoCapture对象逐帧获取视频,会返回两个参数,ret返回true和false代表是否正常获取到帧,以及视频是否结束
# frame代表获取到的帧
ret, frame = cap.read()
# if frame is read correctly ret is True
if not ret:
print("不能正常读取视频帧")
break
# 将获取到的视频帧,也就是一幅幅图像,转为灰度图
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# 展示
cv.imshow('frame', gray)
# q退出获取视频流
if cv.waitKey(1) == ord('q'):
break
# 释放资源
cap.release()
cv.destroyAllWindows()
3️⃣効果
4️⃣ いくつかの関連するオーバーロードされた関数
VideoCapture
パラメータでは、次のようにファイル パスを選択できます。cv2.VideoCapture('test_video.mp4')
isOpened()
開いているかどうかを確認します。cv.VideoCapture.open
ビデオ ストリームを開くために使用されます。たとえば、cv.VideoCapture.open('test_video.mp4')
デバイスまたはビデオが開いている場合は、次の値が返されます。true
3. opencv を通じてビデオデバイスのパラメータを取得し、新しいパラメータを設定します
1️⃣ デバイスパラメータを取得する
cv.VideoCapture.get( propId )
デバイスパラメータを取得するには、propld は cv2 が提供するパラメータオプションを入力します。公式 Web サイトには、クエリ可能な 70 種類のパラメータが提供されています。戻り値は変更されたパラメータの値です。クエリ パラメータが存在しないかサポートされていない場合、エラーは報告されず、0 が返されます。
ここでは一般的なものをいくつか紹介します。明るさ、彩度などをサポートする必要があるデバイスもいくつかあります。
2️⃣デバイスパラメータを変更する
cv.VideoCapture.set( propId, value )
デバイス パラメーターを propId から value に変更すると、true が返されても無効になる場合があります。有効かどうかは、デバイスのハードウェア、ドライバー、および API バックエンドによって異なります。
propld パラメータ値 | 戻り値 |
---|---|
cv.CAP_PROP_POS_MSEC | ビデオ ファイルの現在位置をミリ秒単位で返します。 |
cv.CAP_PROP_FRAME_WIDTH | ビデオ ストリーム内のフレームの幅を返します。 |
cv.CAP_PROP_FRAME_HEIGHT | ビデオ ストリーム内のフレームの高さを返します。 |
cv.CAP_PROP_FPS | ビデオのフレームレートを返します。 |
cv.CAP_PROP_FRAME_COUNT | ビデオ ファイル内のフレーム数を返します。 |
cv.CAP_PROP_POS_MSEC | ビデオ ファイルの現在位置をミリ秒単位でクエリします。 |
3️⃣ コード
import cv2 as cv
# 创建VideoCapture对象,用创建的对象去做之后的操作
cap2 = cv.VideoCapture(0)
while True:
# 获取设备参数,cv.CAP_PROP_FRAME_WIDTH,CAP_PROP_FRAME_HEIGHT是cv2提供的参数选项
width, height = cap2.get(cv.CAP_PROP_FRAME_WIDTH), cap2.get(cv.CAP_PROP_FRAME_HEIGHT)
# 我这里是1280.0 720.0
print(width, height)
# 以原分辨率的两倍来捕获
cap2.set(cv.CAP_PROP_FRAME_WIDTH, width * 2)
cap2.set(cv.CAP_PROP_FRAME_HEIGHT, height * 2)
_, frame2 = cap2.read()
gray_double = cv.cvtColor(frame2, cv.COLOR_BGR2GRAY)
# 展示
cv.imshow('doubel read', gray_double)
# q退出获取视频流
if cv.waitKey(1) == ord('q'):
break
# 释放资源
cap2.release()
cv.destroyAllWindows()
- 効果:
実際に動作するかどうかはハードウェアに依存するため、明らかに長さは 2 倍になり、幅は変わりません。
4.ビデオを録画して保存します
1️⃣ステップ
- エンコーディング メソッドを定義し、VideoWriter オブジェクトを作成します。パラメータは 5 つあります。VideoWriter (const String &filename、int fourcc、double fps、Size FrameSize、bool isColor=true) は次のとおりです。
- 出力ファイル名 (「output.avi」など)
- 符号化方式 FourCC符号
- フレームレート FPS
- 保存する解像度サイズ
- 最後のものは isColor フラグです。「True」の場合、エンコーダはカラー フレームを予期し、それ以外の場合はグレースケール フレームが使用されます。
- ビデオキャプチャを定義する
- write 関数を実行して、VideoCapture でキャプチャしたコンテンツを、設定されたメソッドに従って指定された場所に書き込みます
2️⃣ コード
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
# 定义编码方式创建VideoWriter对象
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('../imgs/output_video.avi', fourcc, 20.0, (640, 480))
# 当cap打开状态执行
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
# 写入文件
out.write(frame)
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()
3️⃣ 効果
4️⃣ 補足ビデオエンコード方法
视频编码
デジタル メディア デバイスでの保存と送信のために、ビデオ信号をデジタル信号に変換するプロセスです。
一般的なエンコード方法は次のとおりです。
H.264 : H.264 は、AVC (Advanced Videocoding) としても知られる、広く使用されているビデオ コーディング標準です。高品質のビデオ圧縮をサポートし、高解像度のビデオとストリーミング メディアを提供できます。
H.265 : HEVC (高効率ビデオ コーディング) としても知られる H.265 は、H.264 よりも高い圧縮率と優れた画質を提供する新しいビデオ コーディング規格です。
MPEG-2 : MPEG-2 は、デジタル テレビ、DVD、Blu-ray ディスクなどの高解像度ビデオに広く使用されているビデオ エンコード規格です。
MPEG-4 : MPEG-4 は、ビデオ、オーディオ、およびマルチメディア コンテンツをサポートするコーディング標準であり、ストリーミングや Web ビデオにも使用されます。
VP9 : VP9 は Google が開発したビデオコーディング規格で、H.264 よりも優れた圧縮効率と画質を実現し、4K および 8K ビデオをサポートします。
AV1 : AV1 は、より高い圧縮効率とより優れた画質を提供することを目的として、Alliance for Open Media によって開発された次世代のオープン ビデオ コーディング標準です。
FourCC
ビデオ コーデックを識別するために使用される 4 文字のコードで、通常は 4 つの大文字で構成され、ビデオ デコーダとエンコーダを識別するために使用されます。例えば、MPEG−4ビデオフォーマットのFourCCコードは「MP4V」であり、H.264ビデオフォーマットのFourCCコードは「H264」である。FourCC コードのビデオ編集および処理ソフトウェアで好处是
は、ビデオ ファイルを正しく再生および編集し、異なるプラットフォームやアプリケーション間で対話できるように、正しいコーデックを選択できます。