OpenCV 自带了训练器和检测器。如果你想自己训练一个分类器来检测汽车,飞机等的话,可以使用 OpenCV 构建。其中的细节在这里: CascadeClassifier Training 现在我们来学习一下如何使用检测器。OpenCV 已经包含了很多已经训练好的分类器,其中包括:面部,眼睛,微笑等。这些XML文件保存在/opencvdata/haarcascades/文件夹中。下面我们将使用 OpenCV 创建一个面部和眼部检测器。
测试原图:
测试效果:
C#版本代码如下:
using OpenCvSharp;
using System;
namespace demo
{
internal class Program
{
static void Main(string[] args)
{
//运行之前,检查cascade文件路径是否在你的电脑上
CascadeClassifier face_cascade = new CascadeClassifier("../../../images/haarcascade/haarcascade_frontalface_default.xml");
CascadeClassifier eye_cascade = new CascadeClassifier("../../../images/haarcascade/haarcascade_eye.xml");
//Mat img = Cv2.ImRead("../../../images/kongjie_hezhao.jpg");
Mat img = Cv2.ImRead("../../../images/airline-stewardess-bikini.jpg");
Mat gray = new Mat();
Cv2.CvtColor(img, gray, ColorConversionCodes.BGR2GRAY);
Cv2.ImShow("gray", gray);
//Detects objects of different sizes in the input image.
//The detected objects are returned as a list of rectangles.
//cv2.CascadeClassifier.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize)
//scaleFactor – Parameter specifying how much the image size is reduced at each image
//scale.
//minNeighbors – Parameter specifying how many neighbors each candidate rectangle should
//have to retain it.
//minSize – Minimum possible object size. Objects smaller than that are ignored.
//maxSize – Maximum possible object size. Objects larger than that are ignored.
//faces = face_cascade.detectMultiScale(gray, 1.3, 5)
Rect[] faces = face_cascade.DetectMultiScale(gray, scaleFactor: 1.1, minNeighbors: 5,
minSize: new Size(30, 30), flags: HaarDetectionTypes.ScaleImage); //改进
Console.WriteLine($"Detected:{faces.Length}");
foreach (var face in faces)
{
Cv2.Rectangle(img,
new Point(face.X, face.Y),
new Point(face.X + face.Width, face.Y + face.Height),
new Scalar(255, 0, 0), 2);
Mat roi_gray = new Mat(gray, face);
Mat roi_color = new Mat(img, face);
Rect[] eyes = eye_cascade.DetectMultiScale(roi_gray);
foreach (var ey in eyes)
{
Cv2.Rectangle(roi_color,
new Point(ey.X, ey.Y),
new Point(ey.X + ey.Width, ey.Y + ey.Height),
new Scalar(0, 255, 0), 2);
}
}
Cv2.ImShow("img", img);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();
}
}
}
C++版本代码如下:
#include <opencv2/opencv.hpp>
#include <string>
using namespace cv;
using namespace std;
int main()
{
//运行之前,检查cascade文件路径是否在你的电脑上
CascadeClassifier face_cascade = CascadeClassifier("../images/haarcascade/haarcascade_frontalface_default.xml");
CascadeClassifier eye_cascade = CascadeClassifier("../images/haarcascade/haarcascade_eye.xml");
//Mat img = imread("../images/kongjie_hezhao.jpg");
Mat img = imread("../images/airline-stewardess-bikini.jpg");
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
imshow("gray", gray);
//Detects objects of different sizes in the input image.
//The detected objects are returned as a list of rectangles.
//cv2.CascadeClassifier.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize)
//scaleFactor – Parameter specifying how much the image size is reduced at each image
//scale.
//minNeighbors – Parameter specifying how many neighbors each candidate rectangle should
//have to retain it.
//minSize – Minimum possible object size. Objects smaller than that are ignored.
//maxSize – Maximum possible object size. Objects larger than that are ignored.
//faces = face_cascade.detectMultiScale(gray, 1.3, 5)
vector<Rect> faces;
face_cascade.detectMultiScale(gray, faces, 1.1, 5, 2, Size(30, 30)); //改进
cout << "Detected:" << faces.size() << endl;
for (int i = 0; i < faces.size(); i++)
{
rectangle(img,
Point(faces[i].x, faces[i].y),
Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height),
Scalar(255, 0, 0), 2);
Mat roi_gray = gray(faces[i]);
Mat roi_color = img(faces[i]);
vector<Rect> eyes;
eye_cascade.detectMultiScale(roi_gray, eyes);
for (int j = 0; j < eyes.size(); j++)
{
rectangle(roi_color,
Point(eyes[j].x, eyes[j].y),
Point(eyes[j].x + eyes[j].width, eyes[j].y + eyes[j].height),
Scalar(0, 255, 0), 2);
}
}
cv::imshow("img", img);
cv::waitKey(0);
cv::destroyAllWindows();
}
Python版本代码如下:
import numpy as np
import cv2
# 运行之前,检查cascade文件路径是否在你的电脑上
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
# img = cv2.imread('../images/kongjie_hezhao.jpg')
img = cv2.imread('../images/airline-stewardess-bikini.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cv2.imshow('gray', gray)
# Detects objects of different sizes in the input image.
# The detected objects are returned as a list of rectangles.
# cv2.CascadeClassifier.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize)
# scaleFactor – Parameter specifying how much the image size is reduced at each image
# scale.
# minNeighbors – Parameter specifying how many neighbors each candidate rectangle should
# have to retain it.
# minSize – Minimum possible object size. Objects smaller than that are ignored.
# maxSize – Maximum possible object size. Objects larger than that are ignored.
# faces = face_cascade.detectMultiScale(gray, 1.3, 5)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)#改进
print("Detected ", len(faces), " face")
for (x, y, w, h) in faces:
img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
roi_gray = gray[y:y + h, x:x + w]
roi_color = img[y:y + h, x:x + w]
eyes = eye_cascade.detectMultiScale(roi_gray)
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCV 自带了训练器和检测器。如果你想自己训练一个分类器来检测汽车,飞机等的话,可以使用 OpenCV 构建。其中的细节在这里: CascadeClassifier Training 现在我们来学习一下如何使用检测器。OpenCV 已经包含了很多已经训练好的分类器,其中包括:面部,眼睛,微笑等。这些XML文件保存在/opencvdata/haarcascades/文件夹中。下面我们将使用 OpenCV 创建一个面部和眼部检测器。
测试原图:
测试效果:
C#版本代码如下:
using OpenCvSharp;
using System;
namespace demo
{
internal class Program
{
static void Main(string[] args)
{
//运行之前,检查cascade文件路径是否在你的电脑上
CascadeClassifier face_cascade = new CascadeClassifier("../../../images/haarcascade/haarcascade_frontalface_default.xml");
CascadeClassifier eye_cascade = new CascadeClassifier("../../../images/haarcascade/haarcascade_eye.xml");
//Mat img = Cv2.ImRead("../../../images/kongjie_hezhao.jpg");
Mat img = Cv2.ImRead("../../../images/airline-stewardess-bikini.jpg");
Mat gray = new Mat();
Cv2.CvtColor(img, gray, ColorConversionCodes.BGR2GRAY);
Cv2.ImShow("gray", gray);
//Detects objects of different sizes in the input image.
//The detected objects are returned as a list of rectangles.
//cv2.CascadeClassifier.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize)
//scaleFactor – Parameter specifying how much the image size is reduced at each image
//scale.
//minNeighbors – Parameter specifying how many neighbors each candidate rectangle should
//have to retain it.
//minSize – Minimum possible object size. Objects smaller than that are ignored.
//maxSize – Maximum possible object size. Objects larger than that are ignored.
//faces = face_cascade.detectMultiScale(gray, 1.3, 5)
Rect[] faces = face_cascade.DetectMultiScale(gray, scaleFactor: 1.1, minNeighbors: 5,
minSize: new Size(30, 30), flags: HaarDetectionTypes.ScaleImage); //改进
Console.WriteLine($"Detected:{faces.Length}");
foreach (var face in faces)
{
Cv2.Rectangle(img,
new Point(face.X, face.Y),
new Point(face.X + face.Width, face.Y + face.Height),
new Scalar(255, 0, 0), 2);
Mat roi_gray = new Mat(gray, face);
Mat roi_color = new Mat(img, face);
Rect[] eyes = eye_cascade.DetectMultiScale(roi_gray);
foreach (var ey in eyes)
{
Cv2.Rectangle(roi_color,
new Point(ey.X, ey.Y),
new Point(ey.X + ey.Width, ey.Y + ey.Height),
new Scalar(0, 255, 0), 2);
}
}
Cv2.ImShow("img", img);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();
}
}
}
C++版本代码如下:
#include <opencv2/opencv.hpp>
#include <string>
using namespace cv;
using namespace std;
int main()
{
//运行之前,检查cascade文件路径是否在你的电脑上
CascadeClassifier face_cascade = CascadeClassifier("../images/haarcascade/haarcascade_frontalface_default.xml");
CascadeClassifier eye_cascade = CascadeClassifier("../images/haarcascade/haarcascade_eye.xml");
//Mat img = imread("../images/kongjie_hezhao.jpg");
Mat img = imread("../images/airline-stewardess-bikini.jpg");
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
imshow("gray", gray);
//Detects objects of different sizes in the input image.
//The detected objects are returned as a list of rectangles.
//cv2.CascadeClassifier.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize)
//scaleFactor – Parameter specifying how much the image size is reduced at each image
//scale.
//minNeighbors – Parameter specifying how many neighbors each candidate rectangle should
//have to retain it.
//minSize – Minimum possible object size. Objects smaller than that are ignored.
//maxSize – Maximum possible object size. Objects larger than that are ignored.
//faces = face_cascade.detectMultiScale(gray, 1.3, 5)
vector<Rect> faces;
face_cascade.detectMultiScale(gray, faces, 1.1, 5, 2, Size(30, 30)); //改进
cout << "Detected:" << faces.size() << endl;
for (int i = 0; i < faces.size(); i++)
{
rectangle(img,
Point(faces[i].x, faces[i].y),
Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height),
Scalar(255, 0, 0), 2);
Mat roi_gray = gray(faces[i]);
Mat roi_color = img(faces[i]);
vector<Rect> eyes;
eye_cascade.detectMultiScale(roi_gray, eyes);
for (int j = 0; j < eyes.size(); j++)
{
rectangle(roi_color,
Point(eyes[j].x, eyes[j].y),
Point(eyes[j].x + eyes[j].width, eyes[j].y + eyes[j].height),
Scalar(0, 255, 0), 2);
}
}
cv::imshow("img", img);
cv::waitKey(0);
cv::destroyAllWindows();
}
Python版本代码如下:
import numpy as np
import cv2
# 运行之前,检查cascade文件路径是否在你的电脑上
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
# img = cv2.imread('../images/kongjie_hezhao.jpg')
img = cv2.imread('../images/airline-stewardess-bikini.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cv2.imshow('gray', gray)
# Detects objects of different sizes in the input image.
# The detected objects are returned as a list of rectangles.
# cv2.CascadeClassifier.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize)
# scaleFactor – Parameter specifying how much the image size is reduced at each image
# scale.
# minNeighbors – Parameter specifying how many neighbors each candidate rectangle should
# have to retain it.
# minSize – Minimum possible object size. Objects smaller than that are ignored.
# maxSize – Maximum possible object size. Objects larger than that are ignored.
# faces = face_cascade.detectMultiScale(gray, 1.3, 5)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)#改进
print("Detected ", len(faces), " face")
for (x, y, w, h) in faces:
img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
roi_gray = gray[y:y + h, x:x + w]
roi_color = img[y:y + h, x:x + w]
eyes = eye_cascade.detectMultiScale(roi_gray)
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()