EmguCv でビットマップ (ウェブカメラから取り込まれたもの) にアクセスするには、2 つの異なるスレッドでロックを取得する必要があります。カメラにクエリを実行し、返されたものを.NETビットマップに配置する「GetFrame」関数があります。このビットマップにアクセスする必要があるスレッドが 2 つあります。1 つはビットマップに書き込み、ビットマップを画像ボックスに割り当てる必要があり、もう 1 つはビットマップを読み取り、それを Image オブジェクトに変換して EMGU ImageBox に割り当てる必要があります。最初に任意のオブジェクトをロックしてから、操作を行います。コードは次のとおりです (_Camera.LiveFrame はビットマップです)。
書き込み/読み取りスレッド:
while (_CaptureThreadRunning)
{
lock (_Camera)
{
// _Camera.GetFrame writes to the Bitmap
if (_VideoPlaying && _Camera.GetFrame(500))
pbLiveFeed.Invalidate();
}
}
_Camera.CloseCamera(true);
_CaptureExitEvent.Set(); // Set to signal captureThread has finished
読み取り/ImageBox スレッド:
while (_ProcessThreadRunning)
{
lock (_Camera)
{
// _Camera.LiveFrame is the Bitmap
procImage = new Image<Bgr, int>((Bitmap)_Camera.LiveFrame.Clone());
procImage.Draw(new Rectangle(10,20,20,15),new Bgr(Color.LightGreen), 5);
ibProcessed.Image = procImage;
ibProcessed.Invalidate();
}
}
_ProcessExitEvent.Set();
ほとんどの場合、これは正常に実行されますが、ビットマップを Clone() しようとすると、「オブジェクトは別の場所で使用されています」というエラーが時々発生します。これは正しいロック方法ではありませんか?なぜこれが問題を引き起こすのかわかりません。
ps。私のスレッドも正常に終了できなくなりました。ループ外の .Set() 呼び出しは呼び出されません。スレッドがデッドロックしていると思いますか?