您的位置:首页 > 运维架构

OpenCV人形检测Hog

2015-11-24 18:47 1786 查看
#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<Rect> 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<Rect> 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<Rect> 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<cv::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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: