繁体   English   中英

OCR和OpenCV:高分辨率图像上两帧之间的差异

[英]OCR & OpenCV: Difference between two frames on high resolution images

根据这篇文章OCR:两帧之间的差异 ,我现在知道如何使用OpenCV查找两幅图像之间的像素差异。

我想改进此解决方案,并将其与内容丰富的高分辨率图像(来自视频)一起使用。 上面的示例不适用于大图像,因为该过程会变慢(发现的差异太大,“ findCountours方法”在选项卡中填充了250k元素,这需要花费大量时间来处理)。

我的应用程序使用RLE解码器解码视频的压缩帧。 帧解码后,我想将当前帧与前一帧进行比较,以便将两个帧之间的差异存储在“ Mat”选项卡中。

所有这些的目的是能够对不同像素进行分析并检查是否存在任何拉丁字符。 这使我减少了要分析的像素数量并节省了宝贵的时间。

如果有人有其他想法要执行这样的操作,请随时提出。

谢谢您的帮助。

编辑1:计算机屏幕的两个高分辨率图像的示例。 目前,这些是我要分析的完美示例。 如我们所见,两个大图像之间只有一个窗口作为区别,我只想针对任何角色分析新的“挑战”窗口。

第一张图片

第二张图片

编辑2:我试图根据分析的数据来调整算法。 通常,在下面的两张图片中,我只得到绿线作为差异,而根本没有文本(这是最有趣的)。 我试图更好地理解事情是如何工作的。

第一张图片

TestImg1

第二张图片

TestImg2

第三张图片 ResultImg

如您所见,我只有那些绿线,而没有文字(最好是减少countours [i] .size()时只有一个字母)

除了您提到的帖子,您还需要:

  • 对蒙版进行二值化处理时,请使用高于0的阈值来消除微小差异。
  • 消除一些噪音。 您可以找到所有连接的组件,并删除较小的组件。
  • 找到更大的连接组件的区域。 您可以使用convexHullfillConvexPoly来获取屏幕上不同对象的遮罩
  • 使用给定的蒙版将第二张图像复制到新图像。

结果将如下所示:

在此处输入图片说明

码:

#include <opencv2/opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;

int main()
{
    Mat3b img1 = imread("path_to_image_1");
    Mat3b img2 = imread("path_to_image_2");

    Mat3b diff;
    absdiff(img1, img2, diff);

    // Split each channel
    vector<Mat1b> masks;
    split(diff, masks);

    // Create a black mask
    Mat1b mask(diff.rows, diff.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 > 100;

    // Results images
    vector<Mat3b> difference_images;

    // Remove small blobs
    //Mat kernel = getStructuringElement(MORPH_RECT, Size(5,5));
    //morphologyEx(mask, mask, MORPH_OPEN, kernel);

    // Find connected components
    vector<vector<Point>> contours;
    findContours(mask.clone(), contours, CV_RETR_EXTERNAL, CHAIN_APPROX_NONE);

    for (int i = 0; i < contours.size(); ++i)
    {
        if (contours[i].size() > 1000)
        {
            Mat1b mm(mask.rows, mask.cols, uchar(0));

            vector<Point> hull;
            convexHull(contours[i], hull);


            fillConvexPoly(mm, hull, Scalar(255));

            Mat3b difference_img(img2.rows, img2.cols, Vec3b(0,0,0));
            img2.copyTo(difference_img, mm);

            difference_images.push_back(difference_img.clone());
        }
    }

    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM