一、编程环境:
OpenCV | 4.1.0 |
IDE | Visual Studio 2017 Enterprise (15.9.13) |
操作系统 | Windows 10 x64 中文专业版 (1903) |
二、示例代码:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = imread("../images/test.jpg");
namedWindow("原图1", WINDOW_AUTOSIZE);
imshow("原图1", src);
int h = src.rows;
int w = src.cols;
// 获取ROI
int y = h / 2;
int x = w / 2;
Rect rect(x - 100, y - 100, 200, 200);
Mat roi = src(rect);
imshow("ROI", roi);
Mat image = roi.clone();
// 修改原图上ROI区域颜色
roi.setTo(Scalar(255, 0, 0));
imshow("原图1(ROI)", src);
// 修改拷贝过来的 ROI
image.setTo(Scalar(0, 100, 255));
imshow("result", src);
imshow("copy roi", image);
// 使用 ROI 生成蒙板
Mat src2 = imread("../images/GreenBackground01.jpg");
imshow("原图2", src2);
Mat hsv, mask;
cvtColor(src2, hsv, COLOR_BGR2HSV);
inRange(hsv, Scalar(35, 43, 46), Scalar(99, 255, 255), mask);
imshow("蒙板", mask);
// 取出人像 ROI
Mat person;
bitwise_not(mask, mask);
bitwise_and(src2, src2, person, mask);
imshow("人像", person);
// 生成背景
Mat result = Mat::zeros(src2.size(), src2.type());
result.setTo(Scalar(255, 0, 0));
// 合成人像与背景
Mat dst;
bitwise_not(mask, mask);
bitwise_or(person, result, dst, mask);
add(dst, person, dst);
imshow("合成图", dst);
waitKey(0);
return 0;
}
三、运行效果:
(略)