#include "iostream"
#include "queue"
using namespace std;
#include "opencv2/opencv.hpp"
#include "Windows.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/objdetect/objdetect.hpp"
using namespace cv;
int main()
{
try{
IplImage *pFrame = NULL;
CvCapture *pCapture = NULL;
//pCapture = cvCreateCameraCapture(-1);
//pCapture = cvCaptureFromCAM(0);
pCapture = cvCaptureFromFile("C:\\C_C++ code\\Photo and video\\TextVideo2.flv");
//pCapture = cvCaptureFromFile("C:\\C_C++ code\\Photo and video\\TextVideo1.flv");
if (!pCapture)
{
cout << "File opened fail..." << endl;
return -1;
}
Mat img;
HOGDescriptor hog;
Rect r;
int nNum = 0;
hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
vector found,found1;
int i, j;
char str[100];
while (pFrame = cvQueryFrame(pCapture))
{
nNum++;
Mat img = cvarrToMat(pFrame, 0); //IplImage turn into Mat
if (nNum >= 3)
{
//进行检测
hog.detectMultiScale(img, found);
found1.clear();
//-------------------去除嵌套的矩形框------------------------
for (i = 0; i < found.size(); i++)
{
r = found[i];
for (j = 0; j < found.size(); j++)
{
if ( i != j && ((r&found[j]) == r) )
{
break;
}
}
if (j == found.size())
{
found1.push_back(r);
}
}
//画长方形 框出行人
for (i = 0; i < found1.size(); i++)
{
r = found1[i];
rectangle(img, r, Scalar(0, 255, 0), 1);
}
nNum = 0;
}
for (int i = 0; i < found1.size(); i++)
{
r = found1[i];
rectangle(img, r, Scalar(0, 255, 0), 1);
}
sprintf(str, "The track count is: %d", found1.size());
putText(img, str, cvPoint(30, 30), CV_FONT_HERSHEY_PLAIN, 0.8,CV_RGB(0, 0, 250),1,8);
imshow("Track People", img);
if (cvWaitKey(35) >= 0)
break;
}
}
catch (exception &e)
{
cout << e.what() << endl;
}
return 1;
}
效果:
图片人形测试:
#include "iostream"
#include "queue"
using namespace std;
#include "opencv2/opencv.hpp"
#include "Windows.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/objdetect/objdetect.hpp"
int main(int argc, char** argv){
Mat img;
vector found;
img = imread("C:\\C_C++ code\\Photo and video\\text006.jpg");
HOGDescriptor defaultHog;
defaultHog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
//进行检测
defaultHog.detectMultiScale(img, found);
//画长方形,框出行人
for (int i = 0; i < found.size(); i++){
Rect r = found[i];
rectangle(img, r, Scalar(0, 255, 0), 1);
}
namedWindow("检测行人", CV_WINDOW_AUTOSIZE);
imshow("检测行人", img);
waitKey(0);
return 0;
}
边框嵌套去重:
int main(int argc, char** argv){
Mat img;
vector found, foundRect;
img = imread("C:\\C_C++ code\\Photo and video\\text007.jpg");
HOGDescriptor defaultHog;
defaultHog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
//进行检测
defaultHog.detectMultiScale(img, found);
//遍历found寻找没有被嵌套的长方形
for (int i = 0; i < found.size(); i++){
Rect r = found[i];
int j = 0;
for (; j < found.size(); j++){
//如果时嵌套的就推出循环
if (j != i && (r & found[j]) == r)
break;
}
if (j == found.size()){
foundRect.push_back(r);
}
}
//画长方形,圈出行人
for (int i = 0; i < foundRect.size(); i++){
Rect r = foundRect[i];
rectangle(img, r.tl(), r.br(), Scalar(0, 0, 255), 3);
}
namedWindow("检测行人", CV_WINDOW_AUTOSIZE);
imshow("检测行人", img);
waitKey(0);
return 0;
}
int main()
{
Mat image = imread("C:\\C_C++ code\\Photo and video\\text007jpg");
imshow("hog", image);
if (image.empty())
{
cout << "read image failed" << endl;
}
// 1. 定义HOG对象
HOGDescriptor hog(Size(48,96), Size(16, 16), Size(8, 8), Size(8, 8), 9);
// 2. 设置SVM分类器
hog.setSVMDetector(HOGDescriptor::getDaimlerPeopleDetector()); // 采用已经训练好的行人检测分类器
// 3. 在测试图像上检测行人区域
std::vector<:rect> regions;
hog.detectMultiScale(image, regions, 0, cv::Size(8, 8), cv::Size(32, 32), 1.05, 1);
// 显示
for (size_t i = 0; i < regions.size(); i++)
{
cv::rectangle(image, regions[i], cv::Scalar(0, 0, 255), 2);
}
cv::imshow("hog", image);
cv::waitKey(0);
return 0;
}