基于Opencv的自动美颜功能代码
原来程序的设想是先对照片进行人脸识别,然后对人脸进行美颜处理;
花了大时间进行了人脸分类器的训练,但是识别效果还是不理想,所先跳过人脸识别,实现美颜处理;
找到了一个PS美颜的教程http://www.jb51.net/photoshop/9715_2.html 了解到高斯模糊,深入了解;
找到了一个图像修复的函数inpaint,深入了解;
以上两个函数大致就可以实现美颜处理了,为了结合以前所学,添加了滑条交互和摄像头自拍功能,这个小项目也算是这段时间所学的汇总见证吧。
#include "opencv2/core/core.hpp"
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"
#include<iostream>
#include<opencv2/opencv.hpp>
#include "opencv2/imgproc/imgproc.hpp" #define TRACKBARNAME "魔法棒大小"
#define RESULT "美颜后"
#define ORIGIN "美颜前"using namespace cv;//***************************************************************//
//全局变量定义
//***************************************************************//
bool g_bDrawing = false; //鼠标点击flag
Point g_CurrPoint, g_OrgPoint;//鼠标当前位置
int g_nThick , g_nBlue = 140, g_nGreen = 140, g_nRed = 140;//线型
RNG &rng = theRNG();
Mat dst_step1;//高美颜后的图
Mat dst;//高斯模糊图
Mat mengban1;//蒙版
Mat image; //自拍后的图像名
Mat frame; //视频显示桢//****************************************************************//
//调用摄像头实现自拍函数
//***************************************************************//
void cameraCapture()
{char key;bool flag=1; int i = 8;//打开摄像头VideoCapture capture(0);//大循环,为了截图后继续显示摄像头实时图片while (flag){//给key一个初始值,便于循环一开始进行key = 'c';//判断key是否为空格,不为空格则循环,即显示摄像头while (key != ' '){key = cvWaitKey(10);capture >> frame; imshow("摄像头", frame); waitKey(3);flag = 0;}//便于观察key是否有效imwrite("image.jpg", frame);key = 'c';destroyAllWindows();}}//****************************************************************//
//滑动条改变笔触大小的回调函数
//***************************************************************//
void changePenSize(int i,void *)
{g_nThick = i;
}//****************************************************************//
//磨皮(高斯模糊)
//***************************************************************//
int GaussianBlur(){image = imread("image.jpg");int value1 = 3, value2 = 1; //磨皮程度与细节程度的确定int dx = value1 * 5; //双边滤波参数之一 double fc = value1*12.5; //双边滤波参数之一 int p = 50; //透明度 Mat temp1, temp2, temp3, temp4;//双边滤波 bilateralFilter(image, temp1, dx, fc, fc);temp2 = (temp1 - image + 128);//高斯模糊 GaussianBlur(temp2, temp3, Size(2 * value2 - 1, 2 * value2 - 1), 0, 0);temp4 = image + 2 * temp3 - 255;dst = (image*(100 - p) + temp4*p) / 100;dst.copyTo(dst_step1); return 0;
}//***************************************************************//
//inpaint函数 手动选择杂色点
//***************************************************************//
void onMouse(int event, int x, int y, int flag, void *param)
{Mat &img = *(cv::Mat*)param;switch (event){//移动鼠标的时候case CV_EVENT_MOUSEMOVE:{ g_OrgPoint = g_CurrPoint;g_CurrPoint = Point(x, y);if (g_bDrawing == 1){ line(dst_step1, g_CurrPoint, g_OrgPoint, Scalar(255), g_nThick);imshow(RESULT, dst_step1);line(mengban1, g_CurrPoint, g_OrgPoint, Scalar(255), g_nThick);}}break;//点击鼠标左键时case CV_EVENT_LBUTTONDOWN:{g_bDrawing = true;g_OrgPoint = Point(x, y);g_CurrPoint = g_OrgPoint;}break;//松开鼠标左键时case CV_EVENT_LBUTTONUP:{g_bDrawing = false;inpaint(dst_step1, mengban1, dst_step1, 3, INPAINT_NS);imshow(RESULT, dst_step1);imwrite("美颜结果图.jpg", dst_step1);} break;}
}//***************************************************************//
//程序说明
//***************************************************************//
void Introduction()
{printf("\n\\*****************************************************************************\\\n");printf("\\*****************************************************************************\\");printf("\n\t\t\t\t自拍美颜程序!\n");printf("\n\n功能介绍:\n\n1、自动调用摄像头\n2、按下空格键实现自拍\n3、自动美颜\n4、魔法笔点击图片杂色进行自动修复");printf("\n\n\t\t\t\t谢谢您的使用!\n");printf("\\*****************************************************************************\\\n");printf("\\*****************************************************************************\\\n");
}//***************************************************************//
//主函数
//***************************************************************//
int main()
{//***************************************************************////程序说明//***************************************************************//Introduction();//***************************************************************////调用摄像头获取需要美颜的自拍//***************************************************************//cameraCapture();image = imread("image.jpg");imshow(ORIGIN, image);//***************************************************************////图像磨皮功能//***************************************************************//GaussianBlur();//***************************************************************////inpaint函数变量准备//***************************************************************////用一个变量来存储原图像 为MASK 分配空间mengban1.create(dst_step1.size(), CV_8UC1);mengban1 = Scalar::all(0);namedWindow(RESULT);setMouseCallback(RESULT, onMouse, 0);//***************************************************************////创建滑条改变笔触大小//***************************************************************//int originValue = 2;createTrackbar(TRACKBARNAME, RESULT, &originValue, 30, changePenSize);changePenSize(originValue,0);//***************************************************************////美颜后的照片//***************************************************************//imshow(RESULT, dst_step1);waitKey(); return 0;
}
每天8点下班,9点半学习到12点,断断续续学了3个礼拜,我觉得很有成就感。也是为了证明我的学习能力不必任何人差!
基于Opencv的自动美颜功能代码相关推荐
- php 邮件发送设置_PHP实现自动发送邮件功能代码(qq 邮箱)
最近做一个邮箱验证的功能,研究了一会,搞定了邮件的自动发送.下面用qq邮箱作为演示,一步一步来解释: 代码下载地址 首先,就是做到邮件的发送,代码如下: //邮件发送 require "./ ...
- php自动发送邮件,PHP实现自动发送邮件功能代码(qq 邮箱)_php实例
本文给大家分享以qq邮箱为例给大家介绍PHP实现自动发送邮件功能代码,感兴趣的朋友参考下吧 最近做一个邮箱验证的功能,研究了一会,搞定了邮件的自动发送.下面用qq邮箱作为演示,一步一步来解释: 代码下 ...
- 基于opencv的自动祛斑算法
首先我们先来看一下详细的逻辑思路: 灰度化 对比度增强 梯度极大值查找 皮肤排除 孤立点消除 高斯模糊 阈值处理 区域表求和得到最终结果D 根据结果D与梯度最大值查找的结果对图像A里的斑点进行泊松放出 ...
- opencv 实现照片美颜功能 html5版(源码)
做的一个美颜工具,可以调整磨皮系数进行图片处理.使用 opencv Javascript版本制作的,浏览器访问后,选择图片美颜即可. 1)选择本地图片 2)调整磨皮系数 3)点击"美颜处理& ...
- opencv 人脸识别_python基于openCV人脸识别18行代码实现
人脸识别 一.安装 1.打开命令行,输入pip install numpy,安装numpy. 2.安装opencv. pip install opencv-python 二.实现 (1)获取人脸识别训 ...
- 基于Threejs火焰烟雾动画功能代码
利用Threejs进行三维可视化的应用项目开发,我们经常回遇到需要加入一些动画效果,粒子效果等.所以本片利用此详细的例子进行介绍在Threejs中如何使用. 1,首先需要对三维场景进行初始化 func ...
- 基于Opencv 的 粗糙 美颜 人眼放大
老规矩,先上图 代码: // eyebigger.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" #include<opencv2\op ...
- html年会抽奖代码实例,基于JavaScript实现简单抽奖功能代码实例
为什么会做这个东西呢,纯属好玩,闲的 其实是在上次班会的时候想到的,班会的时候叫人回答问题,没人回答 当时就想,我如果抽签抽到你了,你还是不回答吗??好吧,一切都是扯淡 先来看看页面效果吧: 点击抽取 ...
- 【已经开源】基于opencv+pyqt的人像美容系统
基于opencv+pyqt的美颜软件 本文禁止转载! 源码地址: 使用效果: 支持功能: 安装依赖: 下载权重: 运行代码: 关注我的公众号: 本文禁止转载! 源码地址: https://github ...
最新文章
- 读书笔记:php_tizag_tutorial
- AlwaysOn业务IP和高可用IP分开使用方案测试报告
- 表单如何提交后mysql_如何在表格中添加表单,并提交MYSQL数据库
- 剑指offer 把数组排成最小的数 atoi和itoa,pow
- 2020年高等数学方法与提高(上海理工大学)学习笔记:常微分方程
- Android加速度传感器
- C++ stringstream介绍,使用方法与例子
- indesign中调出字符样式快捷键_Word中十大黄金快捷键,你会用几个?
- vue2.0移除或更改的一些东西
- (转)Hibernate中的多表操作
- SAP License:SAP委外加工业务
- Java的“ for each”循环如何工作?
- [使用心得]maven2之m2eclipse使用手册之二m2eclipse功能介绍
- ios transporter 缓存_鸿蒙和安卓都是开源,为什么iOS系统却可以获得出色的口碑?...
- [xmind] ASP.NET 设计模式 - UX 用户体验
- [腾讯社区开放平台]介绍开放授权协议-OAuth
- 服务器硬件配置应如何选择?
- Mac OSX: 有线共享WiFi
- IT软件创业之 -- 电脑设备买过来都是钱,卖出去都是废铁
- 珞珈-B生所学 跟学笔记 PPT(一)