2017-08-17 11 views
0

IOSではQRコードをスキャンするためにAVCaptureDeviceを使用しています。 AVCaptureMetadataOutputを使用してカメラの出力をコードに渡してQRコードを認識し、現在はOpen GLビューとは別のビューとしてカメラを表示しています。しかし、カメラプレビュー上に他のグラフィックスを表示したいので、Open GLテクスチャの1つにカメラデータをロードしたいと考えています。IOSのカメラデータをテクスチャにアップロードする

だから、我々はキャプチャデバイスとビューを初期化するために使用している。これは(下)のコードであるカメラから

を生RGBデータを取得する方法があります。

RGBデータにアクセスするためにこれを変更してGLテクスチャの1つにロードするにはどうすればよいですか?私たちは、IOSは、どのテクスチャキャッシュをサポートしているので、あなたは、テクスチャとしてそれを作るために、直接RGBカメラのフレームにアクセスする必要はありませんC++/Objective Cのに

おかげ

ショーン・サザン・

self.captureSession = [[AVCaptureSession alloc] init]; 

NSError *error; 
// Set camera capture device to default and the media type to video. 
AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
// Set video capture input: If there a problem initialising the camera, it will give am error. 
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error]; 

if (!input) 
{ 
    NSLog(@"Error Getting Camera Input"); 
    return; 
} 
// Adding input souce for capture session. i.e., Camera 
[self.captureSession addInput:input]; 

AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init]; 
// Set output to capture session. Initalising an output object we will use later. 
[self.captureSession addOutput:captureMetadataOutput]; 

// Create a new queue and set delegate for metadata objects scanned. 
dispatch_queue_t dispatchQueue; 
dispatchQueue = dispatch_queue_create("scanQueue", NULL); 
[captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue]; 

// Delegate should implement captureOutput:didOutputMetadataObjects:fromConnection: to get callbacks on detected metadata. 
[captureMetadataOutput setMetadataObjectTypes:[captureMetadataOutput availableMetadataObjectTypes]]; 

// Layer that will display what the camera is capturing. 

self.captureLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession]; 
[self.captureLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 

gCameraPreviewView= [[[UIView alloc] initWithFrame:CGRectMake(gCamX1, gCamY1, gCamX2-gCamX1, gCamY2-gCamY1)] retain]; 
[self.captureLayer setFrame:gCameraPreviewView.layer.bounds]; 
[gCameraPreviewView.layer addSublayer:self.captureLayer]; 

UIViewController * lVC = [[[UIApplication sharedApplication] keyWindow] rootViewController]; 
[lVC.view addSubview:gCameraPreviewView]; 

答えて

1

を使用していますあなたよりも速いです。コールバックメソッドで

- (void) writeSampleBuffer:(CMSampleBufferRef)sampleBuffer ofType:(NSString *)mediaType pixel:(CVImageBufferRef)cameraFrame time:(CMTime)frameTime; 

、あなたは私たちが生のデータにCMSampleBufferから変換終了で

CVOpenGLESTextureCacheCreate(...) 
    CVOpenGLESTextureCacheCreateTextureFromImage(...) 
0

以下、これらのパラメータおよび機能を使用してテクスチャを生成することができます(ので、我々は、GLの質感にアップロードできます) このような。それは少し時間がかかりますが、私たちの目的には十分に速かったです。

どんな改善があれば、私が知って喜んでいると思います:)

ショーン

- (void)captureOutput:(AVCaptureFileOutput *)output didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection; 
{ 
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
    CIImage *ciImage = [CIImage imageWithCVPixelBuffer:imageBuffer]; 

    if(!self.context) 
    { 
     self.context = [CIContext contextWithOptions:nil]; //only create this once  
    } 

    int xsize= CVPixelBufferGetWidth(imageBuffer); 
    int ysize= CVPixelBufferGetHeight(imageBuffer); 

    CGImageRef videoImage = [self.context createCGImage:ciImage fromRect:CGRectMake(0, 0, xsize, ysize)];   
    UIImage *image = [[UIImage alloc] initWithCGImage:videoImage]; 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    if(!colorSpace) 
    { 
     return ; 
    } 

    size_t bitsPerPixel = 32; 
    size_t bitsPerComponent = 8; 
    size_t bytesPerPixel = bitsPerPixel/bitsPerComponent; 
    size_t bytesPerRow = xsize * bytesPerPixel; 
    size_t bufferLength = bytesPerRow * ysize; 
    uint32_t * tempbitmapData = (uint32_t *)malloc(bufferLength); 

    if(!tempbitmapData) 
    { 
     CGColorSpaceRelease(colorSpace); 
     return ; 
    } 

    CGContextRef cgcontext = CGBitmapContextCreate(tempbitmapData, xsize, ysize, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast);  
    if(!cgcontext) 
    { 
     free(tempbitmapData); 
     return; 
    } 

    CGColorSpaceRelease(colorSpace); 
    CGRect rect = CGRectMake(0, 0, xsize, ysize); 
    CGContextDrawImage(cgcontext, rect, image.CGImage);         
    unsigned char *bitmapData = (unsigned char *)CGBitmapContextGetData(cgcontext);  // Get a pointer to the data  
    CGContextRelease(cgcontext);               
    [image release]; 

    CallbackWithData((unsigned int *)bitmapData,xsize,ysize);    //send data 

    free(bitmapData); 
    CGImageRelease(videoImage); 
} 
関連する問題