视频序列中车牌的超分辨率
Posted
技术标签:
【中文标题】视频序列中车牌的超分辨率【英文标题】:Super-resolution of license plate in video sequence 【发布时间】:2014-03-28 12:47:04 【问题描述】:这是我的问题的后续问题:Local enhancing of license plate in video sequence
我实施了答案建议的基本超分辨率技术,但我无法获得更好的分辨率结果。我将视频序列修剪为 40 帧,如下所示:
并使用下面的代码,获取前 5 帧并执行超分辨率,然后使用序列中其余帧的处理重复更新超分辨率帧:
public void Process(Image<Gray, byte> frame)
SetRegionOfInterest(frame);
var resizedFrame = ResizeFrame(frame);
InputFrames.Add(resizedFrame);
if(InputFrames.Count > 5)
InputFrames.RemoveAt(0);
PerformSuperResolution();
public void PerformSuperResolution()
// WindowSize = 5
var referenceFrame = InputFrames[WindowSize-1].Convert<Gray, byte>();
var featuresToTrack = referenceFrame.GoodFeaturesToTrack(100, 0.1, 5, 10);
referenceFrame.FindCornerSubPix(featuresToTrack, new Size(WindowSize,WindowSize), new Size(-1,-1), new MCvTermCriteria(20, 0.03d));
var resultFrame = InputFrames[WindowSize-1].Convert<Gray, double>();
for(var frameCounter = 0; frameCounter < WindowSize-1; frameCounter++)
// Get shift between frames
var shiftResult = GetShiftResult(InputFrames[frameCounter],referenceFrame, featuresToTrack);
// Warp to correct shift
var warpMatrix = new Matrix<double>(new[,] 1, 0, -shiftResult.ShiftX, 0, 1, -shiftResult.ShiftY, 0, 0, 1);
var warpedFrame = InputFrames[frameCounter].WarpPerspective(warpMatrix,
INTER.CV_INTER_NN,
WARP.CV_WARP_DEFAULT,
new Gray(0));
resultFrame.RunningAvg(warpedFrame.Convert<Gray,double>(), 1, resultFrame.Convert<Gray, byte>());
SuperResolutionFrame = resultFrame.Convert<Gray, byte>();
public ShiftResult GetShiftResult(Image<Gray, byte> inputFrame, Image<Gray, byte> referenceFrame, PointF[][] ActualFeature)
var result = new ShiftResult();
PointF[] NextFeature;
Byte[] Status;
float[] TrackError;
// optical flow
OpticalFlow.PyrLK(referenceFrame, inputFrame, ActualFeature[0],
new Size(WindowSize, WindowSize), 5, new MCvTermCriteria(20, 0.1d),
out NextFeature, out Status, out TrackError);
//get displacements
float[] XdisplacementVectors = new float[NextFeature.Length];
float[] YdisplacementVectors = new float[NextFeature.Length];
for(int i = 0; i < NextFeature.Length; i++)
XdisplacementVectors[i] = NextFeature[i].X - ActualFeature[0][i].X;
YdisplacementVectors[i] = NextFeature[i].Y - ActualFeature[0][i].Y;
// gets average of displacements (disregards outliers)
result.ShiftX = getAVG(XdisplacementVectors);
result.ShiftY = getAVG(YdisplacementVectors);
return result;
程序在输入视频帧数组(总共 40 个)上调用 Process(frame)
,如下所示:
for(int i = 0; i < image_array.Count; i++)
Res.Process(image_array[i]);
我得到了这个结果图像:
如您所见,整体分辨率只有很小的改进,车牌的可读性并没有太大改进。我已经尝试过各种参数,但上面使用的参数似乎是我能做的最好的。
我愿意接受任何改进建议(不必局限于使用上述 C#/Emgu CV),甚至可以在移动应用领域内采用不同的实施方法。
【问题讨论】:
这个用什么具体算法来计算光流?如果光流的精度很差,改变其他参数也无济于事。 我正在使用 OpenCV 的 PyrLK(带有金字塔的迭代 Lucas-Kanade 方法),如上面代码中的 GetShiftResult 所示。我用它来查找从一帧到下一帧的位移并忽略异常值,但我试图弄清楚如何确定我使用的光流的准确性是否很差。我确实将视频修剪到上面看到的内容,以获得大部分平移运动,并且照明没有太大变化,因此 PyrLK 理论上应该相当准确。 你的问题解决了吗?你能分享一下这种情况下的解决方案吗? 【参考方案1】:超分辨率问题是病态 CV 问题,目前还没有令人满意的解决方案,因为它在输出中包含比输入更多的“信息”。
但是在一些非常具体的情况下,我们对所处理的图像有很强的先验假设,有些方法可以得到比一般问题更好的结果。
作为最先进的,我们有一些可用的代码:
License Super Resolution
【讨论】:
【参考方案2】:我知道这个问题是很久以前提出的。然而,现在可以将 opencv 与一些最先进的模型(如 EDSR)一起使用来实现图像超分辨率。
点击此链接进行完整实施https://www.pyimagesearch.com/2020/11/09/opencv-super-resolution-with-deep-learning/ https://learnopencv.com/super-resolution-in-opencv/
【讨论】:
以上是关于视频序列中车牌的超分辨率的主要内容,如果未能解决你的问题,请参考以下文章
使用OpenCV在图像和视频流中执行基于深度学习的超级分辨率
最新最全Diffusion Models论文代码汇总(图像生成图像分割图像翻译超分辨率重建医疗影像自然语言处理视频生生成时间序列生成3D点云生成文本语音转换音频生成等)