精华内容
下载资源
问答
  • opencv 美颜

    2018-05-24 16:01:43
    使用OPENCV简单实现具有肤质保留功能的磨皮增白算法http://www.th7.cn/Program/Android/201709/1247874.shtml在一个美颜高手那里发现一个美颜算法,他写出了数学表达式,没有给出代码,正好在研究OPENCV,顺手实现之...

    使用OPENCV简单实现具有肤质保留功能的磨皮增白算法


    http://www.th7.cn/Program/Android/201709/1247874.shtml


    在一个美颜高手那里发现一个美颜算法,他写出了数学表达式,没有给出代码,正好在研究OPENCV,顺手实现之。具体过程就是一系列矩阵运算,据说是从一个PS高手那里研究 出来的,一并表示感谢。

    这是数学表达式:

    Dest =(Src * (100 - Opacity) + (Src + 2 * GuassBlur(EPFFilter(Src) - Src + 128) - 256) * Opacity) /100 ;

    	public static Mat face2(Mat image) {		Mat dst = new Mat();		// int value1 = 3, value2 = 1; 磨皮程度与细节程度的确定		int value1 = 3, value2 = 1; 		int dx = value1 * 5; // 双边滤波参数之一		double fc = value1 * 12.5; // 双边滤波参数之一		double p = 0.1f; // 透明度		Mat temp1 = new Mat(), temp2 = new Mat(), temp3 = new Mat(), temp4 = new Mat();		// 双边滤波		Imgproc.bilateralFilter(image, temp1, dx, fc, fc);		// temp2 = (temp1 - image + 128);		Mat temp22 = new Mat();		Core.subtract(temp1, image, temp22);		// Core.subtract(temp22, new Scalar(128), temp2);		Core.add(temp22, new Scalar(128, 128, 128, 128), temp2);		// 高斯模糊		Imgproc.GaussianBlur(temp2, temp3, new Size(2 * value2 - 1, 2 * value2 - 1), 0, 0);		// temp4 = image + 2 * temp3 - 255;		Mat temp44 = new Mat();		temp3.convertTo(temp44, temp3.type(), 2, -255);		Core.add(image, temp44, temp4);		// dst = (image*(100 - p) + temp4*p) / 100;		Core.addWeighted(image, p, temp4, 1 - p, 0.0, dst);				Core.add(dst, new Scalar(10, 10, 10), dst);		return dst;	}
    
    
    	public static Mat face2(Mat image) {		Mat dst = new Mat();		// int value1 = 3, value2 = 1; 磨皮程度与细节程度的确定		int value1 = 3, value2 = 1; 		int dx = value1 * 5; // 双边滤波参数之一		double fc = value1 * 12.5; // 双边滤波参数之一		double p = 0.1f; // 透明度		Mat temp1 = new Mat(), temp2 = new Mat(), temp3 = new Mat(), temp4 = new Mat();		// 双边滤波		Imgproc.bilateralFilter(image, temp1, dx, fc, fc);		// temp2 = (temp1 - image + 128);		Mat temp22 = new Mat();		Core.subtract(temp1, image, temp22);		// Core.subtract(temp22, new Scalar(128), temp2);		Core.add(temp22, new Scalar(128, 128, 128, 128), temp2);		// 高斯模糊		Imgproc.GaussianBlur(temp2, temp3, new Size(2 * value2 - 1, 2 * value2 - 1), 0, 0);		// temp4 = image + 2 * temp3 - 255;		Mat temp44 = new Mat();		temp3.convertTo(temp44, temp3.type(), 2, -255);		Core.add(image, temp44, temp4);		// dst = (image*(100 - p) + temp4*p) / 100;		Core.addWeighted(image, p, temp4, 1 - p, 0.0, dst);				Core.add(dst, new Scalar(10, 10, 10), dst);		return dst;	}

    测试代码:

     Mat src2 = Imgcodecs.imread("E:/work/qqq/e.jpg");         Mat src3 = face2(src2);                Mat dest = new Mat(new Size(src2.cols()+src3.cols(), src2.rows()), src2.type());         Mat temp1 = dest.colRange(0, src2.cols());         Mat temp2 = dest.colRange(src2.cols(), dest.cols());         src2.copyTo(temp1);         src3.copyTo(temp2);	Imgcodecs.imwrite("E:/work/qqq/z3.jpg",dest);


    http://www.cnblogs.com/Imageshop/p/4709710.html

    http://www.cnblogs.com/Imageshop/p/3871237.html


    展开全文
  • opencv美颜发送rtmp流

    2016-04-02 13:24:00
    opencv美颜发送rtmp流
  • openCV 美颜源代码

    2019-10-26 20:50:51
    import cv2 import numpy as np # 形态学处理 def Process(img): # 高斯平滑 gaussian = cv2.GaussianBlur(img, (3, 3), 0, 0, cv2.BORDER_DEFAULT) # 中值滤波 median = cv2.medianBlur(gaussian, 5) ...

     

    
    import cv2
    import numpy as np
    
    # 形态学处理
    def Process(img):
    	# 高斯平滑
    	gaussian = cv2.GaussianBlur(img, (3, 3), 0, 0, cv2.BORDER_DEFAULT)
    	# 中值滤波
    	median = cv2.medianBlur(gaussian, 5)
    	# Sobel算子
    	# 梯度方向: x
    	sobel = cv2.Sobel(median, cv2.CV_8U, 1, 0, ksize=3)
    	# 二值化
    	ret, binary = cv2.threshold(sobel, 170, 255, cv2.THRESH_BINARY)
    	# 核函数
    	element1 = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 1))
    	element2 = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 7))
    	# 膨胀
    	dilation = cv2.dilate(binary, element2, iterations=1)
    	# 腐蚀
    	erosion = cv2.erode(dilation, element1, iterations=1)
    	# 膨胀
    	dilation2 = cv2.dilate(erosion, element2, iterations=3)
    	return dilation2
    
    
    def GetRegion(img):
    	regions = []
    	# 查找轮廓
    	# _, contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    	contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    	for contour in contours:
    		area = cv2.contourArea(contour)
    		if (area < 2000):
    			continue
    		eps = 1e-3 * cv2.arcLength(contour, True)
    		approx = cv2.approxPolyDP(contour, eps, True)
    		rect = cv2.minAreaRect(contour)
    		box = cv2.boxPoints(rect)
    		box = np.int0(box)
    		height = abs(box[0][1] - box[2][1])
    		width = abs(box[0][0] - box[2][0])
    		ratio =float(width) / float(height)
    		if (ratio < 5 and ratio > 1.8):
    			regions.append(box)
    	return regions
    
    
    def detect(img):
    	# 灰度化
    	gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    	prc = Process(gray)
    
    	regions = GetRegion(prc)
    	print('[INFO]:Detect %d license plates' % len(regions))
    	for box in regions:
    		cv2.drawContours(img, [box], 0, (0, 255, 0), 2)
    	cv2.imshow('Result', img)
    	cv2.imwrite('result.jpg', img)
    	cv2.waitKey(0)
    	cv2.destroyAllWindows()
    
    
    if __name__ == '__main__':
    	img = cv2.imread('./test/test2.jpg')
    	detect(img)

     

    展开全文
  • using OpenCVForUnity.CoreModule; using OpenCVForUnity.ImgcodecsModule; using OpenCVForUnity.ImgprocModule; using OpenCVForUnity.UnityUtils; using UnityEngine; using UnityEngine.UI; public class ...

    写代码不易,请不要抄袭,谢谢,点个赞再走可好

     

    置顶感谢: https://blog.csdn.net/hello_yxc/article/details/69362643?utm_medium=distribute.pc_relevant.none-task-blog-title-5&spm=1001.2101.3001.4242

    谢谢大佬的无私奉献

     

    下一篇是摄像头的实时美颜:

    https://blog.csdn.net/qq_39097425/article/details/111047697

     

    2020/12/8 待更新:

    1.只针对脸部的优化

    3.算法的优化

    2.代码优化

     

    Unity 双边滤波 这里有个坑 就是Opencv这个函数读取的图片是BGR通道的 而Unity是RGB,所以需要转换 还有就是尽量不要去复用Mat

    Unity 代码 和 C++ 代码我都放后面了

    Unity效果展示:

    C++:

    Unity 代码:

    
    using OpenCVForUnity.CoreModule;
    using OpenCVForUnity.ImgprocModule;
    using OpenCVForUnity.UnityUtils;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class BeautFace : MonoBehaviour
    {
        public RawImage srcRaw;
    
        public RawImage brightnessRaw;
    
        public RawImage GaussianBlurRaw;
    
        public RawImage bilateralFilterRaw;
    
        public RawImage dstRaw;
    
        public RawImage filter2DMatRaw;
    
        public int threadValue = 5;
    
        // 原图
        private Mat src;
        private int _iImageWidth;
        private int _iImageHeight;
        private void Start()
        {
            Texture2D imgTexture = Resources.Load("Girl") as Texture2D;
            _iImageWidth = imgTexture.width;
            _iImageHeight = imgTexture.height;
    
            src = new Mat(_iImageHeight, _iImageWidth, CvType.CV_8UC4);
            Utils.texture2DToMat(imgTexture, src);
    
            // 原图
            srcRaw.texture = imgTexture;
    
            //调亮
            Mat BrightnessMat = new Mat(_iImageHeight, _iImageWidth, CvType.CV_8UC4);
            BrightnessMat = src.clone();
            src.convertTo(BrightnessMat, -1, 1.1f, 68);
            Texture2D srctexture = new Texture2D(src.cols(), src.rows(), TextureFormat.RGBA32, false);
            Utils.fastMatToTexture2D(BrightnessMat, srctexture);
            brightnessRaw.texture = srctexture;
    
            // 高斯模糊
            Mat GaussianBlurMat = new Mat(_iImageHeight, _iImageWidth, CvType.CV_8UC4);
            GaussianBlurMat = BrightnessMat.clone();
            Size size = new Size(9, 9);
            Imgproc.GaussianBlur(GaussianBlurMat, GaussianBlurMat, size, 0, 0); // 高斯模糊,消除椒盐噪声
            Core.flip(GaussianBlurMat, GaussianBlurMat, 0);
            //Imgproc.medianBlur(src,src,15); // 高斯模糊,消除椒盐噪声
            Texture2D GaussianBlurRawtexture = new Texture2D(src.cols(), src.rows(), TextureFormat.RGBA32, false);
            Utils.fastMatToTexture2D(GaussianBlurMat, GaussianBlurRawtexture);
            GaussianBlurRaw.texture = GaussianBlurRawtexture;
    
            //双边滤波 这里有个坑 就是Opencv读取的图片是BGR通道的 而Unity是RGB,所以需要转换 还有就是尽量不要去复用Mat
            Mat BGRMat = new Mat(imgTexture.height, imgTexture.width, CvType.CV_8UC3);
            Imgproc.cvtColor(src, BGRMat, Imgproc.COLOR_RGB2BGR);
            Mat dstMat = new Mat(imgTexture.height, imgTexture.width, CvType.CV_8UC3);
            Mat bilateralFilterMat = new Mat(imgTexture.height, imgTexture.width, CvType.CV_8UC3);
            Imgproc.bilateralFilter(BGRMat, dstMat, 30, 75, 75);
            Imgproc.cvtColor(dstMat, bilateralFilterMat, Imgproc.COLOR_BGR2RGB);
            Texture2D bilateralFilterTexture = new Texture2D(bilateralFilterMat.cols(), bilateralFilterMat.rows(), TextureFormat.RGBA32, false);
            Utils.matToTexture2D(bilateralFilterMat, bilateralFilterTexture);
            bilateralFilterRaw.texture = bilateralFilterTexture;
    
            //图像增强,使用非锐化掩蔽(Unsharpening Mask)方案。
            Mat matFinal = new Mat(imgTexture.height, imgTexture.width, CvType.CV_8UC4);
            Imgproc.cvtColor(bilateralFilterMat, matFinal, Imgproc.COLOR_RGB2RGBA);
    
            Imgproc.GaussianBlur(matFinal, matFinal, new Size(0, 0), 9);
            Core.addWeighted(matFinal, 1.5, matFinal, -0.5, 0, matFinal);
            Core.flip(matFinal, matFinal, 0);
            Texture2D addWeightedTexture = new Texture2D(src.cols(), src.rows(), TextureFormat.RGBA32, false);
            Utils.fastMatToTexture2D(matFinal, addWeightedTexture);
            dstRaw.texture = addWeightedTexture;
    
            // 锐化
            Mat filter2DMat = new Mat(imgTexture.height, imgTexture.width, CvType.CV_8UC4);
            Imgproc.cvtColor(bilateralFilterMat, filter2DMat, Imgproc.COLOR_RGB2RGBA);
            Mat kernel = new Mat(3, 3, CvType.CV_32F, new Scalar(-1));
            kernel.put(0, 0, 0, -1, 0, -1, 5, -1, 0, -1, 0);
            //对图像srcMat和自定义核kernel做卷积,输出到dstMat
            Imgproc.filter2D(filter2DMat, filter2DMat, filter2DMat.depth(), kernel);
            Core.flip(filter2DMat, filter2DMat, 0);
            Texture2D filter2DMattexture = new Texture2D(filter2DMat.cols(), filter2DMat.rows(), TextureFormat.RGBA32, false);
            Utils.fastMatToTexture2D(filter2DMat, filter2DMattexture);
            filter2DMatRaw.texture = filter2DMattexture;
    
    
        }
    
        private int bilateralFilterVal = 30;  // 双边模糊系数
        public static Mat face2(Mat image)
        {
            Mat dst = new Mat();
    
            // int value1 = 3, value2 = 1; 磨皮程度与细节程度的确定
            int value1 = 30, value2 = 10;
            int dx = value1 * 5; // 双边滤波参数之一
            double fc = value1 * 12.5; // 双边滤波参数之一
            double p = 0.1f; // 透明度
            Mat temp1 = new Mat(), temp2 = new Mat(), temp3 = new Mat(), temp4 = new Mat();
    
            // 双边滤波
            Imgproc.bilateralFilter(image, temp1, dx, fc, fc);
    
            // temp2 = (temp1 - image + 128);
            Mat temp22 = new Mat();
            Core.subtract(temp1, image, temp22);
            // Core.subtract(temp22, new Scalar(128), temp2);
            Core.add(temp22, new Scalar(128, 128, 128, 128), temp2);
            // 高斯模糊
            Imgproc.GaussianBlur(temp2, temp3, new Size(2 * value2 - 1, 2 * value2 - 1), 0, 0);
    
            // temp4 = image + 2 * temp3 - 255;
            Mat temp44 = new Mat();
            temp3.convertTo(temp44, temp3.type(), 2, -255);
            Core.add(image, temp44, temp4);
            // dst = (image*(100 - p) + temp4*p) / 100;
            Core.addWeighted(image, p, temp4, 1 - p, 0.0, dst);
    
            Core.add(dst, new Scalar(10, 10, 10), dst);
            return dst;
    
        }
    
        // Opencv For Unity 调节图片亮度
        private Mat BrightnessMat(Mat matSelfPhoto, float alpha = 1.1f, int beta = 68)
        {
            Mat matBrightnessMat = new Mat();
            matBrightnessMat = matSelfPhoto.clone();
            matSelfPhoto.convertTo(matBrightnessMat, -1, alpha, beta);
    
            Texture2D srctexture = new Texture2D(matSelfPhoto.cols(), matSelfPhoto.rows(), TextureFormat.RGBA32, false);
            Utils.fastMatToTexture2D(matBrightnessMat, srctexture);
            brightnessRaw.texture = srctexture;
            return matBrightnessMat;
    
    
        }
    
        private void MatTo()
        {
            Texture2D imgTexture = Resources.Load("lena") as Texture2D;
    
            Mat imgMat = new Mat(imgTexture.height, imgTexture.width, CvType.CV_8UC4);
    
            Utils.texture2DToMat(imgTexture, imgMat);
            Debug.Log("imgMat.ToString() " + imgMat.ToString());
    
            Texture2D texture = new Texture2D(imgMat.cols(), imgMat.rows(), TextureFormat.RGBA32, false);
    
            Utils.matToTexture2D(imgMat, texture);
        }
    
    }
    

    C++ 代码:

    #include <opencv2/opencv.hpp>
    using namespace cv;
    void whiteFace(Mat& matSelfPhoto,int alpha, int beta)
    {
    	for (int y = 0; y < matSelfPhoto.rows; y++)
    	{
    		for (int x = 0; x < matSelfPhoto.cols; x++)
    		{
    			for (int c = 0; c < 3; c++)
    			{
    				matSelfPhoto.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(alpha*(matSelfPhoto.at<Vec3b>(y, x)[c]) + beta);
    			}
    		}
    	}
    }
    void BeautyFace() {
    	// 读入一张图片(游戏原画)    
    	Mat matResult;
    	Mat src = imread("C:/Users/Administrator/Desktop/Girl.jpg");
    	int bilateralFilterVal = 30;  // 双边模糊系数
    	imshow("0000", src);
    	whiteFace(src, 1.1, 68);  // 调整对比度与亮度,参数2为对比度,参数3为亮度
    	imshow("1111", src);
    	GaussianBlur(src, src, Size(9, 9), 0, 0); // 高斯模糊,消除椒盐噪声
    	imshow("2222", src);
    	bilateralFilter(src, matResult, bilateralFilterVal, // 整体磨皮
    		bilateralFilterVal * 2, bilateralFilterVal / 2);
    	imshow("3333", matResult);
    
    	Mat matFinal;
    
    	// 图像增强,使用非锐化掩蔽(Unsharpening Mask)方案。
    	cv::GaussianBlur(matResult, matFinal, cv::Size(0, 0), 9);
    	cv::addWeighted(matResult, 1.5, matFinal, -0.5, 0, matFinal);
    	imshow("4444", matFinal);
    	imwrite("E:\\test\\result.png", matFinal);
    	waitKey(0);
    }
    void BeautyFace(Mat& src) {
    	// 读入一张图片(游戏原画)    
    	Mat matResult;
    	int bilateralFilterVal = 30;  // 双边模糊系数
    	whiteFace(src, 1.1, 68);  // 调整对比度与亮度,参数2为对比度,参数3为亮度
    	GaussianBlur(src, src, Size(9, 9), 0, 0); // 高斯模糊,消除椒盐噪声
    	bilateralFilter(src, matResult, bilateralFilterVal, // 整体磨皮
    		bilateralFilterVal * 2, bilateralFilterVal / 2);
    	Mat matFinal;
    	// 图像增强,使用非锐化掩蔽(Unsharpening Mask)方案。
    	cv::GaussianBlur(matResult, matFinal, cv::Size(0, 0), 9);
    	cv::addWeighted(matResult, 1.5, matFinal, -0.5, 0, matFinal);
    	imshow("BeautyFace", matResult);
    }
    
    int main()
    {
    	BeautyFace();
    
    
    	读取视频或摄像头
    	//VideoCapture capture(0);
    
    	//while (true)
    	//{
    	//	Mat frame;
    	//	capture >> frame;
    	//	BeautyFace(frame);
    	//	//imshow("读取视频", frame);
    	//	waitKey(60);	//延时30
    	//}
    	//return 0;
    
    }

     

    展开全文
  • Android技术首套架构师级别的高级课程,是真正意义上的安卓高级课程,也是汇集了最前沿新技术于一体的移动开发实战课程,是相关开发工程师应当进行的课程。但课程同时的受众是直接面向高级的Android开发工程师,是...
  • opencv滤波美颜

    千次阅读 2019-08-30 10:44:09
     导向滤波(Guided Filtering)和双边滤波(BF)、最小二乘滤波(WLS)是三大边缘保持(Edge-perserving)滤波器。当然,引导滤波的功能不仅仅是边缘保持,只有当引导图是原图的时候,它就成了一个边缘保持滤波器。...

     

     导向滤波(Guided Filtering)和双边滤波(BF)、最小二乘滤波(WLS)是三大边缘保持(Edge-perserving)滤波器。当然,引导滤波的功能不仅仅是边缘保持,只有当引导图是原图的时候,它就成了一个边缘保持滤波器。
      它在图像去雾,图像抠图上均有相应的应用。
     

    展开全文
  • opencv 简单美颜效果

    千次阅读 2019-03-10 12:10:12
    美颜效果采用:双边模糊(也称双边滤波)+掩膜操作 双边模糊bilateralFilter(src, dest, d=15, 150, 3) 15 –计算的半径,半径之内的像数都会被纳入计算,如果提供-1 则根据sigma space参数取值 150 – sigma ...
  • opencv+android 相片美颜

    2017-12-28 14:50:29
    opencv android 相片美颜 高斯滤波、双边滤波、动态设值
  • 使用opencv实现美颜(磨皮、祛痘) 头文件 #include <iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; 磨皮祛痘算法 Mat mopi(Mat src) { int slider = 0; Mat ...
  • OpenCV实时美颜摄像并生成H264视频流

    热门讨论 2016-03-04 23:40:24
    为什么美颜摄像这么简单的功能,OpenCV这个开源项目网上很少有代码呢?对于在windows平台下,生成h264视频流也比价麻烦,没有现成的api可以使用,需要借助MinGw编译libx264,或者ffmpeg才能使用。 最近有个小需求,...
  • 今天是2017年最后一晚,希望大家元旦前夕玩得开心,准备迎接2018全新的一年,活出程序员的...美颜相机、美妆相机、秒拍、天天P图们让自拍更加精彩,带有滤镜、美颜、宠萌等各种效果。讲真的,一开始我比较好奇的是宠
  • 总之一大堆理由,啥时候让我拍照的水平能有美颜相机三分之一的效果就好!​ 果然都是锻炼出来的,至少现在我能看出来朋友圈哪些小姐姐批没批过照片。​​​ ​逃不掉​​逃不掉啊,为了摆脱这种局面—— 立马给...
  • 所以我们在进行人脸美颜之前,我们需要区分出那里是皮肤区域,哪里是非皮肤区域。 皮肤颜色判断有以下两种,第一种是通过RGB的颜色值来判断这是不是皮肤区域,第二种是通过YCrCb色彩空间的方式区别(看到这我有点...
  • Rgb转换成yuv,opencv实现(美颜在这一步实现) Yuv转换成h264,x264实现 H264转换成rtmp流,libxrtmp实现 4.发送给服务器进行直播 H264的流一般就可以播放了,但是针对目前的网络直播主要是将h264转换成rtmp流,用...
  • 基于OpenCV美颜相机推送直播流

    万次阅读 2016-04-04 13:06:56
    先从opencv(2.4.10版本)采集回来摄像头的图像,是一帧一帧的 每一帧图像是一个矩阵,opencv中的mat 数据结构。   2.人脸的美化 人脸美化,我们用的皮肤检测,皮肤在颜色空间是特定的一个区域 检测到这个区域(感...
  • 使用opencv实现简易人脸美颜程序,压缩包内附带运行结果效果图。程序可做学习参考。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 919
精华内容 367
关键字:

opencv美颜