opencv – 在视频序列中本地增强车牌

我的目标是创建一个增强的图像,其中包含来自给定序列图像的更可读的车牌号码,在驾驶汽车上具有难以区分的牌照,例如下面的序列.

正如您所看到的,在大多数情况下,板数是难以区分的.我正在研究增强的实现,例如多帧的超分辨率(正如我在本文中研究的那样:http://users.soe.ucsc.edu/~milanfar/publications/journal/SRfinal.pdf).我有一些OpenCV的经验,我正在寻找帮助的方向,或者超分辨率是否真的是这类问题的可行选择.

最佳答案 相反,在大于一个像素的图像之间进行移位不会妨碍具有子像素精度,即图像可以向右移动3.3个像素等.

你仍然需要以亚像素精度开始,估计帧之间的位移,有以下几点:

cornerSubPix( imgA, cornersA, Size( win_size, win_size ), Size( -1, -1 ), 
              TermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03 ) );

cornerSubPix( imgB, cornersB, Size( win_size, win_size ), Size( -1, -1 ), 
              TermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03 ) );

[…]

calcOpticalFlowPyrLK( imgA, imgB, cornersA, cornersB, features_found, feature_errors ,
    Size( win_size, win_size ), 5,
    cvTermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.1 ), 0 );

你很幸运,因为你的场景闪电没有大的变化(因此PyrLK会相当准确)并且它的结构没有太大变化(因为它是一个很短的序列).这意味着您可以通过移除异常值并对剩余的异常值求平均值,从场景的中心部分(汽车所在的位置)逐帧获得估计的运动矢量.请注意,如果汽车越来越接近您,这种方法将无效…

有了这个,最简单的超分辨率算法意味着将每个帧的各个位移映射到更高阶的网格(例如,2x宽度和2x高度),并对它们的结果求平均值.这样可以解决噪音问题,并且会给你一个关于你的假设有多好的印象.您应该针对此运行模型数据库(因为您有一个要测试的序列数据库,对吧?).如果方法令人满意,你可以从文献中得到一些子算法来删除点扩散函数,它们通常是掩码filtering.

点赞