最近有点事,这两天都没有更新。出去玩耍还是要注意安全啊。今天正好有点空,我做了一下证件照抠图。本次基于的方法是传统方法,没有使用深度学习之类的。
我采用了两种方法抠图。
下面是实验效果:
原图:
边缘:
抠图结果:
以下是我的实现代码
Mat source = imread("D:/images/IDphoto1.jpg",-1);
if (source.empty()) {
cout << "can`t open this ph" << endl;
}
namedWindow("source_demo",WINDOW_FREERATIO);
imshow("source_demo",source);
Mat gray;
cvtColor(source, gray, COLOR_BGR2GRAY);
threshold(gray,gray,0,255,THRESH_BINARY|THRESH_OTSU);
vector<vector<Point>> contours;
findContours(gray,contours,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE,Point());
Mat canvas = Mat::zeros(source.size(),CV_8UC3);
canvas = Scalar::all(255);
/*
for (size_t t = 0; t < contours.size(); t++)
{
drawContours(canvas,contours,t,Scalar(0),2,8);
}
*/
drawContours(canvas, contours, 8, Scalar(0,0,0), -1, 8);
namedWindow("draw",WINDOW_FREERATIO);
bitwise_not(canvas, canvas);
imshow("draw", canvas);
bitwise_not(canvas, canvas);
vector<Mat> split_canvas;
split(canvas,split_canvas);
Mat cdst;
bitwise_and(source, source, cdst, split_canvas[0]);
namedWindow("cdst", WINDOW_FREERATIO);
imshow("cdst",cdst);
关于HSV色彩空间这里有篇详细的讲解:https://www.cnblogs.com/wangyblzu/p/5710715.html
主要用到以上这个表格,和inRange函数
mask区域:
抠图结果:
这种方式明显对静态图片处理效果不是很明显。
但是这种方式可以处理实时视频流,这里面黑色的斑点是不是就像某些主播打开视频背景虚化时,卡的时候,有些黑色部分。
这种方式在还可以优化一下。
我的实现代码
Mat hsv, gaus;
GaussianBlur(source, gaus, Size(3, 3), 0);
cvtColor(gaus, hsv, COLOR_BGR2HSV);
namedWindow("hsv_demo", WINDOW_FREERATIO);
imshow("hsv_demo", hsv);
Mat mask;
inRange(hsv,Scalar(100,43,46),Scalar(124,255,255),mask);
namedWindow("mask", WINDOW_FREERATIO);
bitwise_not(mask,mask);
imshow("mask", mask);
Mat dst;
bitwise_and(source,source,dst,mask);
namedWindow("dst", WINDOW_FREERATIO);
imshow("dst", dst)
本节完整代码地址:https://github.com/cyssmile/openCV_learning_notes/blob/master/opencv_test/opencv_043/opencv_043.cpp
原文:https://www.cnblogs.com/cyssmile/p/12639369.html