我正在尝试开发一个程序来跟踪车牌。我需要跟踪车牌并用 ID 号标记它们,这样我就可以只为每个车牌调用一次识别程序。我有跟踪问题。一旦成功检测到车牌区域,我就会创建掩码以仅从车牌中提取特征,然后在整个图像上跟踪它们。我使用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);
}
}
}
输出是:
绿点是以前的特征,红点是实际特征。
如您所见,它们在某种程度上被很好地跟踪,但看起来它们被缩放并远离车牌。我只想从车牌中提取特征一次,然后只从框架中提取特征。我的逻辑有问题。这里可能有什么问题?