calculateObject.mm 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //
  2. // calculateObject.m
  3. // CZRemote
  4. //
  5. // Created by archie on 17/6/1.
  6. // Copyright © 2017年 Facebook. All rights reserved.
  7. //
  8. //核心头文件
  9. #import <opencv2/opencv.hpp>
  10. //对iOS支持
  11. #import <opencv2/imgcodecs/ios.h>
  12. //导入矩阵帮助类
  13. #import <opencv2/highgui.hpp>
  14. #import <opencv2/core/types.hpp>
  15. #import "calculateObject.h"
  16. #import <iostream>
  17. using namespace std;
  18. using namespace cv;
  19. @implementation calculateObject
  20. +(void)recognitionFace:(UIImage *)img completion:(void (^)(int faces,CGRect rect))done{
  21. NSString *pstrCascadeFileName =[[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_alt" ofType:@"xml"];
  22. CvHaarClassifierCascade *pHaarCascade=(CvHaarClassifierCascade*)cvLoad([pstrCascadeFileName cStringUsingEncoding:NSASCIIStringEncoding],NULL,NULL,NULL);
  23. CvMemStorage*pcvMStorage = cvCreateMemStorage(0);
  24. cvClearMemStorage(pcvMStorage);
  25. IplImage*grayImage=[self createIplImage:img WithChannel:1];
  26. CvSeq *Faces = cvHaarDetectObjects(grayImage,pHaarCascade,pcvMStorage);
  27. if (Faces->total==1) {
  28. CvRect* r = (CvRect*)cvGetSeqElem(Faces, 0);
  29. done(Faces->total,CGRectMake(r->x, r->y, r->width, r->height));
  30. }else{
  31. done(Faces->total,CGRectZero);
  32. }
  33. // for(int i = 0; i <Faces->total; i++)
  34. // {
  35. // CvRect* r = (CvRect*)cvGetSeqElem(Faces, i);
  36. // CvPoint center;
  37. // int radius;
  38. // center.x = cvRound((r->x + r->width * 0.5));
  39. // center.y = cvRound((r->y + r->height * 0.5));
  40. // radius = cvRound((r->width + r->height) * 0.25);
  41. //
  42. // NSLog(@"中心x:%d,中心y:%d,半径:%d",center.x,center.y,radius);
  43. // }
  44. cvReleaseHaarClassifierCascade(&pHaarCascade);
  45. cvReleaseMemStorage(&pcvMStorage);
  46. cvReleaseImage(&grayImage);
  47. }
  48. /*灰度图*/
  49. +(IplImage*)createIplImage:(UIImage*)img WithChannel:(int)channels {
  50. CGImageRef OldImageRef=img.CGImage;
  51. CGColorSpaceRef space=CGColorSpaceCreateDeviceRGB();
  52. IplImage*NewImage=cvCreateImage(cvSize(img.size.width, img.size.height), IPL_DEPTH_8U, 4);
  53. CGContextRef contextRef=CGBitmapContextCreate(NewImage->imageData, NewImage->width, NewImage->height, NewImage->depth, NewImage->widthStep, space, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault);
  54. CGContextDrawImage(contextRef, CGRectMake(0, 0, img.size.width, img.size.height), OldImageRef);
  55. CGColorSpaceRelease(space);
  56. CGContextRelease(contextRef);
  57. IplImage*grayImg=cvCreateImage(cvGetSize(NewImage), NewImage->depth, channels);
  58. cvCvtColor(NewImage, grayImg, channels==1?CV_RGBA2GRAY:CV_RGBA2BGR);
  59. cvReleaseImage(&NewImage);
  60. return grayImg;
  61. }
  62. @end