2016-08-24 5 views
2

카메라에서 직사각형 이미지를 자르기 위해 iOS 앱에서 작업 중입니다. 그리고 CIDetector를 사용하여 직사각형을 잘라내어 CIFilter를 사용하여 직사각형 이미지를 자릅니다. 그러나 필터를 적용한 후에는 결과 이미지 품질이 매우 떨어집니다.CIFilter 적용시 이미지가 흐려짐

다음은 아래 코드입니다.

나는 다음 대리자 메서드

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{ 


      UIImage *image = [self imageFromSampleBuffer:sampleBuffer]; 

     // Convert into CIIImage to find the rectfeatures. 

      self.sourceImage = [[CIImage alloc] initWithCGImage:[self imageFromSampleBuffer:sampleBuffer].CGImage options:nil]; 

     } 



    - (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer 
    { 

     CVPixelBufferRef pb = CMSampleBufferGetImageBuffer(sampleBuffer); 
     CIImage *ciimg = [CIImage imageWithCVPixelBuffer:pb]; 

     // show result 
     CIContext *context = [CIContext contextWithOptions:nil]; 
     CGImageRef ref = [context createCGImage:ciimg fromRect:ciimg.extent]; 

     UIImage *image = [UIImage imageWithCGImage:ref scale:1.0 orientation:(UIImageOrientationUp)]; 

     CFRelease(ref); 

     return (image); 
    } 

에서 비디오 캡처 출력을 얻고있다 그리고 나는 0.2 초 동안 촬영 된 소스 이미지에서 RECT 기능을 감지 시작됩니다 백그라운드에서 NSTimer를 실행하고

- (void)performRectangleDetection:(CIImage *)image{ 

      if(image == nil) 
       return; 

      NSArray *rectFeatures = [self.rectangleDetector featuresInImage:image]; 


      if ([rectFeatures count] > 0) { 

       [self capturedImage:image]; 

      } 
     } 




-(void)capturedImage:(CIImage *)image 
     { 
      NSArray *rectFeatures = [self.rectangleDetector featuresInImage:image]; 
        CIImage *resultImage = [image copy]; 
        for (CIRectangleFeature *feature in rectFeatures) { 


         resultImage = [image imageByApplyingFilter:@"CIPerspectiveCorrection" 
               withInputParameters:@{@"inputTopLeft":[CIVector vectorWithCGPoint:feature.topLeft] , 
                    @"inputTopRight": [CIVector vectorWithCGPoint:feature.topRight], 
                    @"inputBottomLeft": [CIVector vectorWithCGPoint:feature.bottomLeft], 
                    @"inputBottomRight": [CIVector vectorWithCGPoint:feature.bottomRight]}]; 



        } 


     UIImage *capturedImage = [[UIImage alloc] initWithCIImage: resultImage]; 
     UIImage *finalImage = [self imageWithImage:capturedImage scaledToSize:capturedImage.size]; 

     } 

finalImage이 방법

- (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize { 

      UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0); 
      [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
      UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 

      return newImage; 
     } 
에 전송 한 후에 검색 될

최종 이미지 품질이 때때로 흐려집니다. 그것은 필터 때문에 또는 카메라 출력 이미지 때문에입니까? Pls이 해결하는 데 도움이.

답변

1

최종 이미지를 정확한 배율로 다시 만들지는 않았을 수 있습니다. 이 문제가 해결되지 않는 경우

UIImage *finalImage = [UIImage imageWithCGImage:resultImage 
              scale:original.scale 
            orientation:original.imageOrientation]; 

는 카메라 입력으로부터 더 많은 코드 샘플을 제공하고, 제발 당신이있는 UIImage에 필터에서 최종 CIImage 변환 방법에 대해 설명합니다.

+0

내가 카메라 대리자 메서드 에서 소스의 CGImage 무엇입니까 작물 이미지에 다음과 같은 방법을 사용 - (무효) captureOutput : (AVCaptureOutput *) captureOutput didOutputSampleBuffer : (CMSampleBufferRef) sampleBuffer fromConnection : (AVCaptureConnection를 *) connection 그리고이 CIImage 위의 메서드를 rect 이미지를 사용하여 자른 된 이미지를 얻으려면 보내고 있습니다. 그러나 결과 CGImage가 흐려지는 경우가 있습니다. – iOS

+0

질문을 편집하고 captureOutput에서 변환하는 방법에 대한 실제 코드 샘플을 제공하고 최종 CGImage를 보는 방법을 제공 할 수 있습니까? 여기에있는 문제는 필터 자체가 아니라 사전 프로세스/사후 프로세스와 관련된 것일 수도 있습니다. –

+0

내 질문을 편집했습니다. Pls가 찾아 어디서 문제가 될지 알려주세요. 감사합니다. – iOS

0

-(UIImage*)cropImage:(UIImage*)image withRect:(CGRect)rect { 
     CGImageRef cgImage = CGImageCreateWithImageInRect(image.CGImage, rect); 
     UIImage *cropedImage = [UIImage imageWithCGImage:cgImage]; 
     return cropedImage; 
    } 
+0

또한 원본 이미지에서 rect 이미지를 자르려면이 방법을 시도했지만 CIDetector에서 얻는 rect 기능은 정확한 사각형을 자르지 않습니다. 이미지의 일부만 자르기. – iOS