ナンバー プレートを追跡するプログラムを開発しようとしています。プレートを追跡し、ID 番号でマークする必要があるため、すべてのプレートに対して認識プログラムを 1 回だけ呼び出すことができます。追跡に問題があります。ナンバー プレート領域の検出に成功したら、マスクを作成してプレートからのみ特徴を抽出し、画像全体でそれらを追跡します。goodFeaturesToTrack()
でオプティカルフローを使用して計算しcalcOpticalFlowPyrLK()
ます。これは私のアルゴリズムです:
- カメラからフレームを取得します。
- ナンバー プレートを見つけます。
- ナンバー プレート領域から特徴を抽出します。
- カメラから次のフレームを取得します。
- フレームから特徴を抽出します。
- calcOpticalFlowPyrLK() を呼び出す
- ナンバー プレートから機能の少なくとも半分を正常に追跡する一方で、追跡を行い、機能を次の機能と交換します。
コード(一部のみ):
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 回だけ特徴を抽出し、次にフレームからのみ特徴を抽出したいと考えています。私の論理はどこか間違っています。ここで何が問題になる可能性がありますか?