如何使用opencv将图像背景提取出来
时间: 2023-12-12 17:05:53 浏览: 144
使用OpenCV将图像背景提取出来的方法有很多,下面介绍两种常用的方法:
方法一:基于差分法的背景提取
基于差分法的背景提取是一种简单直接的方法。该方法通过将当前帧图像和背景帧图像进行像素级别的差分,得到背景和前景的差异,从而实现背景的提取。
1. 读取背景帧图像和当前帧图像。
2. 将两幅图像转换为灰度图像,并进行高斯滤波。
3. 对两幅图像进行差分运算,得到差分图像。
4. 对差分图像进行二值化处理,得到前景掩码。
5. 对前景掩码进行形态学处理,去除噪声。
6. 将前景掩码与当前帧图像进行按位与操作,得到提取后的背景图像。
代码示例:
```
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 读取背景帧图像和当前帧图像
Mat bg_frame = imread("bg.png");
Mat cur_frame = imread("cur.png");
// 将两幅图像转换为灰度图像,并进行高斯滤波
Mat bg_gray, cur_gray;
cvtColor(bg_frame, bg_gray, COLOR_BGR2GRAY);
cvtColor(cur_frame, cur_gray, COLOR_BGR2GRAY);
GaussianBlur(bg_gray, bg_gray, Size(5, 5), 0);
GaussianBlur(cur_gray, cur_gray, Size(5, 5), 0);
// 对两幅图像进行差分运算,得到差分图像
Mat diff;
absdiff(bg_gray, cur_gray, diff);
// 对差分图像进行二值化处理,得到前景掩码
Mat fg_mask;
threshold(diff, fg_mask, 30, 255, THRESH_BINARY);
// 对前景掩码进行形态学处理,去除噪声
Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(5, 5));
morphologyEx(fg_mask, fg_mask, MORPH_OPEN, kernel);
// 将前景掩码与当前帧图像进行按位与操作,得到提取后的背景图像
Mat bg_extracted;
cur_frame.copyTo(bg_extracted, fg_mask);
// 显示结果
imshow("Background Extracted", bg_extracted);
waitKey(0);
return 0;
}
```
方法二:基于混合高斯模型的背景提取
基于混合高斯模型的背景提取是一种常用的背景提取方法,该方法通过对每个像素建立一个混合高斯模型,对当前帧图像进行建模,并从中提取出背景。
1. 创建BackgroundSubtractorMOG2对象。
2. 读取视频帧图像,调用BackgroundSubtractorMOG2对象的apply函数进行背景提取。
3. 对背景掩码进行形态学处理,去除噪声。
4. 将背景掩码与当前帧图像进行按位与操作,得到提取后的背景图像。
代码示例:
```
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 创建BackgroundSubtractorMOG2对象
Ptr<BackgroundSubtractorMOG2> pMOG2 = createBackgroundSubtractorMOG2();
// 读取视频帧图像,调用BackgroundSubtractorMOG2对象的apply函数进行背景提取
VideoCapture cap("video.avi");
Mat frame, fg_mask, bg_extracted;
while (true)
{
cap >> frame;
if (frame.empty()) break;
pMOG2->apply(frame, fg_mask);
morphologyEx(fg_mask, fg_mask, MORPH_OPEN, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
frame.copyTo(bg_extracted, fg_mask);
imshow("Background Extracted", bg_extracted);
waitKey(30);
}
return 0;
}
```
以上两种方法都可以用于背景提取,具体选择哪种方法取决于实际需求和应用场景。
阅读全文