濾波函數(shù)
?中值濾波
medianBlur(frame, detectmat, 5);
平均濾波
blur(frame, detectmat, Size(5, 5));
高斯濾波(最后一個(gè)是方差 越大越模糊)
GaussianBlur(frame, detectmat, Size(5, 5),0);
sobel的邊緣檢測(cè)函數(shù)
Sobel(gray, dx, CV_16S, 1, 0, 3);//x方向的 因?yàn)槭?,0
convertScaleAbs(dx, dx);//轉(zhuǎn)換絕對(duì)值
Sobel(gray, dy, CV_16SC1, 0, 1, 3);//y方向的 因?yàn)?,1
convertScaleAbs(dy, dy);
Sobel(gray, dx_add_dy1, CV_16SC1, 1, 1, 3);//嘗試一下1,1 發(fā)現(xiàn)并不是簡(jiǎn)單的都疊加
convertScaleAbs(dx_add_dy1, dx_add_dy1);//效果不好 為啥?
addWeighted(dx, 0.5, dy, 0.5, 0, dx_add_dy2);只能互相單獨(dú)做 然后再疊加的方式 效果很好
?
利用高斯濾波對(duì)人臉進(jìn)行平滑處理,學(xué)習(xí)mask的應(yīng)用
人臉閾值
//膚色h
double i_minH = 0;
double i_maxH = 20;
//膚色顏色飽和度s
double i_minS = 43;
double i_maxS = 255;
//膚色顏色亮度v
double i_minV = 55;
double i_maxV = 255;
將原圖轉(zhuǎn)化為HSV類型,找出人臉并并給maskmat(這里是一個(gè)區(qū)域,人臉?biāo)莚oi)
cvtColor(frame, hsvMat, COLOR_BGR2HSV);
frame.copyTo(maskMat);
cv::inRange(hsvMat, Scalar(i_minH, i_minS, i_minV), Scalar(i_maxH, i_maxS, i_maxV), maskMat);
對(duì)原圖進(jìn)行高斯濾波
GaussianBlur(frame, guss_Mat, Size(5, 5), 3, 0);
將高斯濾波后的人臉區(qū)域替換到原圖上
frame.copyTo(objectMat);
guss_Mat.copyTo(objectMat, maskMat);
imshow("磨皮后", objectMat);
?
完整代碼:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-629654.html
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main() {
VideoCapture cap(0);
while (1) {
Mat frame;
Mat detectmat;
Mat dx;
Mat dy;
Mat dx_add_dy1;
Mat dx_add_dy2;
Mat gray;
cap >> frame;
cvtColor(frame, gray, COLOR_BGR2GRAY);
frame.copyTo(detectmat);
//medianBlur(frame, detectmat, 5);
//blur(frame, detectmat, Size(5, 5));
//GaussianBlur(frame, detectmat, Size(5, 5),0); //最后一個(gè)是方差 越大越模糊
Sobel(gray, dx, CV_16S, 1, 0, 3);
convertScaleAbs(dx, dx);
Sobel(gray, dy, CV_16SC1, 0, 1, 3);
convertScaleAbs(dy, dy);
Sobel(gray, dx_add_dy1, CV_16SC1, 1, 1, 3);
convertScaleAbs(dx_add_dy1, dx_add_dy1);//效果不好 為啥?
addWeighted(dx, 0.5, dy, 0.5, 0, dx_add_dy2);
//imshow("frame", frame);
//imshow("detect", detectmat);
imshow("dx", dx);
imshow("dy", dy);
imshow("dx_add_dy1", dx_add_dy1);//效果不好
imshow("dx_add_dy2", dx_add_dy2);
/
Mat hsvMat;
Mat maskMat;
Mat objectMat;
Mat guss_Mat;
//膚色h
double i_minH = 0;
double i_maxH = 20;
//膚色顏色飽和度s
double i_minS = 43;
double i_maxS = 255;
//膚色顏色亮度v
double i_minV = 55;
double i_maxV = 255;
cvtColor(frame, hsvMat, COLOR_BGR2HSV);
frame.copyTo(maskMat);
cv::inRange(hsvMat, Scalar(i_minH, i_minS, i_minV), Scalar(i_maxH, i_maxS, i_maxV), maskMat);
GaussianBlur(frame, guss_Mat, Size(5, 5), 3, 0);
frame.copyTo(objectMat);
guss_Mat.copyTo(objectMat, maskMat);
imshow("磨皮后", objectMat);
waitKey(30);
}
return 0;
}
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-629654.html
到了這里,關(guān)于OPENCV C++(五)濾波函數(shù)+sobel邊緣檢測(cè)+人臉磨皮mask的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!