首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >视频序列中车牌的超分辨率

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

Stack Overflow用户
提问于 2014-02-26 07:44:04
回答 2查看 5.4K关注 0票数 11

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

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

使用下面的代码,获取前5帧并执行超分辨率,然后使用序列中其余帧的处理重复更新超分辨率帧:

代码语言:javascript
复制
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),如下所示:

代码语言:javascript
复制
for(int i  = 0; i < image_array.Count; i++)
{
    Res.Process(image_array[i]);
}

我得到了这个结果图像:

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

我对任何改进建议都持开放态度(不需要局限于上面提到的C#/Emgu CV的使用),如果可能的话,在移动应用程序领域甚至可以采用不同的实现方法。

EN

回答 2

Stack Overflow用户

发布于 2021-03-06 20:07:06

超分辨率问题是不适定的CV问题,由于它在输出中比输入中包含更多的“信息”,因此目前还没有令人满意的解决方案。

然而,在一些非常具体的情况下,我们对我们正在处理的图像有很强的先验假设,一些方法可以获得比一般问题更好的结果。

到目前为止,我们有一些可用的代码:

License Super Resolution

票数 0
EN

Stack Overflow用户

发布于 2021-05-10 14:52:07

我知道这个问题很久以前就有人问过了。然而,现在可以将opencv用于图像超分辨率与一些最先进的模型,如EDSR。

请访问以下链接以获得完整的实施

https://www.pyimagesearch.com/2020/11/09/opencv-super-resolution-with-deep-learning/ https://learnopencv.com/super-resolution-in-opencv/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22028709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档