Merge pull request #4073 from MSOpenTech:video-sample-face

This commit is contained in:
Vadim Pisarevsky 2015-05-28 14:41:40 +00:00
commit 176dd96698

View File

@ -28,22 +28,42 @@
#include <opencv2/core.hpp> #include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp> #include <opencv2/imgproc.hpp>
#include <opencv2/objdetect.hpp>
#include <opencv2/features2d.hpp> #include <opencv2/features2d.hpp>
#include <opencv2/videoio.hpp> #include <opencv2/videoio.hpp>
#include <opencv2/videoio/cap_winrt.hpp> #include <opencv2/videoio/cap_winrt.hpp>
// Switch definitions below to apply different filters
// TODO: add UX controls to manipulate filters at runtime
//#define COLOR
#define CANNY
//#define FACES
using namespace cv; using namespace cv;
namespace video_capture_xaml { namespace video_capture_xaml {
// forward declaration
void cvFilterColor(Mat &frame);
void cvFilterCanny(Mat &frame);
void cvDetectFaces(Mat &frame);
CascadeClassifier face_cascade;
String face_cascade_name = "Assets/haarcascade_frontalface_alt.xml";
void cvMain() void cvMain()
{ {
VideoCapture cam; //initializing frame counter used by face detection logic
long frameCounter = 0;
// loading classifier for face detection
face_cascade.load(face_cascade_name);
// open the default camera // open the default camera
VideoCapture cam;
cam.open(0); cam.open(0);
Mat edges;
Mat frame; Mat frame;
// process frames // process frames
@ -51,18 +71,36 @@ namespace video_capture_xaml {
{ {
// get a new frame from camera - this is non-blocking per spec // get a new frame from camera - this is non-blocking per spec
cam >> frame; cam >> frame;
frameCounter++;
// don't reprocess the same frame again // don't reprocess the same frame again
// nb if commented then flashing may occur // if commented then flashing may occur
if (!cam.grab()) continue; if (!cam.grab()) continue;
// image processing calculations here // image processing calculations here
// nb Mat frame is in RGB24 format (8UC3) // Mat frame is in RGB24 format (8UC3)
// select processing type 1 or 2 // select processing type
#if 0 #if defined COLOR
// image manipulation example #1 cvFilterColor(frame);
#elif defined CANNY
cvFilterCanny(frame);
#elif defined FACES
// processing every other frame to reduce the load
if (frameCounter % 2 == 0) {
cvDetectFaces(frame);
}
#endif
// important step to get XAML image component updated
winrt_imshow();
}
}
// image processing example #1
// write color bar at row 100 for 200 rows // write color bar at row 100 for 200 rows
void cvFilterColor(Mat &frame)
{
auto ar = frame.ptr(100); auto ar = frame.ptr(100);
int bytesPerPixel = 3; int bytesPerPixel = 3;
int adjust = (int)(((float)30 / 100.0f) * 255.0); int adjust = (int)(((float)30 / 100.0f) * 255.0);
@ -72,16 +110,32 @@ namespace video_capture_xaml {
i++; // G i++; // G
ar[i++] = 255 - adjust; // B ar[i++] = 255 - adjust; // B
} }
#else }
// image processing example #2 // image processing example #2
// apply 'canny' filter // apply edge detection aka 'canny' filter
void cvFilterCanny(Mat &frame)
{
Mat edges;
cvtColor(frame, edges, COLOR_RGB2GRAY); cvtColor(frame, edges, COLOR_RGB2GRAY);
GaussianBlur(edges, edges, Size(7, 7), 1.5, 1.5); GaussianBlur(edges, edges, Size(7, 7), 1.5, 1.5);
Canny(edges, edges, 0, 30, 3); Canny(edges, edges, 0, 30, 3);
cvtColor(edges, frame, COLOR_GRAY2RGB); cvtColor(edges, frame, COLOR_GRAY2RGB);
#endif }
// important step to get XAML image component updated
winrt_imshow(); // image processing example #3
// detect human faces
void cvDetectFaces(Mat &frame)
{
Mat faces;
std::vector<cv::Rect> facesColl;
cvtColor(frame, faces, COLOR_RGB2GRAY);
equalizeHist(faces, faces);
face_cascade.detectMultiScale(faces, facesColl, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, cv::Size(1, 1));
for (unsigned int i = 0; i < facesColl.size(); i++)
{
auto face = facesColl[i];
cv::rectangle(frame, face, cv::Scalar(0, 255, 255), 3);
} }
} }
} }