Hog 和 CamShift 结合, 这个就是 非常的粗糙的 代码堆积

Hog  和  CamShift  结合效果可以

#include <fstream>
#include <string>
#include <cv.h>
#include <highgui.h>
#include <ml.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include "cvaux.h"
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <ctype.h>


using namespace cv;
using namespace std;


Rect r ;
int track_object = 0;


Rect ObjectDectd(IplImage* frame,int object,Rect r);
IplImage* MeanSift(IplImage *frame,Rect r);

int main()
{
	CvCapture* capture = 0;
	capture = cvCaptureFromAVI("sfe_clip.avi");


	if( !capture )
	{
		fprintf(stderr,"Could not initialize capturing...\n");
		return -1;
	}


	cvNamedWindow( "HogSiftDemo", 1 );

	//HogDetect  oHogDetect;
	for(;;)
	{
		IplImage* frame = 0;
		frame = cvQueryFrame( capture );
		
		
		
		if(track_object == 0)
		{
			r = ObjectDectd(frame,track_object,r);
			cvRectangle(frame, r.tl(), r.br(), cv::Scalar(255,255,0), 3);
			if(!cvSaveImage("mm1.jpg",frame)) printf("Could not save: %s\n", "mm1.jpg");
			std::cout<<"NOT Changed:"<<r.x <<"   "<<r.y<<"  "<<r.width<<"   "<<r.height<<std::endl; 
			if(r.x!=0)
				track_object  = -1;
			r.x = r.x + 30; r.y = r.y +30;r.width = r.width / 3;//4;//6;//9; 
			r.height = r.height / 3;//4;//6; 
			cvRectangle(frame, r.tl(), r.br(), cv::Scalar(255,255,0), 3);
			if(!cvSaveImage("mm2.jpg",frame)) printf("Could not save: %s\n", "mm1.jpg");
			std::cout<<"Changed:"<<r.x <<"   "<<r.y<<"  "<<r.width<<"   "<<r.height<<std::endl; 
		}
		else frame = MeanSift(frame,r);
		//cvRectangle(frame, r.tl(), r.br(), cv::Scalar(0,255,0), 3);
		cvShowImage("HogSiftDemo", frame);
		waitKey(33);
	}
	cvReleaseCapture( &capture );
	cvDestroyWindow("HogSiftDemo");
	return 0;
}
Rect ObjectDectd(IplImage* frame,int object,Rect r)
{
	HOGDescriptor hog;
	hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
	Mat img;
	img = frame;  
	fflush(stdout);
	vector<Rect> found, found_filtered;
	double t = (double)getTickCount();
	//int can = img.channels();
	hog.detectMultiScale(img, found, 0, Size(8,8), Size(32,32), 1.05, 2);
	t = (double)getTickCount() - t;
	printf("tdetection time = %gms\n", t*1000./cv::getTickFrequency());
	size_t i, j;
	if(found.size()!=0)
	{
		//object = 1;
		for( i = 0; i < found.size(); i++ )
		{
			r = found[i];
			for( j = 0; j < found.size(); j++ )
				if( j != i && (r & found[j]) == r)
					break;
			if( j == found.size() )
				found_filtered.push_back(r);
		}
		for( i = 0; i < found_filtered.size(); i++ )
		{
			r = found_filtered[i];
			r.x += cvRound(r.width*0.1);
			r.width = cvRound(r.width*1);
			r.y += cvRound(r.height*0.07);
			r.height = cvRound(r.height*0.8);
			//cvRectangle(frame, r.tl(), r.br(), cv::Scalar(0,255,0), 3);
		}
	}
	return r;
}
IplImage *image = 0, *hsv = 0, *hue = 0, *mask = 0, *backproject = 0, *histimg = 0;
CvHistogram *hist = 0;
int backproject_mode = 0;
int select_object = 0;
int show_hist = 1;
CvPoint origin;
CvRect selection;
CvRect track_window;
CvBox2D track_box;
CvConnectedComp track_comp;
int hdims = 16;
float hranges_arr[] = {0,180};
float* hranges = hranges_arr;
int vmin = 10, vmax = 256, smin = 30;
int i, bin_w, c;
CvScalar hsv2rgb( float hue )
{
	int rgb[3], p, sector;
	static const int sector_data[][3]=
	{{0,2,1}, {1,2,0}, {1,0,2}, {2,0,1}, {2,1,0}, {0,1,2}};
	hue *= 0.033333333333333333333333333333333f;
	sector = cvFloor(hue);
	p = cvRound(255*(hue - sector));
	p ^= sector & 1 ? 255 : 0;
	rgb[sector_data[sector][0]] = 255;
	rgb[sector_data[sector][1]] = 0;
	rgb[sector_data[sector][2]] = p;
	return cvScalar(rgb[2], rgb[1], rgb[0],0);
}
IplImage* MeanSift(IplImage *frame,Rect r)
{
	if( !image )
	{
		/* allocate all the buffers */
		image = cvCreateImage( cvGetSize(frame), 8, 3 );
		image->origin = frame->origin;
		hsv = cvCreateImage( cvGetSize(frame), 8, 3 );
		hue = cvCreateImage( cvGetSize(frame), 8, 1 );
		mask = cvCreateImage( cvGetSize(frame), 8, 1 );
		backproject = cvCreateImage( cvGetSize(frame), 8, 1 );
		hist = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, &hranges, 1 );
	}
	cvCopy( frame, image, 0 );
	cvCvtColor( image, hsv, CV_BGR2HSV );
	if( track_object )
	{
		int _vmin = vmin, _vmax = vmax;
		cvInRangeS( hsv, cvScalar(0,smin,MIN(_vmin,_vmax),0),
			cvScalar(180,256,MAX(_vmin,_vmax),0), mask );
		cvSplit( hsv, hue, 0, 0, 0 );
		if( track_object < 0 )
		{
			selection.height = r.height;
			selection.width = r.width;
			selection.x = r.x;
			selection.y = r.y;

			float max_val = 0.f;
			cvSetImageROI( hue, selection );
			cvSetImageROI( mask, selection );
			cvCalcHist( &hue, hist, 0, mask );
			cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 );
			cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 );
			cvResetImageROI( hue );
			cvResetImageROI( mask );
			track_window = selection;
			track_object = 1;
		}
		cvCalcBackProject( &hue, backproject, hist );
		cvAnd( backproject, mask, backproject, 0 );
		cvCamShift( backproject, track_window,
			cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ),
			&track_comp, &track_box );
		track_window = track_comp.rect;
		if( !image->origin )
			track_box.angle = -track_box.angle;
		//cvEllipseBox( image, track_box, CV_RGB(255,0,0), 3, CV_AA, 0 );
		Rect r;  
		r.x = track_comp.rect.x - 5;
		r.width = track_comp.rect.height -20 ;
		r.y = track_comp.rect.y - 20;
		r.height = track_comp.rect.width +100;
		cvRectangle(image, r.tl(), r.br(), cv::Scalar(0,255,0), 3);
	}
	return image;
}
测试视频:http://download.csdn.net/detail/sfe1012/7777977

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值