gpt4 book ai didi

opencv - 视频序列中车牌的超分辨率

转载 作者:行者123 更新时间:2023-12-04 04:27:57 27 4
gpt4 key购买 nike

这是我的问题的后续问题:Local enhancing of license plate in video sequence

我实现了答案建议的基本超分辨率技术,但我无法获得更好的分辨率结果。我将视频序列修剪为 40 帧,如下所示:enter image description here

并使用下面的代码,它采用前 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;
}

程序调用的地方 Process(frame)在输入视频帧数组(总共 40 个)上,如下所示:
for(int i  = 0; i < image_array.Count; i++)
{
Res.Process(image_array[i]);
}

我得到了这个结果图像:
enter image description here

正如您所看到的,整体分辨率只有很小的改进,车牌的可读性没有太大的改进。我尝试过各种参数的试验,但上面使用的参数似乎是我能做的最好的。

如果可能的话,我愿意接受任何改进建议(不必限于使用上述 C#/Emgu CV),甚至在实现中采用不同的方法,如果可能的话。

最佳答案

超分辨率问题是不适定的 CV 问题,目前还没有令人满意的解决方案,因为它在输出中包含比输入更多的“信息”。
然而,在一些非常特殊的情况下,我们对我们正在处理的图像有很强的先验假设,一些方法可以获得比一般问题更好的结果。
作为最先进的技术,我们有一些可用的代码:
License Super Resolution

关于opencv - 视频序列中车牌的超分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22028709/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com