web-dev-qa-db-ja.com

OpenCVカメラでバッファを無効にする方法は?

OpenCVを使用してカメラの前の顔を検出し、それらの顔に対してMLを実行するこの状況があります。私が抱えている問題は、すべての処理を実行し、次のフレームを取得しようとすると、現在ではなく過去を取得することです。つまり、実際にカメラの前にあるものではなく、バッファ内の内容を読み取ります。処理中にカメラの前に来た顔は気にしないので、今カメラの前にあるものを気にします。

私はバッファサイズを1に設定しようとしましたが、それはかなり役に立ちましたが、それでも少なくとも3つのバッファ読み取りを取得します。 FPSを1に設定しても、この状況を100%解消することはできません。うなり声は私が持っている流れです。

let cv = require('opencv4nodejs');

let camera = new cv.VideoCapture(camera_port);

camera.set(cv.CAP_PROP_BUFFERSIZE, 1);
camera.set(cv.CAP_PROP_FPS, 2);
camera.set(cv.CAP_PROP_POS_FRAMES , 1);

function loop()
{
    //
    //  <>> Grab one frame from the Camera buffer.
    //
    let rgb_mat = camera.read();

    //  Do to gray scale

    //  Do face detection

    //  Crop the image

    //  Do some ML stuff

    //  Do whats needs to be done after the results are in.

    //
    //  <>> Release data from memory
    //
    rgb_mat.release();

    //
    //  <>> Restart the loop
    //
    loop();
}

私の質問は:

バッファーを完全に取り除くことは可能ですか?もしそうなら、どのように。そうでない場合は、whyをいただければ幸いです。

6
David Gatti

同じ問題がありますが、C++です。 OpenCVで適切な解決策が見つかりませんでしたが、回避策を見つけました。このバッファは、一定数の画像、たとえばnフレームを蓄積します。したがって、分析なしでnフレームを読み取って、もう一度フレームを読み取ることができます。その最後のフレームはカメラからのライブ画像になります。何かのようなもの:

buffer_size = n;

for n+1
{
  // read frames to mat variable
}
// Do something on Mat with live image
0
Piotr Kurowski