最近在写一个多摄像头下的多目标跟踪系统,需要自己通过人体检测+人脸识别来确定初始跟踪目标,很显然,这里会有很多地方会用到ROI,我的思路是先用人体检测检测出人体部分,再对人体部分应用人脸检测,再进行人脸识别,确定身份之后再判断是否跟踪该目标,每一次检测出的区域都会用到ROI,这里需要说的是,这里有几个图像函数,cvCopy()、cvCopyImage()、cvCloneImage(),如果设置了ROI,则前两个函数只复制ROI区域,最后一个函数会复制原始的整幅图像。以下是我的人脸检测函数:
void VideoHandler::FaceDetect(IplImage* inimage, IplImage* outimage)
{
std::vector<Rect> faces;
//最多可存放4个通道的像素值
static CvScalar colors[] =
{
{ { 0, 0, 255 } },
{ { 0, 255, 0 } }
}; //定义为静态变量使得该数组在每一次函数调用时都保持上一次调用的状态
float scale = 1.3;
IplImage* gray = cvCreateImage(cvSize(inimage->roi->width,inimage->roi->height ), 8, 1);//图像位深度为8,单通道,,存放灰度图和输入图像同样大小
/*typedef struct CvSize
{
int width; //矩形宽
int height; // 矩形高
}CvSize;
*/
if (inimage->nChannels == 3)//如果输入图像为三通道图像,则转换为单通道图像
{
cvCvtColor(inimage, gray, CV_BGR2GRAY);
}
else