In this post I’ll show you an approach for setting up the camera in Android devices for image processing. More exactly, access camera hardware, create a surface for the preview, handle camera and preview callbacks, get image data as frames.
First thing to do, create a new Android project in Eclipse with whatever settings you like. I would recommend a minimum target of 8(2.2). Keep the default activity.
Next, declare the following permissions in your manifest
<uses-permission android:name="android.permission.CAMERA"/> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus"/>
– the autofocus is optional, but recommended.
Next, let’s create the needed classes first. Create a class derived from android.view.SurfaceView and implementing android.view.SurfaceHolder.Callback. This will be the container for the camera image frames.
Create a class derived from android.view.View – this will be drawn on top of the original preview(call it something along the lines of DrawOnTop).
Briefly, this is how everything will work:
- your main activity will instantiate two class members of type the above classes you’ve created and add it to its view
- the preview class will handle camera creation and release, camera callback and top view instatiation. It will set camera params to highest FPS and minimum resolution on surface creation, will allocate and release camera when appropriate . In the surfaceCreated overridden method is the callback which retrieves camera frames from preview.
- the top view class declared will be instantiated in the preview class, and in its onDraw method will handle image processing and optionally, display processed images over the original one. This will be called for every frame.
I won’t post more source code as you can get a working eclipse project from the link below.
For image processing function, I would suggest OpenCV library, an open source project which has an android port also. Very easy to pick it up, and fits well with the “camera framework” I presented you. Look for comments in the source code for the right place to insert image processing function(TopView class).
Take care with you processing functions as mobile devices are pretty limited in terms of hardware resources. It can get quickly slow, when processing real-time image frames, and you’ll lose frames.
Hallo, good example to start understanding onPreviewFrame() functionality, but what is not clear in my opinion is the suggestion to put the processing function inside the if context at line 43 of TopView.java. This pice of code is executed only one time and mBitmap and mYUVData are null so potentially the processing function can be moved to the else part of the same context. I missed to understand something?
Bs Paolo
Hi,
It’s been a long time since I wrote this. I don’t seem to remember well and right now, I’m not having time to check this.
But what I can remember is I used this structure in one of may projects and it worked well.
Maybe I’ll re-check source code in the future and revise it.
File not available 😦