我正在尝试从OPenCV 中找到一种简单的解决方案来实现 OCR算法。我对图像处理非常陌生!
我正在播放使用 RLE算法使用特定编解码器解码的视频。
我想对每个解码的帧进行比较,将其与前一个帧进行比较,并存储在两个帧之间发生变化的像素。
现有的大多数解决方案都会在两个帧之间产生差异,但我只想保留已更改的新像素并将其存储在表格中,然后能够分析已更改的每组像素,而不是分析整个图像每一次。
我计划使用“ Blob 检测”算法,但无法实现。
今天,我正在尝试:char *prevFrame;
char *curFrame;
QVector DiffPixel<LONG>;
//for each frame
DiffPixel.push_back(curFrame-prevFrame);
我真的很想拥有“仅更改像素结果”解决方案。如果我走错路了,有人可以给我一些提示或纠正我吗?
编辑:
新问题如果存在多个像素改变的区域怎么办?每变化的像素块有可能有一个表,还是只有一个唯一的表?请看下面的例子:
结果最好的结果是拥有2个矩阵。第一个矩阵带有第一个橙色正方形,第二个矩阵带有第二个橙色正方形。这样,如果我们仅将结果存储在一个分辨率与整个帧几乎相同的矩阵中,就可以避免“扫描”几乎整个帧。
这里的主要目标是最小化分析以查找文本的区域(又称分辨率)。
最佳答案
加载图像后:
img1
img2
您可以应用XOR操作来获取差异。结果具有与输入图像相同数量的 channel :
XOR
然后,您可以创建二进制掩码或对所有 channel 进行“或”操作:
mask
您可以将与 mask 中的非零元素相对应的img2
值复制到白色图像:
差异
更新
如果您有多个像素发生变化的区域,如下所示:
您会发现一个差异掩码(二进制化后,所有非零像素均设置为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;
}