BIld an bestimmten Punkt schneiden/auschneiden

  • - drawInRect:blendMode:alpha (UIImage) ist da sehr ähnlich. ;)

    Ansonsten: was spricht dagegen, einfach mal -drawInRect: auszuprobieren? Wenn es doch schon da ist...
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Ich habe jetzt beides ausprobiert. Aber bei beiden verkleinert der mir das ganze Bild statt nur den Kopf. Hier mein Code:

    Quellcode

    1. for(CIFaceFeature *feature in features)
    2. {
    3. CGFloat xBounds = feature.bounds.origin.x;
    4. CGFloat yBounds = feature.bounds.origin.y;
    5. CGFloat heightBounds = feature.bounds.size.height;
    6. CGFloat widthBounds = feature.bounds.size.width;
    7. UIImage *transformImage = [UIImage imageWithCIImage:image];
    8. UIGraphicsBeginImageContext(cameraView.image.size);
    9. [transformImage drawInRect:CGRectMake(xBounds, yBounds, widthBounds, heightBounds)];
    10. UIImage *endImage = UIGraphicsGetImageFromCurrentImageContext();
    11. cameraView.image = endImage;
    12. UIGraphicsEndImageContext();
    13. }
    Alles anzeigen


    Edit: Danke robin_ für den Tipp!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von AppleDeveloper ()

  • Was ist Bild und was ist Kopf?
    Natürlich wird alles verkleinert - das übergebene Rect entspricht doch dem gesamten Bild.
    Nämlich das Bild, welches du in
    UIImage *transformImage = [UIImage imageWithCIImage:image];
    definiert hast.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • drawInRect: zeichnet natürlich das komplette Image in das angegeben Rect.

    Wenn Du also nur einen Teil eines 100 x 100 Pixel Bildes haben möchtest, sagen wie mal 50 x 50 Pixel ab dem Punkt 10,15 im Bild, dann musst Du das drawRect entsprechend umrechnen, also ein CGRect mit den Werten -10, -15, 100, 100 verwenden, wobei der ImageContext natürlich eine Größe von 50 x 50 Pixeln hat.
  • MCDan ich habe jetzt deinen Tipp befolgt. Aber trotzdem bekomme ich nicht das ganze Gesicht ausgeschnitten. Was mache ich falsch? Hier mein Code:

    Quellcode

    1. UIImage *transformImage = cameraView.image;
    2. CGSize size = CGSizeMake(widthBounds, heightBounds);
    3. UIGraphicsBeginImageContext(size);
    4. [transformImage drawInRect:CGRectMake(-xBounds, -yBounds, cameraView.image.size.width, cameraView.image.size.height)];
    5. UIImage *EndImage = UIGraphicsGetImageFromCurrentImageContext();
    6. cameraView.image = EndImage;
    7. UIGraphicsEndImageContext();

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von AppleDeveloper ()

  • Da kann man mit dem o.a. Code natürlich schlecht helfen.

    Evtl. ist size zu klein, um das ganze Gesicht aufzunehmen. Evtl. passt der Offset, also xBounds und yBounds nicht richtig.

    Poste doch mal das original Bild und den Ausschnitt, den Du gerne als Ergebnis haben möchtest. Wird der Ausschnitt immer an der gleichen Position in gleicher Größe ausgeschnitten, oder kann der User dies einstellen?
  • Das Bild soll automatisch nach Gesichtserkennung geschnitten werden. Das heißt, es soll der ganze Kopf der Person ausgeschnitten werden. Nur leider funktioniert dies wie gesagt nicht. Hier mein Code dafür:
    ViewController.h:

    Quellcode

    1. #import <UIKit/UIKit.h>
    2. #import <MobileCoreServices/MobileCoreServices.h>
    3. @interface ViewController : UIViewController
    4. <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
    5. {
    6. UIImageView *cameraView;
    7. BOOL newMedia;
    8. }
    9. @property (strong, nonatomic) IBOutlet UIImageView *cameraView;
    10. @property (strong, nonatomic) IBOutlet UILabel *lbMouth;
    11. @property (strong, nonatomic) CIImage *cImage;
    12. - (IBAction)cameraClicked:(id)sender;
    13. - (IBAction)analysePicture:(id)sender;
    14. - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info;
    15. -(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;
    16. @end
    Alles anzeigen

    ViewController.m:

    Quellcode

    1. #import "ViewController.h"
    2. #import <QuartzCore/QuartzCore.h>
    3. #import <CoreImage/CoreImage.h>
    4. @interface ViewController ()
    5. @end
    6. @implementation ViewController
    7. @synthesize cameraView;
    8. @synthesize lbMouth;
    9. @synthesize cImage;
    10. - (void)viewDidLoad
    11. {
    12. [super viewDidLoad];
    13. // Do any additional setup after loading the view, typically from a nib.
    14. }
    15. - (void)didReceiveMemoryWarning
    16. {
    17. [super didReceiveMemoryWarning];
    18. // Dispose of any resources that can be recreated.
    19. }
    20. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    21. {
    22. return YES;
    23. }
    24. - (IBAction)cameraClicked:(id)sender
    25. {
    26. if ([UIImagePickerController isSourceTypeAvailable:
    27. UIImagePickerControllerSourceTypeCamera])
    28. {
    29. UIImagePickerController *imagePicker =[[UIImagePickerController alloc] init];
    30. imagePicker.delegate = self;
    31. imagePicker.sourceType =UIImagePickerControllerSourceTypeCamera;
    32. imagePicker.mediaTypes = [NSArray arrayWithObjects:(NSString *) kUTTypeImage,nil];
    33. imagePicker.allowsEditing = NO;
    34. [self presentViewController:imagePicker animated:YES completion:nil];
    35. }
    36. }
    37. - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
    38. {
    39. [self dismissViewControllerAnimated:YES completion:nil];
    40. UIImage *uImage = [info objectForKey:UIImagePickerControllerOriginalImage];
    41. cameraView.image = uImage;
    42. UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    43. CGFloat rotationDegrees = 0.;
    44. switch (orientation) {
    45. case UIDeviceOrientationPortrait:
    46. rotationDegrees = -90.;
    47. break;
    48. case UIDeviceOrientationPortraitUpsideDown:
    49. rotationDegrees = 90.;
    50. break;
    51. case UIDeviceOrientationLandscapeLeft:
    52. rotationDegrees = 180.;
    53. break;
    54. case UIDeviceOrientationLandscapeRight:
    55. rotationDegrees = 0.;
    56. break;
    57. case UIDeviceOrientationFaceUp:
    58. case UIDeviceOrientationFaceDown:
    59. default:
    60. break; // leave the layer in its last known orientation
    61. }
    62. UIGraphicsBeginImageContext(cameraView.image.size);
    63. [uImage drawInRect:CGRectMake(0, 0, cameraView.image.size.width,cameraView.image.size.height)];
    64. CGContextRef ctx = UIGraphicsGetCurrentContext();
    65. CGContextRotateCTM(ctx, rotationDegrees);
    66. UIImage *endImage = UIGraphicsGetImageFromCurrentImageContext();
    67. cameraView.image = endImage;
    68. cImage = [[CIImage alloc] initWithImage:endImage];
    69. UIGraphicsEndImageContext();
    70. }
    71. -(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
    72. {
    73. [self dismissViewControllerAnimated:YES completion:nil];
    74. }
    75. - (IBAction)analysePicture:(id)sender
    76. {
    77. if (cameraView.image == NULL) {
    78. NSLog(@"Kein Bild vorhanden");
    79. } else {
    80. CIImage *image = cImage;
    81. CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:[NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy]];
    82. NSArray *features = [detector featuresInImage:image];
    83. for(CIFaceFeature *feature in features)
    84. {
    85. CGFloat xBounds = feature.bounds.origin.x;
    86. CGFloat yBounds = feature.bounds.origin.y;
    87. CGFloat heightBounds = feature.bounds.size.height;
    88. CGFloat widthBounds = feature.bounds.size.width;
    89. UIImage *transformImage = cameraView.image;
    90. CGSize size = CGSizeMake(widthBounds, heightBounds);
    91. UIGraphicsBeginImageContext(size);
    92. [transformImage drawInRect:CGRectMake(-xBounds, -yBounds, cameraView.image.size.width, cameraView.image.size.height)];
    93. UIImage *endImage = UIGraphicsGetImageFromCurrentImageContext();
    94. cameraView.frame = CGRectMake(cameraView.frame.origin.x, cameraView.frame.origin.y, widthBounds, heightBounds);
    95. cameraView.image = endImage;
    96. UIGraphicsEndImageContext();
    97. }
    98. CIImage *endCIImage = cameraView.image.CIImage;
    99. CIDetector *endDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:[NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy]];
    100. NSArray *Endfeatures = [detector featuresInImage:endCIImage];
    101. for (CIFaceFeature *feature in Endfeatures){
    102. if(feature.hasMouthPosition)
    103. {
    104. lbMouth.text = [NSString stringWithFormat:@"%f", feature.mouthPosition.x];
    105. NSLog(@"es geht");
    106. } else {
    107. lbMouth.text = @"Geht nicht!";
    108. }
    109. }
    110. }
    111. }
    112. @end
    Alles anzeigen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von AppleDeveloper ()

  • Schau Dir mal diesen Artikel bobmccune.com/2012/03/22/ios-5…etection-with-core-image/ und die Sample App an. Die Face Detection scheint wirklich nur das Gesicht und nicht den kompletten Kopf zu erkennen.

    Weiterhin scheint CIFaceFeature auch das PDF Koordinatensystem, also unten links zu verwenden, so dass Du die Koordinaten umrechnen musst, wenn Du ein UIImage per drawInRect: zeichnen möchtest.