当前位置:  开发笔记 > 编程语言 > 正文

OCR:两帧之间的差异

如何解决《OCR:两帧之间的差异》经验,为你挑选了1个好方法。

我试图找到一个简单的解决方案来实现OPenCVOCR算法.我是图像处理的新手!我正在播放使用RLE算法使用特定编解码器解码的视频.

我想要做的是,对于每个解码帧,我想将它与前一帧进行比较,并存储两帧之间已经改变的像素.

大多数现有的解决方案给出了两个帧之间的差异,但我想保留已更改的新像素并将其存储在表中,然后能够分析已更改的每组像素而不是分析整个图像每一次.

我计划使用" 斑点检测 "算法,在我能够实现它之前,我已经卡住了.

今天,我正在尝试这个:

char *prevFrame;
char *curFrame;
QVector DiffPixel;

//for each frame
DiffPixel.push_back(curFrame-prevFrame);

在此输入图像描述

我真的想拥有"仅改变像素结果"的解决方案.如果我走错路,有人可以给我一些提示或纠正我吗?

编辑:

新问题,如果有多个像素区域变化怎么办?是否可以在每个更改像素的区域中拥有一个表,或者它只是一个唯一的表?举个例子:

多个区域像素

结果最好的是有2个垫子矩阵.第一个矩阵具有第一个橙色正方形,第二个矩阵具有第二个橙色正方形.这样,如果我们将结果存储在一个矩阵中,只有分辨率与全帧几乎相同,它就避免了必须"扫描"几乎整个帧.

这里的主要目标是最小化要分析以查找文本的区域(也称为分辨率).



1> Miki..:

加载图片后:

IMG1

在此输入图像描述

IMG2

在此输入图像描述

您可以应用XOR操作来获得差异.结果具有相同数量的输入图像通道:

XOR

在此输入图像描述

然后,您可以创建二进制掩码或所有通道:

面具

在此输入图像描述

您可以将img2对应于蒙版中非零元素的值复制到白色图像:

DIFF

在此输入图像描述


UPDATE

如果您有多个像素更改的区域,如下所示:

在此输入图像描述

您将找到差异掩码(在二值化之后,所有非零像素都设置为255),如:

在此输入图像描述

然后,您可以提取连接的组件,并在新的黑色初始化蒙版上绘制每个连接的组件:

在此输入图像描述

然后,和以前一样,您可以将img2每个蒙版中对应于非零元素的值复制到白色图像.

在此输入图像描述

完整的代码供参考.请注意,这是答案更新版本的代码.您可以在修订历史记录中找到原始代码.

#include 
#include 
using namespace cv;
using namespace std;

int main()
{
    // Load the images
    Mat img1 = imread("path_to_img1");
    Mat img2 = imread("path_to_img2");

    imshow("Img1", img1);
    imshow("Img2", img2);

    // Apply XOR operation, results in a N = img1.channels() image
    Mat maskNch = (img1 ^ img2);

    imshow("XOR", maskNch);

    // Create a binary mask

    // Split each channel
    vector masks;
    split(maskNch, masks);

    // Create a black mask
    Mat1b mask(maskNch.rows, maskNch.cols, uchar(0));

    // OR with each channel of the N channels mask
    for (int i = 0; i < masks.size(); ++i)
    {
        mask |= masks[i];
    }

    // Binarize mask
    mask = mask > 0;

    imshow("Mask", mask);

    // Find connected components
    vector> contours;
    findContours(mask.clone(), contours, RETR_LIST, CHAIN_APPROX_SIMPLE);

    for (int i = 0; i < contours.size(); ++i)
    {
        // Create a black mask
        Mat1b mask_i(mask.rows, mask.cols, uchar(0));
        // Draw the i-th connected component
        drawContours(mask_i, contours, i, Scalar(255), CV_FILLED);

        // Create a black image
        Mat diff_i(img2.rows, img2.cols, img2.type());
        diff_i.setTo(255);

        // Copy into diff only different pixels
        img2.copyTo(diff_i, mask_i);

        imshow("Mask " + to_string(i), mask_i);
        imshow("Diff " + to_string(i), diff_i);
    }

    waitKey();
    return 0;
}

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有