视频行人检测系统,能够分割出多个行人。
环境:VS2017 + OpenCV3.4.1
1 实现图片行人检测
步骤:
(1)定义HOG对象
(2)设置SVM分类器
(3)在测试图像上检测行人区域
(4)显示图片
2 实现视频行人检测
步骤:
(1)初始化参数
(2)设置SVM分类器
(3)在测试图像上检测行人区域
(4)显示图片
程序:
图片行人检测程序
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
cv::Mat image = cv::imread("people.jpg");
if (image.empty())
{
std::cout << "read image failed" << std::endl;
}
// 1. 定义HOG对象
cv::HOGDescriptor hog; // 采用默认参数
// 2. 设置SVM分类器
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector()); // 采用已经训练好的行人检测分类器
// 3. 在测试图像上检测行人区域
std::vector<cv::Rect> regions;
hog.detectMultiScale(image, regions, 0, cv::Size(8, 8), cv::Size(32, 32), 1.05, 2);
// 显示
for (size_t i = 0; i < regions.size(); i++)
{
cv::rectangle(image, regions[i], cv::Scalar(0, 0, 255), 2);
}
cv::imshow("peopele ", image);
cv::waitKey(0);
return 0;
}
视频行人检测程序
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat frame;
Mat image;
VideoCapture cap;
vector<Rect> regions;
VideoWriter writer("VideoTest.mp4", CV_FOURCC('D', 'I', 'V', 'X'), 25.0, Size(512, 500));
// 1. 定义HOG对象
HOGDescriptor hog; // 采用默认参数
// 2. 设置SVM分类器
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector()); // 采用已经训练好的行人检测分类器
int j = 0;
cap.open("srcVideo.mp4");
if (!cap.isOpened())
{
return -1;
}
while (1)
{
j++;
if (j > 300)
{
break;
}
cap >> frame;
imshow("srcVideo", frame);
if (frame.empty())
break;
frame.copyTo(image);
// 3. 在测试图像上检测行人区域
hog.detectMultiScale(image, regions, 0, cv::Size(8, 8), cv::Size(32, 32), 1.05, 2);
// 显示,框出行人
for (size_t i = 0; i < regions.size(); i++)
{
cv::rectangle(image, regions[i], cv::Scalar(0, 0, 255), 2);
}
imshow("VideoTest", image);
writer << image;
waitKey(30); //延时30ms
}
cv::waitKey(0);
return 0;
}