我正在尝试找到一个简单的解决方案来实现OPenCV 的 OCR算法。我是图像处理的新手! 我正在使用 RLE算法播放使用特定编解码器解码的视频。
我想要做的是,对于每个已解码的帧,我想将它与之前的帧进行比较并存储两帧之间已更改的像素。
大多数现有的解决方案都给出了两个帧之间的差异,但我想保留已更改的新像素并将其存储在表中,然后能够分析已更改的每组像素而不是分析每次整个图像。
我计划使用“斑点检测”算法,但在实施之前我已经卡住了。
今天,我正在尝试这个:
char *prevFrame;
char *curFrame;
QVector DiffPixel<LONG>;
//for each frame
DiffPixel.push_back(curFrame-prevFrame);
我真的想拥有“仅更改像素结果”解决方案。如果我走错路,有人可以给我一些提示或纠正我吗?
修改
新问题,如果有多个像素区域会怎么样?是否可以在每个更改像素的区域中拥有一个表,或者它只是一个唯一的表?以下面的例子为例:
最好的结果就是有2个垫子矩阵。第一个矩阵具有第一个橙色正方形,第二个矩阵具有第二个橙色正方形。这样,如果我们将结果存储在一个矩阵中,只有分辨率与全帧几乎相同,它就可以避免必须“扫描”几乎整个帧。
此处的主要目标是最小化要分析以查找文本的区域(也称为分辨率)。
答案 0 :(得分:9)
加载图片后:
<强> IMG1 强>
<强> IMG2 强>
您可以应用XOR操作来获取差异。结果具有相同数量的输入图像通道:
<强> XOR 强>
然后,您可以创建二进制掩码或所有通道:
<强>掩模强>
您可以将与掩码中非零元素对应的img2
值复制为白色图像:
<强> DIFF 强>
<强>更新强>
如果您有多个像素发生变化的区域,请执行以下操作:
你会发现差异掩码(在二值化后所有非零像素都设置为255),如:
然后,您可以提取连接的组件并在新的黑色初始化蒙版上绘制每个连接的组件:
然后,和以前一样,您可以将每个蒙版中对应于非零元素的img2
值复制到白色图像。
完整的参考代码。请注意,这是答案的更新版本的代码。您可以在修订历史中找到原始代码。
#include <opencv2\opencv.hpp>
#include <vector>
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<Mat1b> 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<vector<Point>> 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;
}