うめ研究生のVR開発記

ViveProEyeをUnityで開発したい大学院生です('ω')公式VIVEアンバサダー1期生

【OpenCVsharp】外付けwebカメラを使おうとして解像度の設定で沼った【C#】

計測用アプリを作っているときに、なかなか解決できなかったのでメモ

 

環境

Windows11

C#Visual Studio 2022,Winform .NET

OpenCVsharp

外付けWebcam(ELECOMのやつ↓)

 

状況①

開発初期段階は、ノートPCの内臓カメラを使って動作確認していたので発見が遅れた。

WPFで昔使っていた処理を移植しただけだが、何故かWebカメラで映像取得できない


元コード

//カメラ画像取得用のVideoCaptureのインスタンス生成
var capture = new VideoCapture(0);
var frameSize = new OpenCvSharp.Size(capture.FrameWidth, capture.FrameHeight);
var fps = capture.Fps;

//カメラの接続確認
if (!capture.IsOpened())
{
       System.Windows.MessageBox.Show("Can't use camera.");
       return;
}

IsLoop = true;
using (capture)
using (Mat img = new Mat())
{
       await Task.Run( () =>
       {
              while (IsLoop)
              {
                   capture.Read(img);
                   if (img.Empty()) break;                   
      var image = BitmapConverter.ToBitmap(img);
                   Cam_PictureBox.Invoke(new Action( () =>
                   {
                        Cam_PictureBox.Image?.Dispose();
                        Cam_PictureBox.Image = (Bitmap)image.Clone();
                   }));
              }
       }
}

 

状況① 解決方法

fpsが何故か上手く設定されていなかった。fps=30と直書きすることで改善した。。。が

 

状況②

1920×1080に対応しているWebカメラなのに640×480で出力される。

設定を追加しても、ちゃんと反映されるが、その場合は真っ黒な画面となる

capture.Set(CaptureProperty.FrameWidth, 1920);
capture.Set(CaptureProperty.FrameHeight, 1080);


参考までに同様のissue報告↓

github.com

teratail.com


状況② 解決方法

上のissueで提案されているCapture.Open()を正しい場所に置けというアプローチは不発

capture.Set(VideoCaptureProperties.FourCC, VideoWriter.FourCC('M', 'J', 'P', 'G'));

を追記することで解決

 

フォーマットを、これまでちゃんと理解せず使っていたツケが来たのかな…(´・ω・`)