2013-07-02 5 views
-1

android.After에서 opencv를 사용하려고합니다. 많은 어려움으로 마침내 장치에서 실행합니다.하지만 불행히도 작동하지 않습니다. 이미지를 캡처하려고 할 때 나는 두 가지 문제에 직면하고있다 : - 1. 카메라가 수평 90도를 보이고있다. 2. "캡처"를 클릭하면 충돌이 발생합니다. 문제가 당신 때문에 큰 소비의 메모리가 부족하고 있다는 것을java.lang.OutOfMemoryError in opencv in 안드로이드

07-02 15:31:51.875: E/AndroidRuntime(30198): FATAL EXCEPTION: main 
07-02 15:31:51.875: E/AndroidRuntime(30198): java.lang.OutOfMemoryError 
07-02 15:31:51.875: E/AndroidRuntime(30198): at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method) 
07-02 15:31:51.875: E/AndroidRuntime(30198): at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:430) 
07-02 15:31:51.875: E/AndroidRuntime(30198): at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:447) 
07-02 15:31:51.875: E/AndroidRuntime(30198): at org.opencv.face.Sample3Native$4.onPictureTaken(Sample3Native.java:209) 
07-02 15:31:51.875: E/AndroidRuntime(30198): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:687) 
07-02 15:31:51.875: E/AndroidRuntime(30198): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-02 15:31:51.875: E/AndroidRuntime(30198): at android.os.Looper.loop(Looper.java:137) 
07-02 15:31:51.875: E/AndroidRuntime(30198): at android.app.ActivityThread.main(ActivityThread.java:4441) 
07-02 15:31:51.875: E/AndroidRuntime(30198): at java.lang.reflect.Method.invokeNative(Native Method) 
07-02 15:31:51.875: E/AndroidRuntime(30198): at java.lang.reflect.Method.invoke(Method.java:511) 
07-02 15:31:51.875: E/AndroidRuntime(30198): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823) 
07-02 15:31:51.875: E/AndroidRuntime(30198): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590) 
07-02 15:31:51.875: E/AndroidRuntime(30198): at dalvik.system.NativeStart.main(Native Method) 
+0

사람들이 자신이하고있는 것을 볼 수 있도록 [some] (http://stackoverflow.com/help/on-topic) [http://www.sscce.org]에 게시하고 싶을 수도 있습니다. 무엇이 잘못 될 수 있습니다. – Aurelius

+0

는 (는) 내 질문에 편집 됨 – Developer

답변

0

그것은 나에게 같습니다

/** Handles data for raw picture */ 
    PictureCallback rawCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      if (data != null) { 
       bmp = BitmapFactory.decodeByteArray(data, 0, data.length); 
       findViewById(R.id.img).setVisibility(View.VISIBLE); 
       ((ImageView) findViewById(R.id.img)).setImageBitmap(bmp); 
       findViewById(R.id.preview).setVisibility(View.GONE); 
       if (pg != null) 
        pg.dismiss(); 
       ok_button.setVisibility(View.VISIBLE); 
       click_button.setVisibility(View.GONE); 
       try_again_button.setVisibility(View.VISIBLE); 
      } 
     } 
    }; 

    /** Handles data for jpeg picture */ 
    PictureCallback jpegCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      if (data != null) { 
       bmp = BitmapFactory.decodeByteArray(data, 0, data.length); 
       findViewById(R.id.img).setVisibility(View.VISIBLE); 
       ((ImageView) findViewById(R.id.img)).setImageBitmap(bmp); 
       findViewById(R.id.preview).setVisibility(View.GONE); 

       if (pg != null) 
        pg.dismiss(); 
       ok_button.setVisibility(View.VISIBLE); 
       click_button.setVisibility(View.GONE); 
       try_again_button.setVisibility(View.VISIBLE); 
      } 
     } 
    }; 

로그 캣에서 오류 : 여기

내 코드입니다 이것은 일반적인 이미지 처리 응용 프로그램입니다. 그림 뒤에서 얻는 비트 맵은 실제로 화면에 표시해야하는 것보다 훨씬 클 수 있습니다.

  1. 는, 즉 Bitmap.Config.RGB_565
  2. 사용 BitmapOptions을 덜 메모리 비싼 비트 맵 형식을 사용하고 inBitmap 내에서 사전 할당 된 비트 맵을 재사용 바이트 스트림을 디코딩 : 여기

    메모리 최적화 할 수있는 몇 가지 아이디어입니다 같은 크기를 사용하고 있음을 알 때 4. 걸릴의 사진 CameraParameters을 변경 낮은 해상도로 메모리 소비와 관련된
  3. 사용 BitmapOptions하고 문제를 해결하기 위해 inSampleSize를에게보다 큰 1 개

다른 아이디어를 사용할 수 있지만, 5. 디스플레이에 표시되는 내용이 실제로 사진에서 찍은 내용이 아니라고 (장치 및 카메라 매개 변수에 따라) 발생할 수 있지만 setOneShotPreviewCallback을 사용하십시오 (사진을 찍고 onPictureTaken을 사용한다고 가정합니다). 여기

이며 doc :

BitmapOptions 사용 간략한 예 활동 Camera.Parameters에있는 params = this.camera.getParameters의 시작 부분에 // 대체로(); 크기 pictureSize = params.getPictureSize(); 이 때문에 특정 장치의 동작 How to set Android camera orientation properly? 에있을 수 있지만, 당신이 더 많은 정보를 제공 할 수 있다면 그것은 좋은 것 :

this.bitmapOptions = new BitmapFactory.Options(); 
this.bitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565; 
this.bitmapOptions.inSampleSize = 2; 
this.bitmapOptions.inBitmap = Bitmap.createBitmap(pictureSize.width, pictureSize.height, Bitmap.Config.RGB_565); 

// In onPictureTaken function 
BitmapFactory.decodeByteArray(data, 0, data.length, bitmapOptions); 

90도 방향의 문제에 대해서.