#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <queue>
#include <stdio.h>
#include <math.h>
#include "constants.h"
#include "findEyeCenter.h"
#include "findEyeCorner.h"
using namespace std;
using namespace cv;
/** Constants **/
/** Function Headers */
void detectAndDisplay( cv::Mat frame );
/** Global variables */
//-- Note, either copy these two files from opencv/data/haarscascades to your current folder, or change these locations
cv::String face_cascade_name = "D:\\opencv_2.4.11\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
cv::CascadeClassifier face_cascade;
std::string main_window_name = "Capture - Face detection";
std::string face_window_name = "Capture - Face";
cv::RNG rng(12345);
cv::Mat debugImage;
cv::Mat skinCrCbHist = cv::Mat::zeros(cv::Size(256, 256), CV_8UC1);
/**
* @function main
*/
int main( int argc, const char** argv ) {
cv::Mat frame;
// Load the cascades
if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading face cascade, please change face_cascade_name in source code.\n"); return -1; };
cv::namedWindow(main_window_name,CV_WINDOW_NORMAL);
cv::moveWindow(main_window_name, 400, 100);
cv::namedWindow(face_window_name,CV_WINDOW_NORMAL);
cv::moveWindow(face_window_name, 10, 100);
cv::namedWindow("Right Eye",CV_WINDOW_NORMAL);
cv::moveWindow("Right Eye", 10, 600);
cv::namedWindow("Left Eye",CV_WINDOW_NORMAL);
cv::moveWindow("Left Eye", 10, 800);
cv::namedWindow("aa",CV_WINDOW_NORMAL);
cv::moveWindow("aa", 10, 800);
cv::namedWindow("aaa",CV_WINDOW_NORMAL);
cv::moveWindow("aaa", 10, 800);
createCornerKernels();
ellipse(skinCrCbHist, cv::Point(113, 155.6), cv::Size(23.4, 15.2),
43.0, 0.0, 360.0, cv::Scalar(255, 255, 255), -1);
// I make an attempt at supporting both 2.x and 3.x OpenCV
#if CV_MAJOR_VERSION < 3
// CvCapture* capture = cvCaptureFromCAM( 0 );
// VideoCapture capture("E:\\eyedata\\1.avi");
VideoCapture capture(0);
if( capture.isOpened() ) {
while( true ) {
capture >> frame;
// frame = cvQueryFrame( capture );
#else
cv::VideoCapture capture(0);
if( capture.isOpened() ) {
while( true ) {
capture.read(frame);
#endif
// mirror it 镜像
cv::flip(frame, frame, 1);
frame.copyTo(debugImage);
// Apply the classifier to the frame
if( !frame.empty() ) {
detectAndDisplay( frame );
}
else {
printf(" --(!) No captured frame -- Break!");
break;
}
imshow(main_window_name,debugImage);
int c = cv::waitKey(10);
if( (char)c == 'c' ) { break; }
if( (char)c == 'f' ) {
imwrite("frame.png",frame);
}
}
}
releaseCornerKernels();
return 0;
}
void findEyes(cv::Mat frame, cv::Rect face) {
Mat frame_gray,faceROI;
cvtColor(frame,frame_gray,CV_BGR2GRAY);
//截取人脸ROI
cv::Mat faceROI_rgb = frame(face);
cvtColor(faceROI_rgb,faceROI,CV_BGR2GRAY);
cv::Mat debugFace = faceROI_rgb;
//是否平滑
if (kSmoothFaceImage) {
double sigma = kSmoothFaceFactor * face.width;
GaussianBlur( faceROI, faceROI, cv::Size( 0, 0 ), sigma);
}
//-- Find eye regions and draw them
int eye_region_width = face.width * (kEyePercentWidth/100.0);//35
int eye_region_height = face.width * (kEyePercentHeight/100.0);//30
// eye_region_y
int eye_region_top = face.height * (kEyePercentTop/100.0);//25
cv::Rect leftEyeRegion(face.width*(kEyePercentSide/100.0),//13
eye_region_top,
eye_region_width,
eye_region_height);
cv::Rect rightEyeRegion(face.width - eye_region_width - face.width*(kEyePercentSide/100.0),
eye_region_top,
eye_region_width,
eye_region_height);
rectangle(debugFace,rightEyeRegion,Scalar(0,0,255));//red
//-- Find Eye Centers
cv::Point leftPupil = findEyeCenter(faceROI,leftEyeRegion,"Left Eye");
cv::Point rightPupil = findEyeCenter(faceROI,rightEyeRegion,"Right Eye");
// get corner regions
cv::Rect leftRightCornerRegion(leftEyeRegion);
leftRightCornerRegion.width -= leftPupil.x;
leftRightCornerRegion.x += leftPupil.x;
leftRightCornerRegion.height /= 2;
leftRightCornerRegion.y += leftRightCornerRegion.height / 2;
cv::Rect leftLeftCornerRegion(leftEyeRegion);
leftLeftCornerRegion.width = leftPupil.x;
leftLeftCornerRegion.height /= 2;
leftLeftCornerRegion.y += leftLeftCornerRegion.height / 2;
cv::Rect rightLeftCornerRegion(rightEyeRegion);
rightLeftCornerRegion.width = rightPupil.x;
rightLeftCornerRegion.height /= 2;
rightLeftCornerRegion.y += rightLeftCornerRegion.height / 2;
cv::Rect rightRightCornerRegion(rightEyeRegion);
rightRightCornerRegion.width -= rightPupil.x;
rightRightCornerRegion.x += rightPupil.x;
rightRightCornerRegion.height /= 2;
rightRightCornerRegion.y += rightRightCornerRegion.height / 2;
rectangle(debugFace,leftRightCornerRegion,Scalar(255,0,0));//blue
rectangle(debugFace,leftLeftCornerRegion,Scalar(0,0,0));//black
rectangle(debugFace,rightLeftCornerRegion,Scalar(0,255,0));//green
rectangle(debugFace,rightRightCornerRegion,Scalar(0,0,255));//red
// change eye centers to face coordinates
rightPupil.x += rightEyeRegion.x;
rightPupil.y += rightEyeRegion.y;
leftPupil.x += leftEyeRegion.x;
leftPupil.y += leftEyeRegion.y;
// draw eye centers
circle(debugFace, rightPupil, 3, 1234);
circle(debugFace, leftPupil, 3, 1234);
//-- Find Eye Corners
if (kEnableEyeCorner) {
cv::Point2f leftRightCorner = findEyeCorner(faceROI(leftRightCornerRegion), true, false);
leftRightCorner.x += leftRightCornerRegion.x;
leftRightCorner.y += leftRightCornerRegion.y;
cv::Point2f leftLeftCorner = findEyeCorner(faceROI(leftLeftCornerRegion), true, true);
leftLeftCorner.x += leftLeftCornerRegion.x;
leftLeftCorner.y += leftLeftCornerRegion.y;
cv::Point2f rightLeftCorner = findEyeCorner(faceROI(rightLeftCornerRegion), false, true);
rightLeftCorner.x += rightLeftCornerRegion.x;
rightLeftCorner.y += rightLeftCornerRegion.y;
cv::Point2f rightRightCorner = findEyeCorner(faceROI(rightRightCornerRegion), false, false);
rightRightCorner.x += rightRightCornerRegion.x;
rightRightCorner.y += rightRightCornerRegion.y;
circle(debugFace, leftRightCorner, 3, 200);
circle(debugFace, leftLeftCorner, 3, 200);
circle(debugFace, rightLeftCorner, 3, 200);
circle(debugFace, rightRightCorner, 3, 200);
}
imshow(face_window_name, faceROI_rgb);
// cv::Rect roi( cv::Point( 0, 0 ), faceROI.size());
// cv::Mat destinationROI = debugImage( roi );
// faceROI.copyTo( destinationROI );
}
cv::Mat findSkin (cv::Mat &frame) {
cv::Mat input;
cv::Mat output = cv::Mat(frame.rows,frame.cols, CV_8U);
cvtColor(frame, input, CV_BGR2YCrCb);
for (int y = 0; y < input.rows; ++y) {
const cv::Vec3b *Mr = input.ptr<cv::Vec3b>(y);
// uchar *Or = output.ptr<uchar>(y);
cv::Vec3b *Or = frame.ptr<cv::Vec3b>(y);
for (int x = 0; x < input.cols; ++x) {
cv::Vec3b ycrcb = Mr[x];
// Or[x] = (skinCrCbHist.at<uchar>(ycrcb[1], ycrcb[2]) > 0) ? 255 : 0;
if(skinCrCbHist.at<uchar>(ycrcb[1], ycrcb[2]) == 0) {
Or[x] = cv::Vec3b(0,0,0);
}
}
}
return output;
}
/**
* @function detectAndDisplay
*/
void detectAndDisplay( cv::Mat frame ) {
std::vector<cv::Rect> faces;
//cv::Mat frame_gray;
std::vector<cv::Mat> rgbChannels(3);
//通道分离
cv::split(frame, rgbChannels);
//创建捕获帧的灰度图
cv::Mat frame_gray = rgbChannels[2];
//cvtColor( frame, frame_gray, CV_BGR2GRAY );
//equalizeHist( frame_gray, frame_g
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
eyelike1.0.rar (50个子文件)
eyelike1.0
main.sln 879B
ipch
main-e69ee443
main-62bed6b1.ipch 45.69MB
main.sdf 11.21MB
main
main.cpp 8KB
findEyeCorner.cpp 3KB
main.vcxproj 5KB
helpers.h 275B
helpers.cpp 1KB
constants.h 685B
findEyeCenter.h 168B
findEyeCorner.h 327B
Debug
link.read.1.tlog 18KB
main.exe.embed.manifest 406B
vc100.pdb 668KB
main.write.1.tlog 0B
main.log 873B
link-cvtres.read.1.tlog 2B
link.command.1.tlog 9KB
link.3356.read.1.tlog 2B
main.vcxprojResolveAssemblyReference.cache 713B
link.3356-cvtres.read.1.tlog 2B
rc.write.1.tlog 898B
findEyeCenter.obj 261KB
CL.write.1.tlog 6KB
rc.command.1.tlog 1KB
cl.command.1.tlog 10KB
link-cvtres.write.1.tlog 2B
mt.read.1.tlog 958B
main.lastbuildstate 73B
main.exe.intermediate.manifest 381B
main.exe.embed.manifest.res 472B
main.obj 308KB
mt.write.1.tlog 274B
helpers.obj 136KB
rc.read.1.tlog 874B
CL.read.1.tlog 87KB
main_manifest.rc 198B
link.3356-cvtres.write.1.tlog 2B
vc100.idb 579KB
mt.command.1.tlog 1KB
findEyeCorner.obj 140KB
link.write.1.tlog 3KB
link.3356.write.1.tlog 2B
findEyeCenter.cpp 7KB
main.vcxproj.filters 2KB
main.vcxproj.user 143B
Debug
main.ilk 1.94MB
main.exe 134KB
main.pdb 1.85MB
main.suo 17KB
共 50 条
- 1
资源评论
- singing1234562018-12-26安装opencv2.4.11,程序运行闪一下就没有了。
- ZPILOTE2018-07-19下载了,不能跑再来咨询
zxucver
- 粉丝: 2148
- 资源: 19
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功