= OpenCV-Android

Dedicated to providing an optimized port of OpenCV for the Google Android OS.

== Requirements

In order to use OpenCV-Android, you will need to download and install both the Android SDK and NDK version 1.6.  It may or may not work with a higher version. It has been confirmed that this doesn't work with older versions, so please use 1.6 or higher.

In addition to having the SDK or NDK you will also need to have one of the following:
* An Android Phone Dev Phone (Might work with other phones, has not been tested)
* A newer version of the QuickTime Java Libraries

For those of you running on the emulator, I built a very simple Socket-based Camera server that will send images over a socket connection.  This uses the QuickTime libraries which are present by default on Mac OS X, but I haven't tested on other OSes.  If it doesn't work for you, you can always try the original WebcamBroadcaster I derived mine from which uses the JMF (which doesn't work with Mac OS X, hence the QTWebcamBroadcaster):
http://www.tomgibara.com/android/camera-source

== Build

Building is quite simple.  I'm going to assume that you are familiar with Android if you are reading this and keep it rather short.

* Create a symbolic link from the directory where you pulled the OpenCV-Android repository to your [ANDROID_NDK_ROOT]/apps/ directory.  Examples:
  ln -s ~/Source/OpenCV-Android opencv

* From the [ANDROID_NDK_ROOT] run:
  build/host-setup.sh

* Now run:
  make APP=opencv
  
By default, this will build the opencv library and push it into:
[OPENCV_ANDROID_ROOT]/tests/VideoEmulation/libs

You can change where the lib is delivered by modifying the APP_PROJECT_PATH in:
[OPENCV_ANDROID_ROOT]/Application.mk

Once you have built the OpenCV library, you can now build and [OPENCV_ANDROID_ROOT]/tests/VideoEmulation.

<b>NOTE:</b> If you plan to use the Socket Camera, you will need to build and run the [OPENCV_ANDROID_ROOT]/tests/QTWebcamBroadcaster first.  Also, if you use Eclipse to develop Android, there are already projects defined for both of these applications.  You can simply import them into your workspace.

== Setup

If you want to test face tracking, then you need to have a Haar Classifier Cascade XML.  I have provided one for use and it is stored in:
tests/haarcascade_frontalface_alt.xml

Before attempting to run the VideoEmulator application, you must first copy this XML file into the emulator in the following location:
/data/data/org.siprop.opencv/files/haarcascade_frontalface_alt.xml

Currently, this is a hard-coded path that we look up.  Hopefully, this can be remedied in a future version.

== Run

In order to use the VideoEmulator, you have to use the emulator (hence the name.)  If you have a Dev Phone, you can play around with the old 'OpenCVSample' test or modify the VideoEmulator to support a real camera.  This is something we will work on resolving in the future.

Using the emulator there are two slightly different 'flavors' of running.  Both are socket based cameras, but one is written in C++ and emulates a real OpenCV Capture while the other (loosely) emulates a camera implementation in Java.  The C++ version is the default as it is slightly faster and takes a little less memory.  Also, the ultimate goal is to hook up with a real camera in C++ so that we don't have to pass huge amounts of data (images) back and forth through the JNI interface.

<b>NOTE:</b> For all of these examples you cannot use localhost or 127.0.0.1 as your address for the socket camera.  The reason is because when the client is running on the Android emulator, both of these map to Android's localhost, not the machine you are running the emulator on.  This means you have to be connected to a network in order to use the socket camera, a limitation.

=== C++

Since this is the default, we have made it pretty easy...

* Start the WebcamBroadcaster - this is a socket server that grabs images from your camera and serves them up
* Start the VideoEmulator - this runs the Android application that allows you to try out the various pieces implemented thus far
* Once the application comes up, you will have to configure for your machine address and port for the socket camera to work.
* Leave Use C++ SocketCapture CHECKED!
* Choose which test you want to run.

=== Java

To use Java, you have to make a small code change.  Eventually we will make this a configurable option without having to make a code change.  The reason is because when we send data over a socket from Java to Java it is faster to send serialized buffered images.  However, when we send data to C++, we have to send a raw byte array.

* Modify the WebcamBroadcaster by changing the default value assigned to RAW to false.
* Start the WebcamBroadcaster - this is a socket server that grabs images from your camera and serves them up
* Start the VideoEmulator - this runs the Android application that allows you to try out the various pieces implemented thus far
* Once the application comes up, you will have to configure for your machine address and port for the socket camera to work.
* UNCHECK Use C++ SocketCapture!
* Choose which test you want to run.