前言
这篇文章主要讲述opencv图像处理中磨皮算法的应用。
一、磨皮算法
//第五题 磨皮
/*注释:
image.copyTo(imageROI,mask);
把image这张图复制(copy to)到imageROI上,
且image对应mask中像素值为0(黑色)的像素点都不会贴到imageROI上。
*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
VideoCapture cap("C://Users//john//Desktop//VID1.mp4");
double scale = 0.5;
//0-188
//肤色
double i_minH = 0;
double i_maxH = 20;
//0-255
double i_minS = 43;
double i_maxS = 255;
//0-255
double i_minV = 55;
double i_maxV = 255;
while (1)
{
Mat frame;
Mat hsvMat;
Mat detectMat;
Mat finalpicture;
Mat rframetemp;
Mat backskin;
cv::Size rect;
rect.width = 3;
rect.height = 3;
cap >> frame;
Size ResImgSiz = Size(frame.cols*scale, frame.rows*scale);
Mat rFrame = Mat(ResImgSiz, frame.type());
resize(frame, rFrame, ResImgSiz, INTER_LINEAR);
cvtColor(rFrame, hsvMat, COLOR_BGR2HSV); //HSV
rFrame.copyTo(rframetemp);
GaussianBlur(rFrame, rframetemp, rect, 5, 5); //均值滤波磨皮
rframetemp.copyTo(detectMat);
cv::inRange(hsvMat, Scalar(i_minH, i_minS, i_minV), Scalar(i_maxH, i_maxS, i_maxV), detectMat);//二值化来获得mask
rframetemp.copyTo(finalpicture,detectMat); //磨皮后拷贝
bitwise_not(detectMat, backskin);
rFrame.copyTo(finalpicture, backskin); //把原图中未磨皮部分拷贝
cv::imshow("rFrame", rFrame);
cv::imshow("finalpicture", finalpicture);
waitKey(0);
}
}
总结
1.代码可以直接运行,如有不懂请直接留言哦。