OpenCVではビデオ処理が非常に重要であり、ターゲットリアルタイムトラッキングなどのさまざまなリアルタイム画像処理アルゴリズムはビデオに基づいています。
カメラからビデオを撮る
まず、コンピュータに付属しているカメラを使用してビデオをキャプチャする方法を見てみましょう。通常、ライブストリームをキャプチャするにはカメラを使用する必要があります。OpenCVは、この操作を実行するための非常にシンプルなインターフェースを提供します。カメラからビデオをキャプチャしてみましょう(私はラップトップの内蔵Webカメラを使用しています)。いくつかの機能を理解する必要があります。
上限= cv2.VideoCapture(0)
VideoCapture()のパラメーターは0です。これは、ノートブックの組み込みカメラを開くことを意味し、パラメーターは、ビデオを開くためのビデオファイルパスです(cap = cv2.VideoCapture( "... / test.avi")など)。カメラの場合、1などの他のパラメーターを置き換えて呼び出すことができます。
ret、frame = cap.read()
cap.read()は、フレームごとにビデオフレームを読み取ります。ret、frameは、獲得されたcap.read()メソッドの2つの戻り値です。retがブール値の場合、読み取られたフレームが正しい場合はTrueを返し、ファイルが最後まで読み取られた場合は戻り値がfalseになります。フレームは各フレームの画像であり、3次元のマトリックスです。ビデオは1フレームx 1フレームで構成されていることがわかっています。OpenCVは、画像を処理するときに各フレームの画像をすばやく処理するためのものです。
cv2.waitkey()
waitKey()メソッド自体は、キーボード入力を待機することを意味します。パラメータは1です。これは、画像の次のフレームへの切り替えが1ミリ秒遅れることを意味します。ビデオの場合、パラメータは0です。たとえば、cv2.waitKey(0)は、画像の現在のフレームのみを表示し、ビデオの一時停止と同じです。 、;パラメータが大きすぎる場合(cv2.waitKey(1000)など)、長い遅延のためにスタックしているように感じられます。
cはキーボードで入力されたASCIIコードを取得します。escキーに対応するASCIIコードは27です。つまり、escキーが押されると、条件文が確立されます。
freed()
release()を呼び出してカメラを解放し、destroyAllWindows()を呼び出してすべての画像ウィンドウを閉じます。
次に、最初にコード実験を行い、次にいくつかの説明を行います。
查看普通副本到剪贴板打印?
1. 将numpy导入为np
2. 将cv2导入为cv
3. cap = cv.VideoCapture(0)
4. 如果 不是cap.isOpened():
5. 打印(“无法打开相机” )
6. 出口()
7. 而 True:
8. #逐帧捕获
9. ret,frame = cap.read()
10. # 如果 正确读取帧,ret为True
11. 如果 不退回:
12. 打印(“无法接收帧(流的末尾?)。正在退出...” )
13. 打破
14. #我们对框架的操作来到这里
15. #灰色= cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
16. #显示结果帧
17. cv.imshow('frame' ,灰色)
18. 如果 cv.waitKey(1)== ord('q' ):
19. 打破
20. #完成所有操作后,释放捕获
21. cap.release()
22. cv.destroyAllWindows()
isOpenedは、カメラが開いているかどうかを判断し、開いている場合は続行し、開いている場合は続行し、開いていない場合は自動的に終了します。先に述べたように、フレームはカメラのビデオの各フレームを指します。そのため、表示するときは、各フレームも表示します。画像の各フレームでグレースケール処理が実行される場合、表示されるビデオはグレースケールビデオです。もちろん、グレースケールについてはまだ触れていませんが、最初に小さな実験を行うことができます。コードを見てみましょう。
查看普通副本到剪贴板打印?
1.将numpy导入为np
2.将cv2导入为cv
3.cap = cv.VideoCapture(0)
4.如果 不是cap.isOpened():
5. 打印(“无法打开相机” )
6. 出口()
7.而 True:
8. #逐帧捕获
9. ret,frame = cap.read()
10. # 如果 正确读取帧,ret为True
11. 如果 不退回:
12. 打印(“无法接收帧(流的末尾?)。正在退出...” )
13. 打破
14. #我们对框架的操作来到这里
15. 灰色= cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
16. #显示结果帧
17. cv.imshow('frame' ,灰色)
18. 如果 cv.waitKey(1)== ord('q' ):
19. 打破
20.#完成所有操作后,释放捕获
21.cap.release()
22.cv.destroyAllWindows()
誰もが実験して効果を体験します。たぶん私たちのビデオが実際の状況とは逆になっているように見える人もいるでしょう。これは効果です。この効果を取り消すことができます。ここでは、機能を導入する必要があります。この機能は、後で画像改善セクションでも紹介します。
cv2.flip()
関数プロトタイプ:flip(src、flipCode [、dst])
srcは入力画像を表しています。flipCodeのパラメーターテーブルを見てみましょう。
次に、次のコード行を追加します。
查看普通副本到剪贴板打印?
1.将numpy导入为np
2.将cv2导入为cv
3.cap = cv.VideoCapture(0)
4.如果 不是cap.isOpened():
5. 打印(“无法打开相机” )
6. 出口()
7.而 True:
8. #逐帧捕获
9. ret,frame = cap.read()
10. 框架= cv.flip(框架,1)
11. # 如果 正确读取帧,ret为True
12. 如果 不退回:
13. 打印(“无法接收帧(流的末尾?)。正在退出...” )
14. 打破
15. #我们对框架的操作来到这里
16. 灰色= cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
17. #显示结果帧
18. cv.imshow('frame' ,灰色)
19. 如果 cv.waitKey(1)== ord('q' ):
20. 打破
21.#完成所有操作后,释放捕获
22.cap.release()
23.cv.destroyAllWindows()
もう一度実験すると、画像にはそのような有益な効果がないことがわかります。
ファイルからビデオを再生する
ファイルからのビデオの再生は、カメラのインデックスがビデオファイル名に変更されることを除いて、カメラからキャプチャされたビデオと同じです。また、フレームを表示する際は、適切な時間cv.waitKey()を使用してください。短すぎるとビデオは非常に速くなり、高すぎるとビデオは非常に遅くなります(まあ、これが遅延の表示方法です)。通常の状況では、25秒で十分です。
サンプルコードを与える:
查看普通副本到剪贴板打印?
1.将cv2导入为cv
2.cap = cv.VideoCapture('test.avi' )
3.而 cap.isOpened()
4. ret,frame = cap.read()
5. # 如果 正确读取帧,ret为True
6. 如果 不退回:
7. 打印(“无法接收帧(流的末尾?)。正在退出...” )
8. 打破
9. cv.imshow('frame' ,框架)
10. 如果 cv.waitKey(25)== ord('q' ):
11. 打破
12.cap.release()
13.cv.destroyAllWindows()
ビデオを保存
画像を保存したい場合、それは非常に簡単です。cv2.imwrite()を使用するだけです。また、ビデオを保存する場合は、さらに作業を行う必要があります。
今回はVideoWriterオブジェクトを作成し、出力ファイル名を指定する必要があります(例:output.avi)。次に、FourCCを指定する必要があります。コード(次の段落の詳細)は、1秒あたりのフレーム数(fps)とフレームサイズを渡します。最後はisColorロゴです。Trueの場合、エンコーダーはカラーフレームを必要とします。それ以外の場合は、グレースケールフレームで使用されます。
FourCCは、ビデオエンコーダーと****を指定するために使用される4バイトのコードです。利用可能なコードのリストは、プラットフォームと呼ばれるfourcc.orgにあります。
Fedoraの場合:DIVX、XVID、MJPG、X264、WMV1、WMV2。(XVIDを使用するのが最適です。MJPG。大きなサイズのビデオを生成できますX264は非常に小さなサイズのビデオを提供します)
Windowsの場合:DIVX(テストおよび追加予定)
OSXの場合:MJPG(.mp4)、DIVX(.avi)、X264(.mkv)。
FourCCコードは、cv.VideoWriter_fourcc( "M"、 "J"、 "P"、 "G")またはMJPGのcv.VideoWriter_fourcc(* 'MJPG')として渡されます。
次のコードは、カメラからキャプチャし、各フレームを垂直方向に反転して、ビデオを保存します。
查看普通副本到剪贴板打印?
1.将numpy导入为np
2.将cv2导入为cv
3.cap = cv.VideoCapture(0)
4.#定义编解码器并创建VideoWriter对象
5.fourcc = cv.VideoWriter_fourcc(* 'XVID' )
6.out = cv.VideoWriter('output.avi' ,fourcc,20.0,( 640,480 ))
7.而 cap.isOpened()
8. ret,frame = cap.read()
9. 如果 不退回:
10. 打印(“无法接收帧(流的末尾?)。正在退出...” )
11. 打破
12. 框架= cv.flip(框架,1)
13. #写翻转的框架
14. out.write(框架)
15. cv.imshow('frame' ,框架)
16. 如果 cv.waitKey(1)== ord('q' ):
17. 打破
18.#完成工作后释放所有内容
19.cap.release()
20.out.release()
21.cv.destroyAllWindows()
自分で効果を実証してみることができます。
ビデオ処理の部分は基本的に終わりです。上記の紹介は、将来の学習のための非常に重要な基盤となります。実際、OpenCVのビデオ処理にはさらに多くの操作があります。次に、最後の関数を紹介します。
VideoCapture.get()
以前にcap = cv.VideoCapture(0)を指定しているため、この関数を呼び出すにはcap.get()を使用するだけで済みます。
パラメータは18個ありますが、関連するコードはご自身で試してみてください印刷機能で動画の詳細情報を出力できます。
記事の概要ページを確認してくださいhttps://blog.csdn.net/weixin_44237705/article/details/107864965
openvinoの技術情報はグループで交換できます〜