[英]OCR & OpenCV: Difference between two frames on high resolution images
根据这篇文章OCR:两帧之间的差异 ,我现在知道如何使用OpenCV查找两幅图像之间的像素差异。
我想改进此解决方案,并将其与内容丰富的高分辨率图像(来自视频)一起使用。 上面的示例不适用于大图像,因为该过程会变慢(发现的差异太大,“ findCountours方法”在选项卡中填充了250k元素,这需要花费大量时间来处理)。
我的应用程序使用RLE解码器解码视频的压缩帧。 帧解码后,我想将当前帧与前一帧进行比较,以便将两个帧之间的差异存储在“ Mat”选项卡中。
所有这些的目的是能够对不同像素进行分析并检查是否存在任何拉丁字符。 这使我减少了要分析的像素数量并节省了宝贵的时间。
如果有人有其他想法要执行这样的操作,请随时提出。
谢谢您的帮助。
编辑1:计算机屏幕的两个高分辨率图像的示例。 目前,这些是我要分析的完美示例。 如我们所见,两个大图像之间只有一个窗口作为区别,我只想针对任何角色分析新的“挑战”窗口。
编辑2:我试图根据分析的数据来调整算法。 通常,在下面的两张图片中,我只得到绿线作为差异,而根本没有文本(这是最有趣的)。 我试图更好地理解事情是如何工作的。
第一张图片 :
第二张图片 :
如您所见,我只有那些绿线,而没有文字(最好是减少countours [i] .size()时只有一个字母)
除了您提到的帖子,您还需要:
convexHull
和fillConvexPoly
来获取屏幕上不同对象的遮罩 结果将如下所示:
码:
#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.