You can find free LBP Cascade download links specifically designed for people and head detection in OpenCV. It’s trained on my own people and head datasets.
The cascades can be used by using the CascadeClassifier in OpenCV, which allows you to detect objects (such as people and heads) in images or video streams.
Keep in mind that no cascade is perfect, but in some cases, this custom LBP cascade might perform better than the default OpenCV cascades. The differences arise from the shape and feature space used for detection. For instance, the head detector may have more false detections compared to the people detector due to the common features shared by various head shapes.
Video example of expected detection results by detectMultiScale
Head cascade and people cascade download link
Head and people detection tutorial code
Update from 2024 opencv installation
You can simply prepare the project inside the Visual Studio 2015 by Nuget Packages. This approach is easy for beginners and better than standard installation with all the environmental variables problems. Just follow the installation steps here
LBP detectMultiScale cascade Opencv code
This code is based on my previous tutorial with more details Fast people detection.
// Name of the downloaded my cascades..
string cascadeHead = "cascadeH5.xml";
string cascadeName = "cascadG.xml";
// Load the cascade
CascadeClassifier detectorBody;
bool loaded1 = detectorBody.load(cascadeName);
CascadeClassifier detectorHead;
bool loaded2 = detectorHead.load(cascadeHead);
// save original make img gray
// draw rectangle back to the original colored sample
Mat original;
img.copyTo(original);
// Prepare vector for results
vector<Rect> human;
vector<Rect> head;
// Prepare gray image
cvtColor(img, img, CV_BGR2GRAY);
// equalize Histogram
equalizeHist(img, img);
// detect body and head in the img
// Set the proper min and max size for your case
detectorBody.detectMultiScale(img, human, 1.04, 4, 0 | 1, Size(30, 80), Size(80,200));
detectorHead.detectMultiScale(img, head, 1.1, 4, 0 | 1, Size(40, 40), Size(100, 100));
if (human.size() > 0) {
for (int gg = 0; gg < human.size(); gg++) {
rectangle(original, human[gg].tl(), human[gg].br(), Scalar(0, 0, 255), 2, 8, 0);
}
}
if (head.size() > 0) {
for (int gg = 0; gg < head.size(); gg++) {
rectangle(original, head[gg].tl(), head[gg].br(), Scalar(0, 0, 255), 2, 8, 0);
}
}
