2011-04-12 3 views
23

카메라 프레임을 실시간으로 처리 할 Android 애플리케이션을 만들려고합니다. 시작하려면 먼저 카메라가 보는 회색 음영 버전을 표시하고 싶습니다. 나는 onPreviewFrame 메서드의 바이트 배열에서 적절한 값을 추출 할 수있었습니다. byte[] 프레임 배열실시간으로 Android 카메라 프레임 처리

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); 
} 

[width*height] 값은 휘도 (그레이 스케일) 값이다 : 다음은 내 코드의 단지 단편이다. 압축을 풀면 화면에 이미지로 표시하는 방법은 무엇입니까? 2D 배열도 아니므로 너비와 높이를 어떻게 지정합니까?

답변

-2

openFramworks (http://www.openframeworks.cc/)를 사용해보세요. CameraExample이 있습니다! 그래서 당신은 낮은 수준의 것들을 할 필요가 없습니다.

10

OpenCV4Android SDK에서 광범위한 지침을 얻을 수 있습니다. 사용 가능한 예제를 살펴보십시오. 특히 Tutorial 1 Basic. 0 Android Camera

그러나 제 경우와 같이 집중적 인 이미지 처리의 경우 실시간 이미지 처리 응용 프로그램에서 허용되는 것보다 느려질 수 있습니다. YUVImage 그들의 onPreviewFrame의 바이트 배열의 변환을위한 좋은 체

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

직사각형 화상을 동일한 크기를 만든다.

있는 ByteArrayOutputStream을 만들고이를 통과 사각형 및 compressToJpeg()에 압축 값 :

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

byte [] imageData = baos.toByteArray();

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

표면에 이러한 previewFrames 렌더링 및 관련된 최상의 방법은 새로운 차원입니다. =)

+1

YUV 이미지를 중간 JPEG가있는 비트 맵으로 변환하는 일이 발생합니까? 거의 실현 가능한 실시간 솔루션 – Rekin

+0

나는 이것을 강력히 권고합니다. 안드로이드의 OpenCV는 프로젝트에 복잡성을 더하고 크기가 약 10MB 인 기본 라이브러리도 필요합니다. Android에는 OP가 필요로하는 것을 달성하기위한 모든 기능이 있습니다. OpenCV는 훌륭한 라이브러리이지만 이러한 상황에 과도하게 노출됩니다. – protectedmember

-2

현재 사용 가능한 Android 도구/API를 사용하면 달성하기가 쉽지 않습니다. 일반적으로 실시간 이미지 처리는 NDK 수준에서 더 잘 수행됩니다. 그냥 흑백으로 보여주기 위해서, 당신은 여전히 ​​자바로 그것을 할 수 있습니다. 프레임 데이터가 들어있는 바이트 배열은 YUV 형식으로되어 있으며 Y- 평면이 먼저옵니다. 그래서, 만약 여러분이 Y- 평면 만 (첫 번째 너비 x 높이 바이트) 홀로받는다면, 그것은 이미 여러분에게 흑백을줍니다.

나는 광범위한 작업과 시험을 통해이를 달성했습니다. google에서 앱을 볼 수 있습니다 : https://play.google.com/store/apps/details?id=com.nm.camerafx

1

이 아주 오래된 게시물이 지금 내 관심을 끌었습니다.

'11에서 사용할 수있는 API는 훨씬 제한적이었습니다. 오늘날 (일부) 조작 후 카메라 스트림을 미리 보려면 SurfaceTexture (example 참조)를 사용할 수 있습니다.