3

ナンバー プレートを追跡するプログラムを開発しようとしています。プレートを追跡し、ID 番号でマークする必要があるため、すべてのプレートに対して認識プログラムを 1 回だけ呼び出すことができます。追跡に問題があります。ナンバー プレート領域の検出に成功したら、マスクを作成してプレートからのみ特徴を抽出し、画像全体でそれらを追跡します。goodFeaturesToTrack()でオプティカルフローを使用して計算しcalcOpticalFlowPyrLK()ます。これは私のアルゴリズムです:

  1. カメラからフレームを取得します。
  2. ナンバー プレートを見つけます。
  3. ナンバー プレート領域から特徴を抽出します。
  4. カメラから次のフレームを取得します。
  5. フレームから特徴を抽出します。
  6. calcOpticalFlowPyrLK() を呼び出す
  7. ナンバー プレートから機能の少なくとも半分を正常に追跡する一方で、追跡を行い、機能を次の機能と交換します。

コード(一部のみ):

bool licensePlate = false;

while(1)
{
    frame = cvQueryFrame(cap);
    if(frame.empty()) 
        break;

    cvtColor(frame, frame, CV_BGR2GRAY);

    // We have license plate area
    if (licensePlate)
    {
        frame.copyTo(image_next);
        goodFeaturesToTrack(image_next, next_features, 50, 0.01, 0.1);
        calcOpticalFlowPyrLK( image_previous, image_next, features, next_features, features_found, err );
        swap(features, next_features);
    }

    // We try to obtain license plate area
    if (!licensePlate)
    {
        squares = findLicensePlate(image);
        if (!squares.empty())
        {
            // We have found license plate area
            licensePlate = true;
            frame.copyTo(image_previous);
            Mat roi (mask, Rect(bb.x, bb.y, bb.width, bb.height));
            roi.setTo(255);
            goodFeaturesToTrack(image_previous, features, 50, 0.01, 0.1, mask);
            mask.setTo(0);
        }
    }
}

出力は次のとおりです。

ここに画像の説明を入力

緑色の点は以前の機能で、赤色の点は実際の機能です。

ご覧のとおり、何とか追跡されていますが、スケーリングされており、ナンバー プレートから遠く離れているように見えます。ナンバー プレートから 1 回だけ特徴を抽出し、次にフレームからのみ特徴を抽出したいと考えています。私の論理はどこか間違っています。ここで何が問題になる可能性がありますか?

4

0 に答える 0