根据项目需要,提取视频中的ROI区域进行处理,对于无关区域可以屏蔽掉。主要原理是把原始帧中的ROI定位(如帧差法、背景减除法找出轮廓矩形)后复制到一个黑色背景中,再进行后续预处理。
这里只是以图片为例,简述下原理,代码如下:
#include<iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
bool ROI_AddImage();
int main()
{
system("color 3F");
if (ROI_AddImage())
{
cout << endl << "OK! Success!";
}
while (1)
{
if (waitKey(100) == 27)
break;
}
}
bool ROI_AddImage()
{
//【1】读入图像
Mat srcImage = imread("srcimage.jpg");
Mat backGround = Mat::zeros(srcImage.size(),CV_8UC3);
imshow("srcImage", srcImage);
vector<Rect> rectROI;
Rect rect1(0, 0, 50, 50);
Rect rect2(70, 80, 30, 50);
Rect rect3(200, 180, 40, 60);
Mat ROI1 = srcImage(rect1);
Mat ROI2 = srcImage(rect2);
Mat ROI3 = srcImage(rect3);
rectROI.push_back(rect1);
rectROI.push_back(rect2);
rectROI.push_back(rect3);
for(int i = 0; i < rectROI.size(); i++)
{
srcImage(rectROI[i]).copyTo(backGround(rectROI[i]));
}
imshow("利用ROI实现图像叠加", backGround);
return 0;
}
原图如下:
图1 原图"srcimage"
运行结果如下:
运行结果中的3个ROI区域是用Rect类手动标注的,重点是.copyTo()在运行时要求前后区域大小一致。