opencv를 이용해서 영상처리를 진행하고 있는데요;
영상처리의 기본은 그레이스케일 인데....
그레이로 바꾸고 비트맵을 이용해 화면에 출력하려고 하면 너무 오랜 시간이 걸립니다.
이미지 (720*1280) 좀 크긴 합니다만... 그레이로 바꾸고
bitmap.copyPixelsFromBuffer(cvGray.getByteBuffer());
image.setImageBitmap(bitmap); // ImageView image;
이렇게 하면 칼라 영상으로 나오는거 있죠? 그레이 변환은 분명 잘 됬는데..
왜그러나 해서 찾아봤더니...
Bitmap.Config에는 그레이가 없으니
private Bitmap setGrayImageBitmap(IplImage img, int w, int h) {
Bitmap bitmap;
bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
for(int y=0; y<h; y++) {
for(int x=0; x<w; x++) {
int gray = (int) Math.floor(cvGet2D(img, y, x).getVal(0));
bitmap.setPixel(x, y, Color.argb(255, gray, gray, gray));
}
}
return bitmap;
}
이런 작업을 거치더라구요...
근데 이 setPixel 이라는 작업을 포문 921600번이나 하고 있으니 오래걸리는 것 같은데... (18초 걸립니다..)
다른 개선할 방법이 없을까요?
Java Wrapping된 OpenCV를 사용하시는 것 같네요. C에 있는 함수들이 전부 Java로 wrapping되어 있겠죠?
컬러 이미지를 1Byte Gray이미지로 변환하시려면
cvtColor(image, CV_RGBA2GRAY)
함수를 이용하세요.
이 이미지를 Android에서 출력 가능한 4 byte gray로 만드려면
위 이미지를 다시
cvtColor(image, CV_GRAY2RGBA)로 변환하세요.
그리고,
C에서도 그렇지만 자바에서 이미지 프로세싱을 할 때 for loop안에서 함수호출하면 안됩니다.
integer array에 pixel데이터를 한 번에 얻으시고 (Bitmap.getPixels 이용) 작업 후 Bitmap.setPixels() 한번에 세팅하세요.
위 방식처럼만 해도 2초안에는 끝날겁니다.