質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

3回答

4604閲覧

C#にてOpenCvSharpでmp4ファイルを保存したい

rojer

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2023/06/25 04:24

実現したいこと

C#でOpenCvSharpを使ってmp4ファイルを保存したい

前提

C#でWebカメラの映像を画像処理するアプリケーションを作っています。

その中の要件の一つとして、Webカメラの映像をmp4で保存する機能があり
VideoWriterを使ってmp4ファイルを作成しようとしていますが、
エラーメッセージも何も出ずに、ファイルが作成されなくて困っています。

一旦、問題切り分けの為に、単純にmp4ファイルを生成するコードを書いて
試してみたところ同じ状況なので、
そもそもVideoWriterの使い方が間違っているのか?
何か他にインストールしておかないといけないものがあるのか?
皆さんのお力を借りたく質問させていただきました。

発生している問題・エラーメッセージ

エラーメッセージは何も表示されていません。

該当のソースコード

問題切り分けの為に、単色のmp4ファイルを出力するだけのコードを試していますが、このコードでもmp4ファイルが作成されません。

C#

1 var redImge = new Mat(256, 256, MatType.CV_8UC3, new Scalar(0, 0, 255)); 2 var writer = new VideoWriter(@"c:\test.mp4", FourCC.MP4V, 30.0, redImge.Size()); 3 4 for(int i=0; i<100;i++) 5 { 6 writer.Write(redImge); 7 } 8 9 writer.Release();

補足情報(FW/ツールのバージョンなど)

VisualStudio 2022
.NET Framework 4.8
OpenCvSharp4 4.7.0.20230115
OpenCvSharp4.Extensions 4.7.0.20230115
OpenCvSharp4.runtime.win 4.7.0.20230115
OpenCvSharp4.Windows 4.7.0.20230115
OpenCvSharp4.WpfExtensions 4.7.0.20230115

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ardin

2023/06/26 01:02

var writer = new VideoWriter(@"c:\test.mp4", FourCC.MP4V, 30.0, redImge.Size()); のサイズ指定のところをnew Size(256, 256)に置き換えたらどうなりますか?
guest

回答3

0

関係ないかもしれませんが、ひょっとしたらということで、参考にして下さい。環境の違いはそれなりに変換して解釈してください。

raspberry pi Debian Bullseye64bit OS でC++にてopencv(4.7.1)を使用し防犯カメラの映像をイベントに同期して保存するアプリケーションを運用しています。当初より、USBCAM のMJPG映像をvideowriterにて、"mp4v"を使用して映像を保存していて、問題はありませんでした。mp4vのコーデックは、h264などに比べて、CPUに対する負荷が比較的軽いので気に入っていました。

しかし、7月初め当りにラズパイのシステム全体のライブラリー更新をしたあたりから赤色のみの映像になり、緑と青の成分が欠落するという不具合が発生しました。そのライブラリー更新にffmpegが含まれていたような気がするのですが、うろ覚えです。元に戻す方法を探索していましたが、うまくいかなかったため、素直にvideowriterのコーデックを"MJPG"に切り替えて中間ファイルとして保存し、別スレッドでffmpegを使用してh264/mp4に変換することにしました。中間ファイルとしてのMJPEGは、ファイルサイズがやや大きいのが気になりますが、どのみち削除するファイルであり、また当面それで解決するので、良しとしています。直接h264に変換する方法もありますが、ラズパイのCPUには負荷が重すぎる、カメラのFPSが犠牲になりやすいというデメリットがあります。カメラ画像はリングバッファーを介してvideowriterへ渡しているので、出力が入力をブロッキングしているわけではありませんが、CPU使用率が高くなった時のopencvそのもののスレッド管理がやり辛い、また別スレッドでffmpegをシステムコールで独立して起動する方が細かい調整がやりやすいという利点もあります。他にもいい方法があるのかもしれませんし、また何かの更新で改善するのかもしれませんが。 とりあえず、部分抜粋を貼り付けます。

// char o_vc[] = "mp4v"; // unitll 2023.07.05, caused by wrong library ? char o_vc[] = "MJPG"; int OUTPUT_CODEC = cv::VideoWriter::fourcc(o_vc[0], o_vc[1], o_vc[2], o_vc[3]); cv::VideoWriter writer; // For open avi file // filepath_avi is <something.avi> writer.open(filepath_avi, CAP_FFMPEG, OUTPUT_CODEC, (int)fps, frm_wrt->img.size()); // when writing is completed writer.release(); // work_avi is <something_work.avi> rename(filepath_avi, work_avi); // another thread strcpy(search_ptn, OUTPUT_FILE_PATH); strcat(search_ptn, "*_work"); strcat(search_ptn, OUTPUT_FILE_EXTENSION); // search_ptn is something_work.avi while( g_run_th_cmprs.load() == true) // if this thread is active ? { if ( glob(search_pnt, 0, NULL, &g) == 0 ) // if the search_ptn is exist ? { strcpy(work_avi, g.gl_pathv[0]); strcpy(output_mp4, work_avi); char* p = output_mp4+ strlen(output_mp4) - 9; strcpy ( p, FFMPEG_OUTPUT_FILE_EXTENSION); // work_avi is something_work.avi // output_mp4 is something.mp4 char ffmpeg_cmd[256] = "/usr/bin/ffmpeg -hide_banner -loglevel quiet -threads:v 1" p = ffmpeg_cmd + strlen(ffmpeg_cmd); sprintf(p, " -r %d -i %s -c:v h264 -r %d -threads:v 2 %s", cap_fps.load(), work_avi, OUTPUT_FPS, output_mp4); system(ffmpeg_cmd); // passing the ffmpeg_cmd to the system call, it will be something like below // system("/usr/bin/ffmpeg -hide_banner -loglevel quiet -threads:v 1 \ // -r 30 -i <saved mjpeg path(.avi)> -c:v h264 -r 30 -threads:v 2 <output path(.mp4)>" );

投稿2023/07/25 02:52

tamaichi

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

OpenCVでmp.4を取り扱うためには、OpenH264のライブラリが必要です。
下記リンクのようなことです。対応済みでしょうか?
https://blog.shikoan.com/opencv-h264/

あとmp4ということですが、MPEG-4 Part 10 ですよね。
FourCC.MP4Vは、MPEG-4 Part 2というガラケー動画とかで使っていた古い規格で
FourCC.X264が、MPEG-4 Part 10だった気がします。
うる覚えで間違っていたらごめんなさい。

投稿2023/06/25 06:26

編集2023/06/25 06:27
naitou

総合スコア141

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rojer

2023/06/25 08:05

コメント、ありがとうございます。 ご指摘の対応していなかったので、OpenH264のDLLをダウンロードして、 実行ファイルと同じディレクトリに配置しましたが、 状況変わらずです。
guest

0

この回答はGPT-4による自動生成回答です

VideoWriterを使用してMP4ファイルを作成する方法は正しいですが、問題が発生している原因は、おそらくFourCCコードが正しく設定されていないためです。FourCC.MP4Vではなく、FourCC.X264を使用してみてください。

以下のコードを試してみてください。

csharp

1using OpenCvSharp; 2 3namespace VideoWriterTest 4{ 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 var redImage = new Mat(256, 256, MatType.CV_8UC3, new Scalar(0, 0, 255)); 10 var writer = new VideoWriter(@"c:\test.mp4", FourCC.X264, 30.0, redImage.Size()); 11 12 for (int i = 0; i < 100; i++) 13 { 14 writer.Write(redImage); 15 } 16 17 writer.Release(); 18 } 19 } 20}

このコードは、赤い画像を含むMP4ファイルを作成します。FourCCコードをFourCC.X264に変更することで、問題が解決するはずです。

投稿2023/06/25 04:25

teratail-ai

Powered by GPT-4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rojer

2023/06/25 05:50

試してみましたが、解決せずでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問