1

얼굴의 피부를 채색해야합니다 ... 어떻게 피부색을 찾으십니까?ios 5의 소스 이미지에서 얼굴의 피부색을 어떻게 감지합니까?

는 이제 아직도 내가 색 특정 색상 범위에 의해 피부에 맞게 조정 일치하는 문제에 직면하고있다 ... RGB 화소 값으로 피부색을 얻기하지만 여전히 얼굴 일부 영역 색상의 내 범위에 해당하지 그때는 ...

내 문제에 대해 ... 그 지역은 또한 색깔, 얼굴 영역 이외의

가 그 지역을 떨어질 수 있습니다 ..

어떤 생각을 그 지역 색상되지 않는다

미리 감사드립니다 ....

,451,515,

MY 코드 :

-(void)colorImageBySliderValue:(float)value WithImage:(UIImage*)needToModified 
{ 

    CGContextRef ctx; 

    CGImageRef imageRef = needToModified.CGImage; 
    NSUInteger width = CGImageGetWidth(imageRef); 
    NSUInteger height = CGImageGetHeight(imageRef); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    unsigned char *rawData = malloc(self.sourceImage.image.size.height * self.sourceImage.image.size.width * 10); 
    NSUInteger bytesPerPixel = 4; 
    NSUInteger bytesPerRow = bytesPerPixel * self.sourceImage.image.size.width; 
    NSUInteger bitsPerComponent = 8; 
    CGContextRef context1 = CGBitmapContextCreate(rawData, self.sourceImage.image.size.width, self.sourceImage.image.size.height, 
                bitsPerComponent, bytesPerRow, colorSpace, 
                kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colorSpace); 

    CGContextDrawImage(context1, CGRectMake(0, 0, self.sourceImage.image.size.width, self.sourceImage.image.size.height), imageRef); 

    NSLog(@"%d::%d",width,height); 


    for(int ii = 0 ; ii < 768 * 1024 ; ii+=4) 
    { 

     int R = rawData[ii]; 
     int G = rawData[ii+1]; 
     int B = rawData[ii+2]; 

     //  NSLog(@"%d %d %d", R, G, B); 
      if(((R>60)&&(R<237)) || ((G>10)&&(G<120))||((B>4) && (B<120))) 
//  if(((R>100)&&(R<186)) || ((G>56)&&(G<130))||((B>30) && (B<120))) 
//  if(((R>188)&&(R<228)) || ((G>123)&&(G<163))||((B>85) && (B<125))) 
      //  if(((R>95)&&(R<220)) || ((G>40)&&(G<210))||((B>20) && (B<170))) 
     { 


      rawData[ii+1]=R;//13; 
      rawData[ii+2]=G;//43; 
      rawData[ii+3]=value;//63 
      //   NSLog(@"entered"); 
     } 
    } 


    ctx = CGBitmapContextCreate(rawData, 
           CGImageGetWidth(imageRef), 
           CGImageGetHeight(imageRef), 
           8, 
           CGImageGetBytesPerRow(imageRef), 
           CGImageGetColorSpace(imageRef), 
           kCGImageAlphaPremultipliedLast); 

    imageRef = CGBitmapContextCreateImage(ctx); 
    UIImage* rawImage = [UIImage imageWithCGImage:imageRef]; 
    UIImageView *ty=[[UIImageView alloc]initWithFrame:CGRectMake(100, 200, 400, 400)]; 
    ty.image=rawImage; 
    [self.view addSubview:ty]; 
    CGContextRelease(context1); 
    CGContextRelease(ctx); 
    free(rawData); 
} 

감사합니다,

SpyNet에

My output image...

Another sample

답변

1

하나가 원본 이미지이며, 다른 하나는있는 두 개의 이미지를 만들 수 있습니다 수정 된 이미지 픽셀 만 고치면 ... 및 원래 이미지 위에 수정 된 픽셀을 먼저 추가하여 이미지 위에 오버레이합니다.

for (int index=0; index<length; index+=4) 
     { 
      if (data2[index]==data1[index]) 
      { 
       data1[index]=data2[index]; 
       data1[index+1]=data2[index+1];//aRed+value;//aRed;//13; 
       data1[index+2]=data2[index+2];//aGreen;//aGreen;//43; 
       data1[index+3]=data2[index+3]; 
      }