Merge pull request #4073 from MSOpenTech:video-sample-face
This commit is contained in:
commit
176dd96698
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user