2013-04-22 1 views
4

OpenCV에서 일부 처리를 통과하려는 카메라의 이미지를 캡처하고 있습니다. 오래된 장치에서이 비록 첫 번째 장애물에서 실패 :OpenCV에 카메라 영상을 전달할 때 OutOfMemoryException이 발생했습니다.

04-22 14:23:41.708: I/System.out(7289): Available memory (bytes): 5646168 
04-22 14:23:41.718: I/dalvikvm-heap(7289): Forcing collection of SoftReferences for 51121168-byte allocation 
04-22 14:23:41.758: E/dalvikvm-heap(7289): Out of memory on a 51121168-byte allocation. 

이것에 대해 최대 읽기, 조언 이미지의 작은 버전에서 작동하는 것 같다,하지만 :

public void onPictureTaken(byte[] jpeg, Camera c) { 
    mImageBitmap = BitmapFactory.decodeByteArray(jpeg, 0, jpeg.length); 
    org.opencv.android.Utils.bitmapToMat(mImageBitmap, Utils.cameraMat); 
    ... 
} 

은 생산 장치에 남아있는 사용 가능한 메모리의 양을 고려하여 크기를 조정할 크기를 대략적으로 계산하려면 어떻게해야합니까?

+0

Official dev 웹 사이트에는 비트 맵을 효율적으로 표시하는 방법에 대한 전문적인 교육 장이 있습니다. – Teovald

+0

@Teovald 예,하지만이 비트 맵을 어느 시점에서 표시하지 않습니다. 나는 그것을 화면의 크기에 맞추기를 원치 않는다. OpenCV에 최대 픽셀 수를 전달할 수 있기를 원한다. – fredley

답변

0

openCV로 이미지를 전달하기 전에 크기를 조정해야합니다. 디코드 명령은 전체 이미지를 메모리에로드하기 때문에 많은 메모리를 사용합니다. 당신이 그것을 표시하지 않더라도.

official tutorial 방법 getMemoryClass으로,

+1

이것을 읽었지만 문제는 폭과 높이 값을 선택하는 것입니다. 화면에 표시하고 정확하게 무엇인지 미리 알았 으면 좋겠지 만이 경우에는 그렇지 않습니다. 사용 가능한 메모리 양만 알면 어떻게하면 최대화 할 수 있습니까? – fredley

+0

나는 당신이 그것을 정확하게 할 수 있다고 생각하지 않는다. 대신 openCV에서 필요한 것부터 시작할 수 있습니다. – znat

+0

안전하게 할 수있는 방법이 있습니까? OpenCV에서 가능한 한 많은 픽셀이 필요합니다 :-) – fredley

0

당신은 당신의 응용 프로그램이 전체 사용 할 수 얼마나 많은 메모리 용량을 확인 할 수 있습니다 먼저 메모리에로드 할 필요없이 이미지 크기를 조정하는 방법을 보여줍니다. 애플리케이션의 다른 데이터와 위의 디코드 된 비트 맵으로 얼마나 많은 양을 소비했는지 알아야합니다.

대략적인 추측 :

S II에는 8MP 카메라가 있습니다. RGB24 비트 맵을 가정하면, 디코딩 된 단일 비트 맵은 8 * 3 = 24MB의 메모리를 차지합니다. OpenCV 매트릭스는 아마도 내부 포맷이 무엇인지에 따라 거의 같을 것입니다 (메모리 부족 오류는 약 48MB를 할당하려고하는데, 이는 예상보다 약 2 배입니다).

표준 앱이 메모리에 사용할 수있는 것보다 쉽게 ​​위생적입니다. 최소 기준은 16MB입니다. 더 많은 메모리가 필요하다면 보통 크기의 카드 대신 large heap을 사용하십시오. 그것은 여전히 ​​장치 의존적 일지라도 대략 두 배의 메모리를 얻을 수 있습니다.

관련 문제