2011-04-12 27 views
23

Kamera çerçevelerini gerçek zamanlı olarak işleyebilecek bir Android uygulaması oluşturmaya çalışıyorum. Başlamak için sadece kameranın gördüklerinin gri tonlamalı bir versiyonunu görüntülemek istiyorum. Uygun değerleri onPreviewFrame yöntemindeki bayt dizisinden ayıklamayı başardım. byte[] çerçeve dizisininAndroid kamera çerçeveleri gerçek zamanlı olarak işleniyor

byte[] pic; 
int pic_size; 
Bitmap picframe; 
public void onPreviewFrame(byte[] frame, Camera c) 
{ 
    pic_size = mCamera.getParameters().getPreviewSize().height * mCamera.getParameters().getPreviewSize().width; 
    pic = new byte[pic_size]; 
    for(int i = 0; i < pic_size; i++) 
    { 
     pic[i] = frame[i]; 
    } 
    picframe = BitmapFactory.decodeByteArray(pic, 0, pic_size); 
} 

ilk [width*height] değerleri parlaklık (gri tonlama) değerler şunlardır: Aşağıda benim yalnızca bir kod snippet'tir. Onları ayıkladıktan sonra, bunları bir görüntü olarak ekranda nasıl görüntüleyebilirim? Onun bir 2D dizisi de değil, bu yüzden genişliği ve yüksekliği nasıl belirleyebilirim?

cevap

10

OpenCV4Android SDK'dan kapsamlı kılavuzluk alabilirsiniz. Mevcut örneklerine, özellikle de Tutorial 1 Basic. 0 Android Camera

'a bakın. Ancak, benim durumumda olduğu gibi, yoğun görüntü işleme için, bu gerçek zamanlı görüntü işleme uygulaması için kabul edilebilir olandan daha yavaş olacaktır. YUVImage kendi onPreviewFrame sitesindeki bayt dizi dönüşüm için iyi bir yedek:

YuvImage yuvImage = new YuvImage(frame, ImageFormat.NV21, width, height, null);

bir dikdörtgen görüntü ile aynı boyda oluşturun.

bir ByteArrayOutputStream oluşturma ve bu geçiş, dikdörtgen ve compressToJpeg() sıkıştırma değeri:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); yuvimage.compressToJpeg(imageSizeRectangle, 100, baos);

byte [] imageData = baos.toByteArray();

Bitmap previewBitmap = BitmapFactory.decodeByteArray(imageData , 0, imageData .length);

bir yüzey üzerinde, bu previewFrames oluşturma ve İlgili en iyi uygulamalar yeni bir boyuttur. =)

+1

Bu, YUV görüntüsünü bir ara JPEG ile Bitmap'e dönüştürmek için mi oluyor? Zor bir gerçek zamanlı çözüm – Rekin

+0

Bu konuda şiddetle tavsiye ediyorum. Android'deki OpenCV, projeye karmaşıklık katacak ve ayrıca 10mb boyutunda olan yerel kütüphanelere de ihtiyaç duyacaktır. Android, OP'nin gerektirdiği şeyleri gerçekleştirmek için tüm olanaklara sahip. OpenCV harika bir kütüphanedir, fakat bu durum için aşırı bir oyundur. – protectedmember

-2

Mevcut Android araçları/API'siyle, bu kolay bir iş değildir. Genel olarak, gerçek zamanlı görüntü işleme NDK seviyesinde daha iyi yapılır. Siyahı ve beyazı göstermek için hala java'da yapabilirsin. Çerçeve verisini içeren bayt dizisi Y-Düzleminin ilk olduğu YUV biçimindedir. Yani, sadece Y düzlemini tek başına alırsanız (ilk genişlik x yükseklik bayt), size zaten siyah beyazı verir.

Bunu kapsamlı çalışma ve denemelerle başardım. Uygulamayı şu adresten görüntüleyebilirsiniz:

1

Bu çok eski yayın şimdi dikkatimi çekti.

'11'de bulunan API çok daha sınırlıydı. Bugün (bazı) manipülasyonlardan sonra kamera akışını önizlemek için SurfaceTexture'ı kullanabilirsiniz (bkz. example).

İlgili konular