【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報告↓
状況② 解決方法
上のissueで提案されているCapture.Open()を正しい場所に置けというアプローチは不発
capture.Set(VideoCaptureProperties.FourCC, VideoWriter.FourCC('M', 'J', 'P', 'G'));
を追記することで解決
フォーマットを、これまでちゃんと理解せず使っていたツケが来たのかな…(´・ω・`)
