私はopencvのac#ラッパーであるEmguを使って簡単なビデオプレイを書いています。
これでビデオを再生できますが、fpsが正確ではなく、通常より少し速いことがわかりました。
私のコードでは、Thread.sleep()
2フレームの間でしばらく待つために使用します。コードは次のとおりです。
int fps = getFromFile(file); // which is 30
while (true) {
var frame = CvInvoke.cvQueryFrame(capture);
if (frame.ToInt32() == 0) break;
Image<Bgr, byte> dest = new Image<Bgr, byte>(Convert.ToInt32(width), Convert.ToInt32(height));
CvInvoke.cvCopy(frame, dest, IntPtr.Zero);
box.Image = dest;
Thread.Sleep(1000 / Convert.ToInt32(fps));
}
どこが間違っているのか、そしてそれを修正する方法は?
アップデート
box
コード内のは、Emgu.UI.ImageBox
スレッドセーフであり、他のスレッドから直接アクセスできます。box.Image = dest