物体识别

来源:互联网 发布:仙剑三mac打不开 编辑:程序博客网 时间:2024/05/01 09:59

#include "cv.h"
#include "highgui.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h> //用于防御式编程
#include <math.h>
#include <float.h>//<float.h>与<limits.h>一样是定义边界值的,<float.h>定义的是浮点数的边界值
#include <limits.h>
#include <time.h>
#include <ctype.h>//在调用字符函数时,在源文件中包含的头文件
static CvMemStorage *storage = 0;
static CvHaarClassifierCascade *cascade = 0;//harr 分类器级联的内部标识形式
//const char *cascade_name ="F://OpenCV//OpenCV//data//haarcascades//haarcascade_frontalface_alt2.xml";
const char *cascade_name ="D://boost//xml.xml";
void change(int x1,int y1,int x2,int y2,IplImage *img)
{
 unsigned char *data=(unsigned char *)img->imageData;
 int step=img->widthStep;
 int c=img->nChannels;
 for(int j=y1;j<y2;j++)
 for(int i=x1;i<x2;i++)
  for(int k=0;k<c;k++)
  data[j*step+i*c+k]=255;
}
int main()
{
 IplImage *img=cvLoadImage("first.bmp",1);
 cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0);
 storage = cvCreateMemStorage(0);//创建内存块
 CvSeq *face = cvHaarDetectObjects(img, cascade,storage,1.1,2,0,cvSize(30, 30));
 if(!cascade)
  printf("没有相应的文件/n");
 else
  printf("找到了相应的文件/n");
 if(face==0)
  printf("没有检测到/n");
 else
  printf("已经检测到了/n");
 
 cvNamedWindow("first",2);
 cvShowImage("first",img);
 double scale = 1.1;
 static CvScalar colors[] =
   {
  {{0,0,255}},
  {{0,128,255}},
  {{0,255,255}},
  {{0,255,0}},
  {{255,128,0}},
  {{255,255,0}},
  {{255,0,0}},
  {{255,0,255}}
   };
 int n=face?face->total:0;
 if(n==0)
  printf("检测失败/n");
 else
  printf("检测到了%d个目标/n",n);
   for (int i = 0; i < (face ? face->total : 0); i++)
   {
     //返回索引所指定的元素指针
     CvRect *r = (CvRect*)cvGetSeqElem(face, i);
  if(!r)
   printf("无法构成矩形/n");
  else
   printf("可以构成矩形/n");
     //用矩形
     //确定两个点来确定人脸位置因为用cvRetangle
     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;
     //画出矩形
    cvRectangle( img, pt1, pt2, colors[i%8], 3, 8, 0 );
  //change(pt1.x,pt1.y,pt2.x,pt2.y,img);
   }
   cvNamedWindow("second",2);
   cvShowImage("second",img);
   cvWaitKey(0);
 return 0;
}