2012-06-02 46 views
9

Tôi biết AVFoundation và hỗ trợ chụp của nó (không quá quen thuộc). Tuy nhiên, tôi không thấy bất kỳ API dễ truy cập nào để nhận dữ liệu pixel-by-pixel (RGB-mỗi pixel hoặc tương tự). Tôi nhớ lại đọc trong các tài liệu rằng điều này là có thể, nhưng tôi không thực sự nhìn thấy như thế nào. Vì vậy:iOS: Nhận dữ liệu pixel theo pixel từ máy ảnh

  1. Điều này có thể thực hiện được không? Nếu vậy, làm thế nào?
  2. Tôi có đang nhận dữ liệu hình ảnh thô hoặc dữ liệu được nén JPEG không?

Trả lời

31

AV Foundation có thể cung cấp cho bạn các byte nguyên bản cho hình ảnh được quay bằng video hoặc máy ảnh tĩnh. Bạn cần phải thiết lập một AVCaptureSession với một AVCaptureDevice thích hợp và AVCaptureDeviceInput và AVCaptureDeviceOutput tương ứng (AVCaptureVideoDataOutput hoặc AVCaptureStillImageOutput). Apple có một số ví dụ về quá trình này trong tài liệu của họ, và nó đòi hỏi một số mã boilerplate để cấu hình.

Khi bạn đã định cấu hình phiên chụp và bạn đang thu thập dữ liệu từ máy ảnh, bạn sẽ thiết lập phương thức ủy quyền -captureOutput:didOutputSampleBuffer:fromConnection:, trong đó một trong các tham số sẽ là CMSampleBufferRef. Điều đó sẽ có một CVImageBufferRef bên trong nó mà bạn truy cập thông qua CMSampleBufferGetImageBuffer(). Sử dụng CVPixelBufferGetBaseAddress() trên bộ đệm pixel đó sẽ trả lại địa chỉ cơ sở của mảng byte cho dữ liệu pixel thô đại diện cho khung máy ảnh của bạn. Điều này có thể ở một vài định dạng khác nhau, nhưng phổ biến nhất là BGRA và YUV phẳng.

Tôi có một ứng dụng ví dụ sử dụng here này, nhưng tôi khuyên bạn cũng nên xem my open source framework kết thúc tiêu chuẩn AV Foundation boilerplate và giúp dễ dàng thực hiện xử lý hình ảnh trên GPU. Tùy thuộc vào những gì bạn muốn làm với các byte máy ảnh thô, tôi có thể đã có một cái gì đó bạn có thể sử dụng ở đó hoặc một phương tiện làm nó nhanh hơn nhiều so với chế biến trên CPU.

+3

Cuối cùng có xung quanh để này ... mã bạn được đăng ở đây thực sự giúp mặc dù: http://stackoverflow.com/a/11615472/472768 Cảm ơn! – FeifanZ

+0

Bạn có thể giải thích những gì tôi nên cung cấp trong trường hợp đó trong đầu vào của chức năng này? 'AlprResults nhận ra (unsigned char * pixelData, int bytesPerPixel, int imgWidth, int imgHeight, std :: vector regionsOfInterest);' Tôi hiểu điểm chỉ về 'pixelData' và' regionsOfInterest'. –

+0

@SashaKid - Tôi không biết chức năng đó hoạt động như thế nào và âm thanh đó giống như một câu hỏi hoàn toàn riêng biệt. –

-4
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); 
float luminance = dot(textureColor.rgb, W); 

mediump vec2 p = textureCoordinate; 
if (p.x == 0.2 && p.x<0.6 && p.y > 0.4 && p.y<0.6) { 
    gl_FragColor = vec4(textureColor.r * 1.0, textureColor.g * 1.0, textureColor.b * 1.0, textureColor.a); 
} else { 
    gl_FragColor = vec4(textureColor.r * 0.0, textureColor.g * 0.0, textureColor.b * 0.0, textureColor.a *0.0); 
} 
Các vấn đề liên quan