您的位置:首页 > 编程语言 > C语言/C++

opencv生成人脸轮廓c++代码实例及运行结果

2018-02-26 14:26 507 查看
c++代码#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

Mat drawFaceOutline(Mat srcColor, Mat result)
{
//整体轮廓
Size size = srcColor.size();
Mat faceOutline = Mat::zeros(size, CV_8UC3);
Scalar color = CV_RGB(255, 0, 0);
int thickness = 3;
int sw = size.width;
int sh = size.height;
int faceH = sh / 2 * 70 / 100;
int faceW = faceH * 72 / 100;
ellipse(faceOutline, Point(sw / 2, sh / 2), Size(faceW, faceH), 0, 0, 360, color, thickness, CV_AA);
//眼睛轮廓
int eyeW = faceW * 23 / 100;
int eyeH = faceH * 11 / 100;
int eyeX = faceW * 48 / 100;
int eyeY = faceH * 13 / 100;
Size eyeSize = Size(eyeW, eyeH);
int eyeA = 15;
int eyeYshift = 11;
//左眼上半部分
ellipse(faceOutline, Point(sw / 2 + eyeX, sh / 2 - eyeY), eyeSize, 0, 180 + eyeA, 360 - eyeA, color, thickness);
//左眼下半部分
ellipse(faceOutline, Point(sw / 2 + eyeX, sh / 2 - eyeY - eyeYshift),
eyeSize, 0, 0 + eyeA, 180 - eyeA, color, thickness, CV_AA);
//右眼上半部分
ellipse(faceOutline, Point(sw / 2 - eyeX, sh / 2 - eyeY), eyeSize, 0, 180 + eyeA, 360 - eyeA,
color, thickness, CV_AA);
//右眼下半部分
ellipse(faceOutline, Point(sw / 2 - eyeX, sh / 2 - eyeY - eyeYshift), eyeSize, 0, 0 + eyeA,
180 - eyeA, color, thickness, CV_AA);
//嘴唇
int mouthY = faceH * 60/ 100;
int mouthW = faceW * 45 / 100;
int mouthH = faceH * 6 / 100;
ellipse(faceOutline, Point(sw / 2, sh / 2 + mouthY), Size(mouthW, mouthH), 0, 0, 180, color,
thickness, CV_AA);
//显示信息提醒使用者
int fontFace = FONT_HERSHEY_COMPLEX;
float fontScale = 1.0f;
int fontThickness = 1;
char *szMsg = "PUT YOUR FACE HERE";
putText(faceOutline, szMsg, Point(sw *20/100, sh*10/100), fontFace, fontScale, color
, fontThickness, CV_AA);

addWeighted(srcColor, 1.0, faceOutline, 1, 0, result, CV_8UC3);

return result;
}

int main()
{
VideoCapture camera(0);
Mat cameraFrame;
//camera.open(cameraNumber);
if (!camera.isOpened())
{
cerr << "ERROR:Could not access the camera or video" << endl;
exit(1);//返回1表示异常中止
}
//分辨率设置为640*480,此台电脑对视频输入的图像不起作用,摄像头可以
camera.set(CV_CAP_PROP_FRAME_WIDTH, 640);
camera.set(CV_CAP_PROP_FRAME_HEIGHT, 480);

while (camera.isOpened())
{
camera >> cameraFrame;
if (cameraFrame.empty())
{
cerr << "ERROR:Could not grab a camera frame" << endl;
exit(1);
}
Mat displayedFrame(cameraFrame.size(), CV_8UC3);
//创建cartoonifier filter
displayedFrame = drawFaceOutline(cameraFrame, displayedFrame);
imshow("人脸轮廓图", displayedFrame);
if (waitKey(40)==27)//esc键退出
break;
}

return 0;
}运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: