[VS2017]图像处理——给证件照换背景

tech2026-06-16  3

本次做的是一个关于图像处理的小代码,把之前大佬们分享的利用图像处理的方法,给肖像换背景复现了一遍~ 这里是VS源码

#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace cv; using namespace std; int main(int argc, char** argv) { Mat img, img2, img3, img4, img5, img6; img = imread("11.jpg"); //resize(img, img, Point(221, 316)); imshow("input image", img); int rows, cols, channels; rows = img.rows; cols = img.cols; channels = img.channels(); //cout << rows << "\t" << cols << "\t" << channels << endl; cvtColor(img, img2, COLOR_BGR2HSV); //imshow("hsv image", img2); inRange(img2, Scalar(0, 135, 135), Scalar(180, 245, 230), img3);//检测红色背景 //inRange(img2, Scalar(90, 70, 70), Scalar(110, 255, 255), img3);//检测蓝色背景 imshow("mask image", img3); //腐蚀 Mat element = getStructuringElement(MORPH_RECT, Size(3, 3)); erode(img3, img4, element); imshow("erode image", img4); //膨胀 dilate(img4, img5, element); imshow("dilate image", img5); //遍历换颜色 Mat ergodic_img = img5; int pointR, pointG, pointB; for (int i = 0; i < ergodic_img.rows; i++) { for (int j = 0; j < ergodic_img.cols ; j++) { if (ergodic_img.at<uchar>(i, j) == 255) { //pointR = 67, pointG = 142, pointB = 219;//背景变为蓝色 //pointR = 255, pointG = 0, pointB = 0; //背景变为红色 pointR = 255, pointG = 255, pointB = 255;//背景变为白色 img.at<cv::Vec3b>(i, j)[0] = pointB; img.at<cv::Vec3b>(i, j)[1] = pointG; img.at<cv::Vec3b>(i, j)[2] = pointR; } } } imshow("result image", img); imwrite("result.jpg", img); waitKey(0); return 0; }

处理各流程照片: 输入图像: 输出图像:

最新回复(0)