//实现利用Camshift跟踪多个目标,
//初始化目标可以利用Adboost或者手动选取
//无法解决运动遮挡问题?
//再次启动Adboost的条件选择问题?
//没有合适的运动预测方法?
//在预测点如果确认目标?
#ifdef _CH_
#pragma package <opencv>
#endif
#ifndef _EiC
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <iostream.h>
#include <ctype.h>
#endif
IplImage *image = 0, *temp = 0, *maskimg = 0, *mask = 0, *grey = 0;
CvVideoWriter* videowrite;
static CvMemStorage* storage = 0;
static CvHaarClassifierCascade* cascade = 0;
const char* cascade_name ="D:/opencv manual/OpenCV5.0/data/haarcascades/haarcascade_frontalface_alt2.xml";
int backproject_mode = 0;
int select_object = 0;
int track_object = 0;
int numdraw=0;
CvPoint origin;
CvRect selection;
CvRect track_window[]={0,0,0,0,0,0,0,0};
CvPoint p1,p2;
CvBox2D track_box;
CvConnectedComp track_comp;
typedef struct Tracker
{
int Curwidth;
int Curheight;
CvPoint prepoint;
CvPoint curpoint;
CvPoint nextpoint;
}tracker1,tracker2;
typedef struct STATE
{
int size;
int order;
};
STATE state[2];
//STATE ;
void on_mouse( int event, int x, int y, int flags, void* param )
{
if( !image )
return;
if( image->origin )
y = image->height - y;
if( select_object )
{
selection.x = MIN(x,origin.x);
selection.y = MIN(y,origin.y);
selection.width = selection.x + CV_IABS(x - origin.x);
selection.height = selection.y + CV_IABS(y - origin.y);
selection.x = MAX( selection.x, 0 );
selection.y = MAX( selection.y, 0 );
selection.width = MIN( selection.width, image->width );
selection.height = MIN( selection.height, image->height );
selection.width -= selection.x;
selection.height -= selection.y;
}
switch( event )
{
case CV_EVENT_LBUTTONDOWN:
origin = cvPoint(x,y);
selection = cvRect(x,y,0,0);
select_object = 1;
break;
case CV_EVENT_LBUTTONUP:
select_object = 0;
if( selection.width > 0 && selection.height > 0 )
track_object = -1;
break;
}
}
long PixelOffset(IplImage *img,int i, int j)
{
long Offset;
CvSize imgsize=cvGetSize(img);
int N=img->nChannels;
Offset=i*imgsize.width*N+j*N;
return Offset;
}
void RecursiveCal(IplImage *img, int x, int y, int &PixelNum, int num)
{
long Offset;
int width=0,height=0,tempy=0,tempx=0;
Offset=PixelOffset(img,x,y);
CvSize imgsize=cvGetSize(img);
width=imgsize.width;
height=imgsize.height;
//if the pixel is white
if(*(img->imageData+Offset)==-1)
{
//把当前点大小设置成为序号值
*(img->imageData+Offset++)=num;
if(img->nChannels==3)
{
*(img->imageData+Offset++)=num;
*(img->imageData+Offset++)=num;
}
//象素个数加1
PixelNum++;
//递归当前上面的点
tempy=y-1;
tempx=x;
if(tempy>-1&&tempy<width && tempx>-1&&tempx<height)
RecursiveCal(img, tempx,tempy,PixelNum, num);
//递归当前下面的点
tempy=y+1;
tempx=x;
if(tempy>-1&&tempy<width && tempx>-1&&tempx<height)
RecursiveCal(img, tempx,tempy,PixelNum, num);
//递归当前上面的点
tempy=y;
tempx=x-1;
if(tempy>-1&&tempy<width && tempx>-1&&tempx<height)
RecursiveCal(img, tempx,tempy,PixelNum, num);
//递归当前上面的点
tempy=y;
tempx=x+1;
if(tempy>-1&&tempy<width && tempx>-1&&tempx<height)
RecursiveCal(img, tempx,tempy,PixelNum, num);
}
}
void DelFalseArea(IplImage *img)
{
int PixelNum[255];
int width;
int height;
long lOffset;
CvSize ImgSize;
ImgSize=cvGetSize(img);
width=ImgSize.width;
height=ImgSize.height;
for(int i=0;i<255;i++)
PixelNum[i]=0;
int calNum=1;
for(i=0;i<height;i++)
for(int j=0;j<width;j++)
{
lOffset = PixelOffset(img,i,j);
if((uchar)*(img->imageData+lOffset)==255)
{
RecursiveCal(img,i,j,PixelNum[calNum],calNum);
calNum++;
}
}
for(i=0;i<calNum;i++)
{
if(PixelNum[i]<150)
PixelNum[i]=0;
}
for(i=0;i<height;i++)
for(int j=0;j<width;j++)
{
lOffset=PixelOffset(img,i,j);
int num=*(img->imageData+lOffset);
if(num!=0)
{
if(PixelNum[num]==0)
{
*(img->imageData+lOffset++)=0;
if(img->nChannels==3)
{
*(img->imageData+lOffset++)=0;
*(img->imageData+lOffset++)=0;
}
}
else
{
*(img->imageData+lOffset++)=(char)255;
if(img->nChannels==3)
{
*(img->imageData+lOffset++)=(char)255;
*(img->imageData+lOffset++)=(char)255;
}
}
}
}
}
void FindContours(IplImage* frame)
{
//------------------表示出目标的轮廓--------------------//
numdraw=0;
CvSeq* m_contour = 0;
IplImage* temp=cvCreateImage(cvGetSize(frame),8,1);
CvMemStorage* m_storage = cvCreateMemStorage(0);
CvRect m_contour_rect;
if(frame->nChannels==3)
cvCvtColor( frame, temp, CV_BGR2GRAY );
cvFindContours( temp,m_storage, &m_contour, sizeof(CvContour),
CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
cvZero(mask);
for( ; m_contour != 0; m_contour = m_contour->h_next )
{
CvScalar color = CV_RGB( 255,255, 255);
//CvScalar color_rect = CV_RGB( 255, 255, 0);
m_contour_rect = cvBoundingRect(m_contour, 1);
int contour_width=m_contour_rect.width,contour_height=m_contour_rect.height;
if(((double)contour_height/(double)contour_width)>0.8
&&((double)contour_height/(double)contour_width)<2.5)
{
double area=fabs(cvContourArea(m_contour));
if(area >150.0&&area/(double)(contour_width*contour_height)>0.4)
{
/* cvRectangle(m_Ipl, cvPoint(m_contour_rect.x, m_contour_rect.y),
cvPoint((m_contour_rect.x + m_contour_rect.width),
(m_contour_rect.y + m_contour_rect.height)), color_rect, 2, 8, 0);
replace CV_FILLED with 1 to see the outlines */
cvDrawContours( mask, m_contour, color, color, -1, CV_FILLED, 8, cvPoint(0,0));
numdraw++;
//printf("%d\n",numdraw);
}
}
}
cvReleaseImage(&temp);
}
bool IsFaceColor( IplImage *img )
{
float threshold=0.0;
int facecolor_pix=0;
CvRect rect=cvGetImageROI(img);
int widthstep=img->widthStep;
int channel=img->nChannels;
unsigned char *data= reinterpret_cast<unsigned char *>(img->imageData);
for (int i=0; i<rect.height; i++)
for (int j=0; j<rect.width; j++)
{
int Offset=(i+rect.y)*widthstep+(rect.x+j)*img->nChannels;
int RGB=data[Offset]+data[Offset+1]+data[Offset+2];
if(RGB!=0)
{
facecolor_pix++;
}
}
threshold=float(facecolor_pix)/float(rect.height*rect.width);
if (threshold>0.6)
return(true);
else
return(false);
}
void FindFaces( IplImage* img )
{
cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
if( !cascade )
{
fprintf( stderr, "ERROR: Could not load classifier cascade\n" );
return ;
}
storage = cvCreateMemStorage(0);
int scale = 1;
//cvPyrDown( img, temp, CV_GAUSSIAN_5x5 );
cvClearMemStorage( storage );//Clear the memory block
if( cascade )
{
if( img->origin == IPL_ORIGIN_BL )//0
cvFlip( img, img, 0 );
CvSeq* faces=cvHaarDetectObjects( img, cascade, storage,
1.1, 2, CV_HAAR_DO_CANNY_PRUNING,cvSize(20, 20) );
int g=0;
for(int i = 0; i < (faces ? faces->total : 0); i++ )
{
CvRect *r = (CvRect*)cvGetSeqElem( faces, i );
CvPoint pt1, pt2;
pt1.x = r->x*scale;
pt2.x = (r->x+r->width)*scale;
pt1.y = r->y*scale;
pt2.y = (r->y+r->height)*scale;
cvSetImageROI( img,*r );
if(IsFaceColor(img))
{
//cout<<"the"<<" "<<i+1<<" "<<"is"<<endl;
//cout<<pt1.x<<" "<<pt1.y<<" "<<pt2.x<<" "<<pt2.y<<endl;
cvResetImageROI(img);
cvRectangle( img,
没有合适的资源?快使用搜索试试~ 我知道了~
实现多人脸跟踪的源代码
共10个文件
avi:2个
cpp:2个
ncb:1个
3星 · 超过75%的资源 需积分: 12 41 下载量 57 浏览量
2014-05-20
20:37:33
上传
评论 1
收藏 1.77MB RAR 举报
温馨提示
人脸跟踪是目前比较热的话题,本资源实现视频流的多人脸跟踪,它是基于CAMshift技术,可以直接运行
资源推荐
资源详情
资源评论
收起资源包目录
59371216MultifacesTrackingBasedOnCamshift.rar (10个子文件)
www.pudn.com.txt 218B
MultifacesTrackingBasedOnCamshift
ColorCamshift.dsw 551B
s3.avi 214KB
ColorCamshift.opt 78KB
two-near.cpp 11KB
ColorCamshift.cpp 14KB
ColorCamshift.dsp 4KB
03.avi 1.56MB
ColorCamshift.ncb 81KB
ColorCamshift.plg 1KB
Debug
共 10 条
- 1
资源评论
- weixin_377036482017-12-16不用说了,这个代码肯定也是楼主从其他地方下载下来的,都不知道是哪一年的代码,应该是06年还是07年的。懒得看了,还是自己老老实实学习。好好写代码吧。
- 格里个咯咯2017-06-15太好了可以运行,稍微改几个地方就好了。努力看懂中。。。。
成功者
- 粉丝: 2
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功