From 2f859a86520058a22728c3235a56007fc9011a81 Mon Sep 17 00:00:00 2001 From: Ethan Rublee Date: Tue, 12 Oct 2010 02:21:30 +0000 Subject: [PATCH] adding samples to the android apps directory --- android/apps/CVCamera/AndroidManifest.xml | 30 ++ android/apps/CVCamera/Makefile | 83 ++++ android/apps/CVCamera/README.txt | 2 + android/apps/CVCamera/build.sh | 1 + android/apps/CVCamera/clean.sh | 1 + android/apps/CVCamera/default.properties | 12 + android/apps/CVCamera/jni/Android.mk | 21 + android/apps/CVCamera/jni/Application.mk | 2 + android/apps/CVCamera/jni/Processor.cpp | 300 +++++++++++++ android/apps/CVCamera/jni/Processor.h | 60 +++ android/apps/CVCamera/jni/Processor.i | 51 +++ android/apps/CVCamera/jni/cvcamera.i | 36 ++ android/apps/CVCamera/project_create.sh | 2 + android/apps/CVCamera/res/drawable-hdpi/icon.png | Bin 0 -> 5760 bytes android/apps/CVCamera/res/drawable-ldpi/icon.png | Bin 0 -> 2034 bytes android/apps/CVCamera/res/drawable-mdpi/icon.png | Bin 0 -> 2861 bytes android/apps/CVCamera/res/layout/main.xml | 8 + android/apps/CVCamera/res/values/strings.xml | 7 + android/apps/CVCamera/sample.local.env.mk | 4 + .../src/com/theveganrobot/cvcamera/CVCamera.java | 498 +++++++++++++++++++++ android/apps/CVCamera/uninstall.phone.sh | 3 + android/apps/Calibration/AndroidManifest.xml | 38 ++ android/apps/Calibration/artwork/icon.xcf | Bin 0 -> 9176 bytes android/apps/Calibration/default.properties | 12 + android/apps/Calibration/project_create.sh | 2 + .../apps/Calibration/res/drawable-hdpi/icon.png | Bin 0 -> 5135 bytes .../apps/Calibration/res/drawable-ldpi/icon.png | Bin 0 -> 5135 bytes .../Calibration/res/drawable-mdpi/cameraback.jpg | Bin 0 -> 164530 bytes .../apps/Calibration/res/drawable-mdpi/icon.png | Bin 0 -> 5135 bytes .../Calibration/res/drawable-mdpi/patternicon.png | Bin 0 -> 409 bytes android/apps/Calibration/res/layout/camera.xml | 59 +++ android/apps/Calibration/res/layout/chesssizer.xml | 40 ++ .../apps/Calibration/res/menu/calibrationmenu.xml | 17 + .../apps/Calibration/res/values/chessnumbers.xml | 20 + android/apps/Calibration/res/values/color.xml | 5 + android/apps/Calibration/res/values/strings.xml | 24 + .../src/com/opencv/calibration/Calibration.java | 311 +++++++++++++ .../com/opencv/calibration/ChessBoardChooser.java | 74 +++ .../calibration/services/CalibrationService.java | 151 +++++++ .../src/com/opencv/misc/SDCardChecker.java | 64 +++ android/apps/camera_template/AndroidManifest.xml | 27 ++ android/apps/camera_template/Makefile | 98 ++++ android/apps/camera_template/README.txt | 2 + android/apps/camera_template/build.sh | 1 + android/apps/camera_template/clean.sh | 1 + android/apps/camera_template/default.properties | 12 + android/apps/camera_template/jni/Android.mk | 36 ++ android/apps/camera_template/jni/Application.mk | 2 + android/apps/camera_template/jni/TestBar.cpp | 5 + android/apps/camera_template/jni/TestBar.h | 26 ++ android/apps/camera_template/jni/foobar.i | 68 +++ .../camera_template/res/drawable-hdpi/icon.png | Bin 0 -> 5760 bytes .../camera_template/res/drawable-ldpi/icon.png | Bin 0 -> 2034 bytes .../camera_template/res/drawable-mdpi/icon.png | Bin 0 -> 2861 bytes .../apps/camera_template/res/values/strings.xml | 8 + .../camera_template/src/com/foo/bar/FooBar.java | 224 +++++++++ 56 files changed, 2448 insertions(+) create mode 100644 android/apps/CVCamera/AndroidManifest.xml create mode 100644 android/apps/CVCamera/Makefile create mode 100644 android/apps/CVCamera/README.txt create mode 100644 android/apps/CVCamera/build.sh create mode 100644 android/apps/CVCamera/clean.sh create mode 100644 android/apps/CVCamera/default.properties create mode 100644 android/apps/CVCamera/jni/Android.mk create mode 100644 android/apps/CVCamera/jni/Application.mk create mode 100644 android/apps/CVCamera/jni/Processor.cpp create mode 100644 android/apps/CVCamera/jni/Processor.h create mode 100644 android/apps/CVCamera/jni/Processor.i create mode 100644 android/apps/CVCamera/jni/cvcamera.i create mode 100755 android/apps/CVCamera/project_create.sh create mode 100644 android/apps/CVCamera/res/drawable-hdpi/icon.png create mode 100644 android/apps/CVCamera/res/drawable-ldpi/icon.png create mode 100644 android/apps/CVCamera/res/drawable-mdpi/icon.png create mode 100644 android/apps/CVCamera/res/layout/main.xml create mode 100644 android/apps/CVCamera/res/values/strings.xml create mode 100644 android/apps/CVCamera/sample.local.env.mk create mode 100644 android/apps/CVCamera/src/com/theveganrobot/cvcamera/CVCamera.java create mode 100755 android/apps/CVCamera/uninstall.phone.sh create mode 100644 android/apps/Calibration/AndroidManifest.xml create mode 100644 android/apps/Calibration/artwork/icon.xcf create mode 100644 android/apps/Calibration/default.properties create mode 100755 android/apps/Calibration/project_create.sh create mode 100644 android/apps/Calibration/res/drawable-hdpi/icon.png create mode 100644 android/apps/Calibration/res/drawable-ldpi/icon.png create mode 100644 android/apps/Calibration/res/drawable-mdpi/cameraback.jpg create mode 100644 android/apps/Calibration/res/drawable-mdpi/icon.png create mode 100644 android/apps/Calibration/res/drawable-mdpi/patternicon.png create mode 100644 android/apps/Calibration/res/layout/camera.xml create mode 100644 android/apps/Calibration/res/layout/chesssizer.xml create mode 100644 android/apps/Calibration/res/menu/calibrationmenu.xml create mode 100644 android/apps/Calibration/res/values/chessnumbers.xml create mode 100644 android/apps/Calibration/res/values/color.xml create mode 100644 android/apps/Calibration/res/values/strings.xml create mode 100644 android/apps/Calibration/src/com/opencv/calibration/Calibration.java create mode 100644 android/apps/Calibration/src/com/opencv/calibration/ChessBoardChooser.java create mode 100644 android/apps/Calibration/src/com/opencv/calibration/services/CalibrationService.java create mode 100644 android/apps/Calibration/src/com/opencv/misc/SDCardChecker.java create mode 100644 android/apps/camera_template/AndroidManifest.xml create mode 100644 android/apps/camera_template/Makefile create mode 100644 android/apps/camera_template/README.txt create mode 100644 android/apps/camera_template/build.sh create mode 100644 android/apps/camera_template/clean.sh create mode 100644 android/apps/camera_template/default.properties create mode 100644 android/apps/camera_template/jni/Android.mk create mode 100644 android/apps/camera_template/jni/Application.mk create mode 100644 android/apps/camera_template/jni/TestBar.cpp create mode 100644 android/apps/camera_template/jni/TestBar.h create mode 100644 android/apps/camera_template/jni/foobar.i create mode 100644 android/apps/camera_template/res/drawable-hdpi/icon.png create mode 100644 android/apps/camera_template/res/drawable-ldpi/icon.png create mode 100644 android/apps/camera_template/res/drawable-mdpi/icon.png create mode 100644 android/apps/camera_template/res/values/strings.xml create mode 100644 android/apps/camera_template/src/com/foo/bar/FooBar.java diff --git a/android/apps/CVCamera/AndroidManifest.xml b/android/apps/CVCamera/AndroidManifest.xml new file mode 100644 index 0000000..0acd4e9 --- /dev/null +++ b/android/apps/CVCamera/AndroidManifest.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/apps/CVCamera/Makefile b/android/apps/CVCamera/Makefile new file mode 100644 index 0000000..89d847d --- /dev/null +++ b/android/apps/CVCamera/Makefile @@ -0,0 +1,83 @@ +# The path to the NDK, requires crystax version r-4 for now, due to support +# for the standard library + +# load environment from local make file +LOCAL_ENV_MK=local.env.mk +ifneq "$(wildcard $(LOCAL_ENV_MK))" "" +include $(LOCAL_ENV_MK) +else +$(shell cp sample.$(LOCAL_ENV_MK) $(LOCAL_ENV_MK)) +$(info ERROR local environement not setup! try:) +$(info gedit $(LOCAL_ENV_MK)) +$(error Please setup the $(LOCAL_ENV_MK) - the default was just created') +endif + +ANDROID_NDK_BASE = $(ANDROID_NDK_ROOT) + +$(info OPENCV_CONFIG = $(OPENCV_CONFIG)) + +ifndef PROJECT_PATH +$(info PROJECT_PATH defaulting to this directory) +PROJECT_PATH=. +endif + + +# The name of the native library +LIBNAME = libcvcamera.so + + +# Find all the C++ sources in the native folder +SOURCES = $(wildcard jni/*.cpp) +HEADERS = $(wildcard jni/*.h) + +ANDROID_MKS = $(wildcard jni/*.mk) + +SWIG_IS = $(wildcard jni/*.i) + +SWIG_MAIN = jni/cvcamera.i + +SWIG_JAVA_DIR = src/com/theveganrobot/cvcamera/jni +SWIG_JAVA_OUT = $(wildcard $(SWIG_JAVA_DIR)/*.java) + + +SWIG_C_DIR = jni/gen +SWIG_C_OUT = $(SWIG_C_DIR)/cvcamera_swig.cpp + +BUILD_DEFS=OPENCV_CONFIG=$(OPENCV_CONFIG) \ + PROJECT_PATH=$(PROJECT_PATH) \ + V=$(V) \ + $(NDK_FLAGS) + +# The real native library stripped of symbols +LIB = libs/armeabi-v7a/$(LIBNAME) libs/armeabi/$(LIBNAME) + + +all: $(LIB) + + +#calls the ndk-build script, passing it OPENCV_ROOT and OPENCV_LIBS_DIR +$(LIB): $(SWIG_C_OUT) $(SOURCES) $(HEADERS) $(ANDROID_MKS) + $(ANDROID_NDK_BASE)/ndk-build $(BUILD_DEFS) + + +#this creates the swig wrappers +$(SWIG_C_OUT): $(SWIG_IS) + make clean-swig &&\ + mkdir -p $(SWIG_C_DIR) &&\ + mkdir -p $(SWIG_JAVA_DIR) &&\ + swig -java -c++ -I../../android-jni/jni -package "com.theveganrobot.cvcamera.jni" \ + -outdir $(SWIG_JAVA_DIR) \ + -o $(SWIG_C_OUT) $(SWIG_MAIN) + + +#clean targets +.PHONY: clean clean-swig cleanall + +#this deletes the generated swig java and the generated c wrapper +clean-swig: + rm -f $(SWIG_JAVA_OUT) $(SWIG_C_OUT) + +#does clean-swig and then uses the ndk-build clean +clean: clean-swig + $(ANDROID_NDK_BASE)/ndk-build clean $(BUILD_DEFS) + diff --git a/android/apps/CVCamera/README.txt b/android/apps/CVCamera/README.txt new file mode 100644 index 0000000..8bc5b3a --- /dev/null +++ b/android/apps/CVCamera/README.txt @@ -0,0 +1,2 @@ +see http://code.google.com/p/android-opencv/wiki/CVCamera + diff --git a/android/apps/CVCamera/build.sh b/android/apps/CVCamera/build.sh new file mode 100644 index 0000000..1497a39 --- /dev/null +++ b/android/apps/CVCamera/build.sh @@ -0,0 +1 @@ +make V=0 diff --git a/android/apps/CVCamera/clean.sh b/android/apps/CVCamera/clean.sh new file mode 100644 index 0000000..121e391 --- /dev/null +++ b/android/apps/CVCamera/clean.sh @@ -0,0 +1 @@ +make OPENCV_ROOT=../../opencv V=0 clean diff --git a/android/apps/CVCamera/default.properties b/android/apps/CVCamera/default.properties new file mode 100644 index 0000000..66148fe --- /dev/null +++ b/android/apps/CVCamera/default.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +android.library.reference.1=../../android-jni +# Project target. +target=android-7 diff --git a/android/apps/CVCamera/jni/Android.mk b/android/apps/CVCamera/jni/Android.mk new file mode 100644 index 0000000..f5aa1b1 --- /dev/null +++ b/android/apps/CVCamera/jni/Android.mk @@ -0,0 +1,21 @@ +# date: Summer, 2010 +# author: Ethan Rublee +# contact: ethan.rublee@gmail.com +# +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +#define OPENCV_INCLUDES and OPENCV_LIBS +include $(OPENCV_CONFIG) + +LOCAL_LDLIBS += $(OPENCV_LIBS) $(ANDROID_OPENCV_LIBS) -llog -lGLESv2 + +LOCAL_C_INCLUDES += $(OPENCV_INCLUDES) $(ANDROID_OPENCV_INCLUDES) + +LOCAL_MODULE := cvcamera + +LOCAL_SRC_FILES := Processor.cpp gen/cvcamera_swig.cpp + +include $(BUILD_SHARED_LIBRARY) + diff --git a/android/apps/CVCamera/jni/Application.mk b/android/apps/CVCamera/jni/Application.mk new file mode 100644 index 0000000..a2c96a8 --- /dev/null +++ b/android/apps/CVCamera/jni/Application.mk @@ -0,0 +1,2 @@ +# The ARMv7 is significanly faster due to the use of the hardware FPU +APP_ABI := armeabi armeabi-v7a \ No newline at end of file diff --git a/android/apps/CVCamera/jni/Processor.cpp b/android/apps/CVCamera/jni/Processor.cpp new file mode 100644 index 0000000..3d5a6b1 --- /dev/null +++ b/android/apps/CVCamera/jni/Processor.cpp @@ -0,0 +1,300 @@ +/* + * Processor.cpp + * + * Created on: Jun 13, 2010 + * Author: ethan + */ + +#include "Processor.h" + + +#include + +using namespace cv; + +Processor::Processor() : + stard(20/*max_size*/, 8/*response_threshold*/, + 15/*line_threshold_projected*/, + 8/*line_threshold_binarized*/, 5/*suppress_nonmax_size*/), + fastd(20/*threshold*/, true/*nonmax_suppression*/), + surfd(100./*hessian_threshold*/, 1/*octaves*/, 2/*octave_layers*/) + +{ + +} + +Processor::~Processor() { + // TODO Auto-generated destructor stub +} + +void Processor::detectAndDrawFeatures(int input_idx, image_pool* pool,int feature_type) { + FeatureDetector* fd = 0; + + switch (feature_type) { + case DETECT_SURF: + fd = &surfd; + break; + case DETECT_FAST: + fd = &fastd; + break; + case DETECT_STAR: + fd = &stard; + break; + } + + Mat greyimage; + pool->getGrey(input_idx, greyimage); + //Mat* grayimage = pool->getYUV(input_idx); + + Mat* img = pool->getImage(input_idx); + + if (!img || greyimage.empty() || fd == 0) + return; //no image at input_idx! + + + keypoints.clear(); + + //if(grayimage->step1() > sizeof(uchar)) return; + //cvtColor(*img,*grayimage,CV_RGB2GRAY); + + + fd->detect(greyimage, keypoints); + + for (vector::const_iterator it = keypoints.begin(); it + != keypoints.end(); ++it) { + circle(*img, it->pt, 3, cvScalar(255, 0, 255, 0)); + } + + //pool->addImage(output_idx,outimage); + +} +static double computeReprojectionErrors( + const vector >& objectPoints, const vector >& imagePoints, const vector& rvecs, + const vector& tvecs, const Mat& cameraMatrix, + const Mat& distCoeffs, vector& perViewErrors) { + vector imagePoints2; + int i, totalPoints = 0; + double totalErr = 0, err; + perViewErrors.resize(objectPoints.size()); + + for (i = 0; i < (int) objectPoints.size(); i++) { + projectPoints(Mat(objectPoints[i]), rvecs[i], tvecs[i], cameraMatrix, + distCoeffs, imagePoints2); + err = norm(Mat(imagePoints[i]), Mat(imagePoints2), CV_L1 ); + int n = (int) objectPoints[i].size(); + perViewErrors[i] = err / n; + totalErr += err; + totalPoints += n; + } + + return totalErr / totalPoints; +} + +static void calcChessboardCorners(Size boardSize, float squareSize, vector< + Point3f>& corners) { + corners.resize(0); + + for (int i = 0; i < boardSize.height; i++) + for (int j = 0; j < boardSize.width; j++) + corners.push_back(Point3f(float(j * squareSize), float(i + * squareSize), 0)); +} + +/**from opencv/samples/cpp/calibration.cpp + * + */ +static bool runCalibration(vector > imagePoints, + Size imageSize, Size boardSize, float squareSize, float aspectRatio, + int flags, Mat& cameraMatrix, Mat& distCoeffs, vector& rvecs, + vector& tvecs, vector& reprojErrs, double& totalAvgErr) { + cameraMatrix = Mat::eye(3, 3, CV_64F); + if (flags & CV_CALIB_FIX_ASPECT_RATIO) + cameraMatrix.at (0, 0) = aspectRatio; + + distCoeffs = Mat::zeros(5, 1, CV_64F); + + vector > objectPoints(1); + calcChessboardCorners(boardSize, squareSize, objectPoints[0]); + for (size_t i = 1; i < imagePoints.size(); i++) + objectPoints.push_back(objectPoints[0]); + + calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, + distCoeffs, rvecs, tvecs, flags); + + bool ok = checkRange(cameraMatrix, CV_CHECK_QUIET ) && checkRange( + distCoeffs, CV_CHECK_QUIET ); + + totalAvgErr = computeReprojectionErrors(objectPoints, imagePoints, rvecs, + tvecs, cameraMatrix, distCoeffs, reprojErrs); + + return ok; +} + +bool Processor::detectAndDrawChessboard(int idx,image_pool* pool) { + + Mat grey; + pool->getGrey(idx, grey); + if (grey.empty()) + return false; + vector corners; + + IplImage iplgrey = grey; + if (!cvCheckChessboard(&iplgrey, Size(6, 8))) + return false; + bool patternfound = findChessboardCorners(grey, Size(6, 8), corners); + + Mat * img = pool->getImage(idx); + + if (corners.size() < 1) + return false; + + cornerSubPix(grey, corners, Size(11, 11), Size(-1, -1), TermCriteria( + CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1)); + + if(patternfound) + imagepoints.push_back(corners); + + drawChessboardCorners(*img, Size(6, 8), Mat(corners), patternfound); + + imgsize = grey.size(); + + return patternfound; + +} + +void Processor::drawText(int i, image_pool* pool, const char* ctext){ + // Use "y" to show that the baseLine is about + string text = ctext; + int fontFace = FONT_HERSHEY_COMPLEX_SMALL; + double fontScale = .8; + int thickness = .5; + + Mat img = *pool->getImage(i); + + int baseline=0; + Size textSize = getTextSize(text, fontFace, + fontScale, thickness, &baseline); + baseline += thickness; + + // center the text + Point textOrg((img.cols - textSize.width)/2, + (img.rows - textSize.height *2)); + + // draw the box + rectangle(img, textOrg + Point(0, baseline), + textOrg + Point(textSize.width, -textSize.height), + Scalar(0,0,255),CV_FILLED); + // ... and the baseline first + line(img, textOrg + Point(0, thickness), + textOrg + Point(textSize.width, thickness), + Scalar(0, 0, 255)); + + // then put the text itself + putText(img, text, textOrg, fontFace, fontScale, + Scalar::all(255), thickness, 8); +} +void saveCameraParams(const string& filename, Size imageSize, Size boardSize, + float squareSize, float aspectRatio, int flags, + const Mat& cameraMatrix, const Mat& distCoeffs, + const vector& rvecs, const vector& tvecs, + const vector& reprojErrs, + const vector >& imagePoints, double totalAvgErr) { + FileStorage fs(filename, FileStorage::WRITE); + + time_t t; + time(&t); + struct tm *t2 = localtime(&t); + char buf[1024]; + strftime(buf, sizeof(buf) - 1, "%c", t2); + + fs << "calibration_time" << buf; + + if (!rvecs.empty() || !reprojErrs.empty()) + fs << "nframes" << (int) std::max(rvecs.size(), reprojErrs.size()); + fs << "image_width" << imageSize.width; + fs << "image_height" << imageSize.height; + fs << "board_width" << boardSize.width; + fs << "board_height" << boardSize.height; + fs << "squareSize" << squareSize; + + if (flags & CV_CALIB_FIX_ASPECT_RATIO) + fs << "aspectRatio" << aspectRatio; + + if (flags != 0) { + sprintf(buf, "flags: %s%s%s%s", + flags & CV_CALIB_USE_INTRINSIC_GUESS ? "+use_intrinsic_guess" + : "", + flags & CV_CALIB_FIX_ASPECT_RATIO ? "+fix_aspectRatio" : "", + flags & CV_CALIB_FIX_PRINCIPAL_POINT ? "+fix_principal_point" + : "", + flags & CV_CALIB_ZERO_TANGENT_DIST ? "+zero_tangent_dist" : ""); + cvWriteComment(*fs, buf, 0); + } + + fs << "flags" << flags; + + fs << "camera_matrix" << cameraMatrix; + fs << "distortion_coefficients" << distCoeffs; + + fs << "avg_reprojection_error" << totalAvgErr; + if (!reprojErrs.empty()) + fs << "per_view_reprojection_errors" << Mat(reprojErrs); + + if (!rvecs.empty() && !tvecs.empty()) { + Mat bigmat(rvecs.size(), 6, CV_32F); + for (size_t i = 0; i < rvecs.size(); i++) { + Mat r = bigmat(Range(i, i + 1), Range(0, 3)); + Mat t = bigmat(Range(i, i + 1), Range(3, 6)); + rvecs[i].copyTo(r); + tvecs[i].copyTo(t); + } + cvWriteComment( + *fs, + "a set of 6-tuples (rotation vector + translation vector) for each view", + 0); + fs << "extrinsic_parameters" << bigmat; + } + + if (!imagePoints.empty()) { + Mat imagePtMat(imagePoints.size(), imagePoints[0].size(), CV_32FC2); + for (size_t i = 0; i < imagePoints.size(); i++) { + Mat r = imagePtMat.row(i).reshape(2, imagePtMat.cols); + Mat(imagePoints[i]).copyTo(r); + } + fs << "image_points" << imagePtMat; + } +} +void Processor::resetChess() { + + imagepoints.clear(); +} + +void Processor::calibrate(const char* filename) { + + vector rvecs, tvecs; + vector reprojErrs; + double totalAvgErr = 0; + int flags = 0; + bool writeExtrinsics = true; + bool writePoints = true; + + bool ok = runCalibration(imagepoints, imgsize, Size(6, 8), 1.f, 1.f, + flags, K, distortion, rvecs, tvecs, reprojErrs, totalAvgErr); + + + if (ok){ + + saveCameraParams(filename, imgsize, Size(6, 8), 1.f, + 1.f, flags, K, distortion, writeExtrinsics ? rvecs + : vector (), writeExtrinsics ? tvecs + : vector (), writeExtrinsics ? reprojErrs + : vector (), writePoints ? imagepoints : vector< + vector > (), totalAvgErr); + } + +} + +int Processor::getNumberDetectedChessboards() { + return imagepoints.size(); +} diff --git a/android/apps/CVCamera/jni/Processor.h b/android/apps/CVCamera/jni/Processor.h new file mode 100644 index 0000000..49bee55 --- /dev/null +++ b/android/apps/CVCamera/jni/Processor.h @@ -0,0 +1,60 @@ +/* + * Processor.h + * + * Created on: Jun 13, 2010 + * Author: ethan + */ + +#ifndef PROCESSOR_H_ +#define PROCESSOR_H_ + +#include +#include +#include +#include +#include + + + +#include + +#include "image_pool.h" + +#define DETECT_FAST 0 +#define DETECT_STAR 1 +#define DETECT_SURF 2 + +class Processor { + + cv::StarFeatureDetector stard; + cv::FastFeatureDetector fastd; + cv::SurfFeatureDetector surfd; + std::vector keypoints; + + vector > imagepoints; + + cv::Mat K; + cv::Mat distortion; + cv::Size imgsize; + //image_pool pool; +public: + + Processor(); + virtual ~Processor(); + + void detectAndDrawFeatures(int idx, image_pool* pool, int feature_type); + + bool detectAndDrawChessboard(int idx,image_pool* pool); + + void resetChess(); + + int getNumberDetectedChessboards(); + + void calibrate(const char* filename); + + void drawText(int idx, image_pool* pool, const char* text); + + +}; + +#endif /* PROCESSOR_H_ */ diff --git a/android/apps/CVCamera/jni/Processor.i b/android/apps/CVCamera/jni/Processor.i new file mode 100644 index 0000000..ff66d53 --- /dev/null +++ b/android/apps/CVCamera/jni/Processor.i @@ -0,0 +1,51 @@ +/* + * include the headers required by the generated cpp code + */ +%{ +#include "Processor.h" +#include "image_pool.h" +using namespace cv; +%} + + +/** + * some constants, see Processor.h + */ +#define DETECT_FAST 0 +#define DETECT_STAR 1 +#define DETECT_SURF 2 + +//import the android-cv.i file so that swig is aware of all that has been previous defined +//notice that it is not an include.... +%import "android-cv.i" + +//make sure to import the image_pool as it is +//referenced by the Processor java generated +//class +%typemap(javaimports) Processor " +import com.opencv.jni.image_pool;// import the image_pool interface for playing nice with + // android-opencv + +/** Processor - for processing images that are stored in an image pool +*/" + +class Processor { +public: + Processor(); + virtual ~Processor(); + + + + void detectAndDrawFeatures(int idx, image_pool* pool, int feature_type); + + bool detectAndDrawChessboard(int idx,image_pool* pool); + + void resetChess(); + + int getNumberDetectedChessboards(); + + void calibrate(const char* filename); + + void drawText(int idx, image_pool* pool, const char* text); + +}; diff --git a/android/apps/CVCamera/jni/cvcamera.i b/android/apps/CVCamera/jni/cvcamera.i new file mode 100644 index 0000000..ccca8d9 --- /dev/null +++ b/android/apps/CVCamera/jni/cvcamera.i @@ -0,0 +1,36 @@ +/* File : android-cv.i */ + +%module cvcamera + + +/* + * the java import code muse be included for the opencv jni wrappers + * this means that the android project must reference opencv/android as a project + * see the default.properties for how this is done + */ +%pragma(java) jniclassimports=%{ +import com.opencv.jni.*; //import the android-opencv jni wrappers +%} + +%pragma(java) jniclasscode=%{ + static { + try { + //load the cvcamera library, make sure that libcvcamera.so is in your /libs/armeabi directory + //so that android sdk automatically installs it along with the app. + + //the android-opencv lib must be loaded first inorder for the cvcamera + //lib to be found + //check the apk generated, by opening it in an archive manager, to verify that + //both these libraries are present + System.loadLibrary("android-opencv"); + System.loadLibrary("cvcamera"); + } catch (UnsatisfiedLinkError e) { + //badness + throw e; + } + } + +%} + +//include the Processor class swig interface file +%include "Processor.i" \ No newline at end of file diff --git a/android/apps/CVCamera/project_create.sh b/android/apps/CVCamera/project_create.sh new file mode 100755 index 0000000..ec76728 --- /dev/null +++ b/android/apps/CVCamera/project_create.sh @@ -0,0 +1,2 @@ +android update project --name CVCamera \ +--path . diff --git a/android/apps/CVCamera/res/drawable-hdpi/icon.png b/android/apps/CVCamera/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4e828bafd86aae740c6d4da0af6cc67653b535a5 GIT binary patch literal 5760 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 V9}r2j|9cq#=xN{7s@8Of{2yTISoHt^ literal 0 HcmV?d00001 diff --git a/android/apps/CVCamera/res/drawable-ldpi/icon.png b/android/apps/CVCamera/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5e11406cb22ee31db3e88479d0dc73ee54e77127 GIT binary patch literal 2034 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 + + + diff --git a/android/apps/CVCamera/res/values/strings.xml b/android/apps/CVCamera/res/values/strings.xml new file mode 100644 index 0000000..5fe379d --- /dev/null +++ b/android/apps/CVCamera/res/values/strings.xml @@ -0,0 +1,7 @@ + + + + CVCamera +app to demo using android camera and passing data to opencv layer. +Release 0.0.1 - first demo of using the OpenCV library with camera data + diff --git a/android/apps/CVCamera/sample.local.env.mk b/android/apps/CVCamera/sample.local.env.mk new file mode 100644 index 0000000..203c730 --- /dev/null +++ b/android/apps/CVCamera/sample.local.env.mk @@ -0,0 +1,4 @@ +#location of android-opencv port of OpenCV to android +OPENCV_CONFIG=../../build/android-opencv.mk +ANDROID_NDK_ROOT=$(HOME)/android-ndk-r4-crystax + diff --git a/android/apps/CVCamera/src/com/theveganrobot/cvcamera/CVCamera.java b/android/apps/CVCamera/src/com/theveganrobot/cvcamera/CVCamera.java new file mode 100644 index 0000000..2cbcbb3 --- /dev/null +++ b/android/apps/CVCamera/src/com/theveganrobot/cvcamera/CVCamera.java @@ -0,0 +1,498 @@ +package com.theveganrobot.cvcamera; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.LinkedList; +import java.util.Scanner; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.ProgressDialog; +import android.content.DialogInterface; +import android.content.pm.ActivityInfo; +import android.os.Bundle; +import android.os.Environment; +import android.util.Log; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.view.ViewGroup.LayoutParams; +import android.widget.AnalogClock; +import android.widget.Button; +import android.widget.FrameLayout; +import android.widget.ImageButton; +import android.widget.LinearLayout; +import android.widget.Toast; + +import com.opencv.camera.NativePreviewer; +import com.opencv.camera.NativeProcessor; +import com.opencv.camera.NativeProcessor.PoolCallback; +import com.opencv.jni.image_pool; +import com.opencv.opengl.GL2CameraViewer; +import com.theveganrobot.cvcamera.jni.Processor; +import com.theveganrobot.cvcamera.jni.cvcamera; + +public class CVCamera extends Activity { + + static final int DIALOG_CALIBRATING = 0; + static final int DIALOG_CALIBRATION_FILE = 1; + private static final int DIALOG_OPENING_TUTORIAL = 2; + private static final int DIALOG_TUTORIAL_FAST = 3; + private static final int DIALOG_TUTORIAL_SURF = 4; + private static final int DIALOG_TUTORIAL_STAR = 5; + private static final int DIALOG_TUTORIAL_CHESS = 6; + private boolean captureChess; + + ProgressDialog makeCalibDialog() { + ProgressDialog progressDialog; + progressDialog = new ProgressDialog(this); + progressDialog.setMessage("Callibrating. Please wait..."); + progressDialog.setCancelable(false); + + return progressDialog; + } + + void toasts(int id) { + switch (id) { + case DIALOG_OPENING_TUTORIAL: + Toast.makeText(this, "Try clicking the menu for CV options.", + Toast.LENGTH_LONG).show(); + break; + case DIALOG_TUTORIAL_FAST: + Toast.makeText(this, "Detecting and Displaying FAST features", + Toast.LENGTH_LONG).show(); + break; + case DIALOG_TUTORIAL_SURF: + Toast.makeText(this, "Detecting and Displaying SURF features", + Toast.LENGTH_LONG).show(); + break; + case DIALOG_TUTORIAL_STAR: + Toast.makeText(this, "Detecting and Displaying STAR features", + Toast.LENGTH_LONG).show(); + break; + case DIALOG_TUTORIAL_CHESS: + Toast + .makeText( + this, + "Calibration Mode, Point at a chessboard pattern and press the camera button, space," + + "or the DPAD to capture.", + Toast.LENGTH_LONG).show(); + break; + + default: + break; + } + + } + + @Override + protected Dialog onCreateDialog(int id) { + Dialog dialog; + switch (id) { + case DIALOG_CALIBRATING: + dialog = makeCalibDialog(); + break; + + case DIALOG_CALIBRATION_FILE: + dialog = makeCalibFileAlert(); + break; + default: + dialog = null; + } + return dialog; + } + + private Dialog makeCalibFileAlert() { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage(calib_text).setTitle( + "camera.yml at " + calib_file_loc).setCancelable(false) + .setPositiveButton("Ok", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + + } + }); + AlertDialog alert = builder.create(); + return alert; + } + + /* + * (non-Javadoc) + * + * @see android.app.Activity#onKeyUp(int, android.view.KeyEvent) + */ + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + + switch (keyCode) { + case KeyEvent.KEYCODE_CAMERA: + case KeyEvent.KEYCODE_SPACE: + case KeyEvent.KEYCODE_DPAD_CENTER: + captureChess = true; + return true; + + default: + return super.onKeyUp(keyCode, event); + } + + } + + /* + * (non-Javadoc) + * + * @see android.app.Activity#onKeyLongPress(int, android.view.KeyEvent) + */ + @Override + public boolean onKeyLongPress(int keyCode, KeyEvent event) { + + return super.onKeyLongPress(keyCode, event); + } + + /** + * Avoid that the screen get's turned off by the system. + */ + public void disableScreenTurnOff() { + getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + + /** + * Set's the orientation to landscape, as this is needed by AndAR. + */ + public void setOrientation() { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + } + + /** + * Maximize the application. + */ + public void setFullscreen() { + requestWindowFeature(Window.FEATURE_NO_TITLE); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + } + + public void setNoTitle() { + requestWindowFeature(Window.FEATURE_NO_TITLE); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + menu.add("FAST"); + menu.add("STAR"); + menu.add("SURF"); + menu.add("Chess"); + return true; + } + + private NativePreviewer mPreview; + private GL2CameraViewer glview; + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + LinkedList defaultcallbackstack = new LinkedList(); + defaultcallbackstack.addFirst(glview.getDrawCallback()); + if (item.getTitle().equals("FAST")) { + + defaultcallbackstack.addFirst(new FastProcessor()); + toasts(DIALOG_TUTORIAL_FAST); + } + + else if (item.getTitle().equals("Chess")) { + + defaultcallbackstack.addFirst(new CalibrationProcessor()); + toasts(DIALOG_TUTORIAL_CHESS); + + } + + else if (item.getTitle().equals("STAR")) { + + defaultcallbackstack.addFirst(new STARProcessor()); + toasts(DIALOG_TUTORIAL_STAR); + + } + + else if (item.getTitle().equals("SURF")) { + + defaultcallbackstack.addFirst(new SURFProcessor()); + toasts(DIALOG_TUTORIAL_SURF); + + } + + mPreview.addCallbackStack(defaultcallbackstack); + return true; + } + + @Override + public void onOptionsMenuClosed(Menu menu) { + // TODO Auto-generated method stub + super.onOptionsMenuClosed(menu); + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setFullscreen(); + disableScreenTurnOff(); + + FrameLayout frame = new FrameLayout(this); + + // Create our Preview view and set it as the content of our activity. + mPreview = new NativePreviewer(getApplication(), 640, 480); + + LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT); + params.height = getWindowManager().getDefaultDisplay().getHeight(); + params.width = (int) (params.height * 4.0 / 2.88); + + LinearLayout vidlay = new LinearLayout(getApplication()); + + vidlay.setGravity(Gravity.CENTER); + vidlay.addView(mPreview, params); + frame.addView(vidlay); + + // make the glview overlay ontop of video preview + mPreview.setZOrderMediaOverlay(false); + + glview = new GL2CameraViewer(getApplication(), false, 0, 0); + glview.setZOrderMediaOverlay(true); + glview.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, + LayoutParams.FILL_PARENT)); + + ImageButton capture_button = new ImageButton(getApplicationContext()); + capture_button.setImageDrawable(getResources().getDrawable(android.R.drawable.ic_menu_camera)); + capture_button.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT)); + capture_button.setOnClickListener(new View.OnClickListener() { + + + @Override + public void onClick(View v) { + captureChess = true; + + } + }); + + LinearLayout buttons = new LinearLayout(getApplicationContext()); + buttons.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT)); + + buttons.addView(capture_button); + + Button focus_button = new Button(getApplicationContext()); + focus_button.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT)); + focus_button.setText("Focus"); + focus_button.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + mPreview.postautofocus(100); + } + }); + buttons.addView(focus_button); + + frame.addView(glview); + + frame.addView(buttons); + setContentView(frame); + toasts(DIALOG_OPENING_TUTORIAL); + + } + + @Override + public boolean onTrackballEvent(MotionEvent event) { + if(event.getAction() == MotionEvent.ACTION_UP){ + captureChess = true; + return true; + } + return super.onTrackballEvent(event); + } + + @Override + protected void onPause() { + super.onPause(); + + + //clears the callback stack + mPreview.onPause(); + + glview.onPause(); + + } + + @Override + protected void onResume() { + super.onResume(); + glview.onResume(); + + //add an initiall callback stack to the preview on resume... + //this one will just draw the frames to opengl + LinkedList cbstack = new LinkedList(); + cbstack.add(glview.getDrawCallback()); + mPreview.addCallbackStack(cbstack); + mPreview.onResume(); + + } + + // final processor so taht these processor callbacks can access it + final Processor processor = new Processor(); + + class FastProcessor implements NativeProcessor.PoolCallback { + + @Override + public void process(int idx, image_pool pool, long timestamp, + NativeProcessor nativeProcessor) { + processor.detectAndDrawFeatures(idx, pool, cvcamera.DETECT_FAST); + + } + + } + + class STARProcessor implements NativeProcessor.PoolCallback { + + @Override + public void process(int idx, image_pool pool, long timestamp, + NativeProcessor nativeProcessor) { + processor.detectAndDrawFeatures(idx, pool, cvcamera.DETECT_STAR); + + + } + + } + + class SURFProcessor implements NativeProcessor.PoolCallback { + + @Override + public void process(int idx, image_pool pool, long timestamp, + NativeProcessor nativeProcessor) { + processor.detectAndDrawFeatures(idx, pool, cvcamera.DETECT_SURF); + + } + + } + + String calib_text = null; + String calib_file_loc = null; + + class CalibrationProcessor implements NativeProcessor.PoolCallback { + + boolean calibrated = false; + + @Override + public void process(int idx, image_pool pool, long timestamp, + NativeProcessor nativeProcessor) { + + if (calibrated) { + processor.drawText(idx, pool, "Calibrated successfully"); + return; + } + if (processor.getNumberDetectedChessboards() == 10) { + + File opencvdir = new File(Environment + .getExternalStorageDirectory(), "opencv"); + if (!opencvdir.exists()) { + opencvdir.mkdir(); + } + File calibfile = new File(opencvdir, "camera.yml"); + + calib_file_loc = calibfile.getAbsolutePath(); + processor.calibrate(calibfile.getAbsolutePath()); + Log.i("chessboard", "calibrated"); + calibrated = true; + processor.resetChess(); + runOnUiThread(new Runnable() { + + @Override + public void run() { + removeDialog(DIALOG_CALIBRATING); + + } + }); + + try { + + StringBuilder text = new StringBuilder(); + String NL = System.getProperty("line.separator"); + Scanner scanner = new Scanner(calibfile); + + try { + while (scanner.hasNextLine()) { + text.append(scanner.nextLine() + NL); + } + } finally { + scanner.close(); + } + + calib_text = text.toString(); + + runOnUiThread(new Runnable() { + + @Override + public void run() { + showDialog(DIALOG_CALIBRATION_FILE); + + } + }); + + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } else if (captureChess + && processor.detectAndDrawChessboard(idx, pool)) { + + runOnUiThread(new Runnable() { + + String numchess = String.valueOf(processor + .getNumberDetectedChessboards()); + + @Override + public void run() { + Toast.makeText(CVCamera.this, + "Detected " + numchess + " of 10 chessboards", + Toast.LENGTH_SHORT).show(); + + } + }); + Log.i("cvcamera", + "detected a chessboard, n chess boards found: " + + String.valueOf(processor + .getNumberDetectedChessboards())); + + } + + captureChess = false; + + if (processor.getNumberDetectedChessboards() == 10) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + showDialog(DIALOG_CALIBRATING); + + } + }); + + processor.drawText(idx, pool, "Calibrating, please wait."); + } + if (processor.getNumberDetectedChessboards() < 10) { + + processor.drawText(idx, pool, "found " + + processor.getNumberDetectedChessboards() + + "/10 chessboards"); + } + + } + + } + +} diff --git a/android/apps/CVCamera/uninstall.phone.sh b/android/apps/CVCamera/uninstall.phone.sh new file mode 100755 index 0000000..06b78ca --- /dev/null +++ b/android/apps/CVCamera/uninstall.phone.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo uninstalling CVCamera from phone +adb uninstall com.theveganrobot.cvcamera diff --git a/android/apps/Calibration/AndroidManifest.xml b/android/apps/Calibration/AndroidManifest.xml new file mode 100644 index 0000000..2933e87 --- /dev/null +++ b/android/apps/Calibration/AndroidManifest.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/apps/Calibration/artwork/icon.xcf b/android/apps/Calibration/artwork/icon.xcf new file mode 100644 index 0000000000000000000000000000000000000000..aa7bb992b013a96171e3c6fe062d411b273afca0 GIT binary patch literal 9176 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 L!JzC!7vg^a`^fPp literal 0 HcmV?d00001 diff --git a/android/apps/Calibration/default.properties b/android/apps/Calibration/default.properties new file mode 100644 index 0000000..66148fe --- /dev/null +++ b/android/apps/Calibration/default.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +android.library.reference.1=../../android-jni +# Project target. +target=android-7 diff --git a/android/apps/Calibration/project_create.sh b/android/apps/Calibration/project_create.sh new file mode 100755 index 0000000..f8c9c51 --- /dev/null +++ b/android/apps/Calibration/project_create.sh @@ -0,0 +1,2 @@ +android update project --name Calibration \ +--path . diff --git a/android/apps/Calibration/res/drawable-hdpi/icon.png b/android/apps/Calibration/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9f9328896aac5829eaaf64ff631b4d790c17e3 GIT binary patch literal 5135 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 literal 0 HcmV?d00001 diff --git a/android/apps/Calibration/res/drawable-ldpi/icon.png b/android/apps/Calibration/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9f9328896aac5829eaaf64ff631b4d790c17e3 GIT binary patch literal 5135 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 literal 0 HcmV?d00001 diff --git a/android/apps/Calibration/res/drawable-mdpi/cameraback.jpg b/android/apps/Calibration/res/drawable-mdpi/cameraback.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b53ffd48914da75f62c83c4578ceff67b2d25914 GIT binary patch literal 164530 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%0D8kaD7Poz&;QG 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 z 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 literal 0 HcmV?d00001 diff --git a/android/apps/Calibration/res/drawable-mdpi/patternicon.png b/android/apps/Calibration/res/drawable-mdpi/patternicon.png new file mode 100644 index 0000000000000000000000000000000000000000..879044ad093ed2e68a26f7600ddb960c8b4f3e29 GIT binary patch literal 409 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyacIC_6YK2V5m}KU}$JzVE6?TYIwoGP-?)y@G60U!D`1bAgOnPZ!4!kK=DA zZRBh)5OIlDx#^I;QKZRx$NU|wI~t86b~O23ICAel_d%zLe_r=JmaXBNw21Mojbj?O zTpU{pLqlL#dc@4u*(+AO7b|;p!2OPR{RGDS3=w-i@Oi0CS`n4eAtcx$WGhxaabfD@ z%++saH^mkz`z^a)pTt(fSitnH%zlo`(swt24pA*}jVMV;EJ?LWE=mPb3`Pcq2D%0o xx<-Z}hL%=fq-$VeWniG!lG~4>AvZrIGp!Q0hWMLTje!~%JYD@<);T3K0RV;xeRu!> literal 0 HcmV?d00001 diff --git a/android/apps/Calibration/res/layout/camera.xml b/android/apps/Calibration/res/layout/camera.xml new file mode 100644 index 0000000..8e721d8 --- /dev/null +++ b/android/apps/Calibration/res/layout/camera.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/apps/Calibration/res/layout/chesssizer.xml b/android/apps/Calibration/res/layout/chesssizer.xml new file mode 100644 index 0000000..b93bc0b --- /dev/null +++ b/android/apps/Calibration/res/layout/chesssizer.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + diff --git a/android/apps/Calibration/res/menu/calibrationmenu.xml b/android/apps/Calibration/res/menu/calibrationmenu.xml new file mode 100644 index 0000000..8dd3457 --- /dev/null +++ b/android/apps/Calibration/res/menu/calibrationmenu.xml @@ -0,0 +1,17 @@ + +

+ + + + diff --git a/android/apps/Calibration/res/values/chessnumbers.xml b/android/apps/Calibration/res/values/chessnumbers.xml new file mode 100644 index 0000000..f0db569 --- /dev/null +++ b/android/apps/Calibration/res/values/chessnumbers.xml @@ -0,0 +1,20 @@ + + + +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 + + +Choose the width: + +Choose the height: + diff --git a/android/apps/Calibration/res/values/color.xml b/android/apps/Calibration/res/values/color.xml new file mode 100644 index 0000000..e339837 --- /dev/null +++ b/android/apps/Calibration/res/values/color.xml @@ -0,0 +1,5 @@ + + +#00ff00 +#FF0000 + diff --git a/android/apps/Calibration/res/values/strings.xml b/android/apps/Calibration/res/values/strings.xml new file mode 100644 index 0000000..a33cf0b --- /dev/null +++ b/android/apps/Calibration/res/values/strings.xml @@ -0,0 +1,24 @@ + + + Calibration + Pattern Size + Please choose the width and height (number of inside corners) of the checker + board pattern you will be using for calibration. Default is 6 by 8 corners. You may find a checkerboard pattern at + http://opencv.willowgarage.com/pattern + + http://opencv.willowgarage.com/pattern + + /opencv/camera.yml + /opencv + + Calibration calculations have started... + Calibration calculations has stopped. + Calibration finished, you camera is calibrated. + + Calibration + Please capture atleast 3 - preferably greater than 10 - images of the pattern! + + + Please make sure that you\'re sdcard is not mounted to you\'re computer, and that you have an sdcard that is writable on your device. + + diff --git a/android/apps/Calibration/src/com/opencv/calibration/Calibration.java b/android/apps/Calibration/src/com/opencv/calibration/Calibration.java new file mode 100644 index 0000000..5c7abf3 --- /dev/null +++ b/android/apps/Calibration/src/com/opencv/calibration/Calibration.java @@ -0,0 +1,311 @@ +package com.opencv.calibration; + +import java.io.File; +import java.io.IOException; +import java.util.LinkedList; + +import android.app.Activity; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.content.pm.ActivityInfo; +import android.os.Bundle; +import android.os.IBinder; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.ImageButton; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.opencv.calibration.Calibrator.CalibrationCallback; +import com.opencv.calibration.services.CalibrationService; +import com.opencv.camera.NativePreviewer; +import com.opencv.camera.NativeProcessor; +import com.opencv.misc.SDCardChecker; +import com.opencv.opengl.GL2CameraViewer; + +public class Calibration extends Activity implements CalibrationCallback { + private NativePreviewer mPreview; + + private GL2CameraViewer glview; + private Calibrator calibrator; + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + + switch (keyCode) { + case KeyEvent.KEYCODE_CAMERA: + case KeyEvent.KEYCODE_SPACE: + case KeyEvent.KEYCODE_DPAD_CENTER: + calibrator.queueChessCapture(); + return true; + default: + return super.onKeyUp(keyCode, event); + } + + } + + @Override + public boolean onTrackballEvent(MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_UP) { + calibrator.queueChessCapture(); + return true; + } + return super.onTrackballEvent(event); + } + + /** + * Avoid that the screen get's turned off by the system. + */ + public void disableScreenTurnOff() { + getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + + /** + * Set's the orientation to landscape, as this is needed by AndAR. + */ + public void setOrientation() { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + } + + /** + * Maximize the application. + */ + public void setFullscreen() { + requestWindowFeature(Window.FEATURE_NO_TITLE); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + } + + public void setNoTitle() { + requestWindowFeature(Window.FEATURE_NO_TITLE); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.calibrationmenu, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.patternsize: { + Intent sizer = new Intent(getApplicationContext(), + ChessBoardChooser.class); + startActivity(sizer); + } + break; + case R.id.help: + help(); + break; + case R.id.calibrate: + calibrate(); + break; + } + + return true; + + } + + private void help() { + // TODO Auto-generated method stub + + } + + @Override + public void onOptionsMenuClosed(Menu menu) { + // TODO Auto-generated method stub + super.onOptionsMenuClosed(menu); + } + + private ServiceConnection mConnection = new ServiceConnection() { + + @Override + public void onServiceDisconnected(ComponentName name) { + + } + + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + + CalibrationService calibservice = ((CalibrationService.CalibrationServiceBinder) service) + .getService(); + if (!SDCardChecker.CheckStorage(Calibration.this)) + return; + SDCardChecker.MakeDataDir(Calibration.this); + + File calibfile = SDCardChecker.getFile(calibservice, + R.string.calibfile); + try { + + Calibrator tcalib = calibrator; + calibrator = new Calibrator(Calibration.this); + setCallbackStack(); + calibservice.startCalibrating(tcalib, calibfile); + } catch (IOException e) { + e.printStackTrace(); + } + + // Tell the user about this for our demo. + Toast.makeText(Calibration.this, + "Starting calibration in the background.", + Toast.LENGTH_SHORT).show(); + unbindService(this); + } + + }; + + public static File getCalibrationFile(Context ctx) { + return SDCardChecker.getFile(ctx, R.string.calibfile); + } + + void doBindCalibService() { + // Establish a connection with the service. We use an explicit + // class name because we want a specific service implementation that + // we know will be running in our own process (and thus won't be + // supporting component replacement by other applications). + bindService(new Intent(Calibration.this, CalibrationService.class), + mConnection, Context.BIND_AUTO_CREATE); + } + + void calibrate() { + if (calibrator.getNumberPatternsDetected() < 3) { + Toast.makeText(this, getText(R.string.calibration_not_enough), + Toast.LENGTH_LONG).show(); + return; + } + Intent calibservice = new Intent(Calibration.this, + CalibrationService.class); + startService(calibservice); + doBindCalibService(); + + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setFullscreen(); + disableScreenTurnOff(); + setContentView(R.layout.camera); + mPreview = (NativePreviewer) findViewById(R.id.nativepreviewer); + LinearLayout glview_layout = (LinearLayout) findViewById(R.id.glview_layout); + glview = new GL2CameraViewer(getApplication(), false, 0, 0); + glview_layout.addView(glview); + calibrator = new Calibrator(this); + + ImageButton capturebutton = (ImageButton) findViewById(R.id.capture); + capturebutton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + calibrator.queueChessCapture(); + + } + }); + ImageButton calibbutton = (ImageButton) findViewById(R.id.calibrate); + calibbutton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + calibrate(); + } + }); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + } + + @Override + protected void onPause() { + super.onPause(); + + mPreview.onPause(); + + glview.onPause(); + + } + + protected void setCallbackStack() { + calibrator.setPatternSize(ChessBoardChooser.getPatternSize(this)); + + LinkedList callbackstack = new LinkedList(); + callbackstack.add(calibrator); + callbackstack.add(glview.getDrawCallback()); + mPreview.addCallbackStack(callbackstack); + updateNumber(calibrator); + } + + @Override + protected void onResume() { + super.onResume(); + glview.onResume(); + mPreview.onResume(); + setCallbackStack(); + + } + + void updateNumber(Calibrator calibrator) { + TextView numbertext = (TextView) findViewById(R.id.numberpatterns); + int numdetectd = calibrator.getNumberPatternsDetected(); + if (numdetectd > 2) { + numbertext + .setTextColor(getResources().getColor(R.color.good_color)); + + } else + numbertext.setTextColor(getResources().getColor(R.color.bad_color)); + + numbertext.setText(String.valueOf(numdetectd)); + + } + + @Override + public void onFoundChessboard(final Calibrator calibrator) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + Toast.makeText(Calibration.this, + "Captured a calibration pattern!", Toast.LENGTH_SHORT) + .show(); + updateNumber(calibrator); + + } + }); + + } + + @Override + public void onDoneCalibration(Calibrator calibration, File calibfile) { + + } + + @Override + public void onFailedChessboard(final Calibrator calibrator) { + runOnUiThread(new Runnable() { + + @Override + public void run() { + Toast.makeText( + Calibration.this, + "No pattern found. Make sure its the right dimensions, and close enough...", + Toast.LENGTH_LONG).show(); + updateNumber(calibrator); + + } + }); + + } + +} \ No newline at end of file diff --git a/android/apps/Calibration/src/com/opencv/calibration/ChessBoardChooser.java b/android/apps/Calibration/src/com/opencv/calibration/ChessBoardChooser.java new file mode 100644 index 0000000..10f9360 --- /dev/null +++ b/android/apps/Calibration/src/com/opencv/calibration/ChessBoardChooser.java @@ -0,0 +1,74 @@ +package com.opencv.calibration; + +import com.opencv.jni.Size; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.os.Bundle; +import android.view.View; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemSelectedListener; +import android.widget.Spinner; + +public class ChessBoardChooser extends Activity { + public static final String CHESS_SIZE = "chess_size"; + public static final int DEFAULT_WIDTH = 6; + public static final int DEFAULT_HEIGHT = 8; + public static final int LOWEST = 3; + + class DimChooser implements OnItemSelectedListener { + private String dim; + + public DimChooser(String dim) { + this.dim = dim; + } + + @Override + public void onItemSelected(AdapterView arg0, View arg1, int pos, + long arg3) { + SharedPreferences settings = getSharedPreferences(CHESS_SIZE, 0); + Editor editor = settings.edit(); + editor.putInt(dim, pos + LOWEST); + editor.commit(); + } + + @Override + public void onNothingSelected(AdapterView arg0) { + } + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + // TODO Auto-generated method stub + super.onCreate(savedInstanceState); + setContentView(R.layout.chesssizer); + // Restore preferences + SharedPreferences settings = getSharedPreferences(CHESS_SIZE, 0); + int width = settings.getInt("width", 6); + + int height = settings.getInt("height", 8); + + Spinner wspin, hspin; + wspin = (Spinner) findViewById(R.id.rows); + hspin = (Spinner) findViewById(R.id.cols); + + wspin.setSelection(width - LOWEST); + hspin.setSelection(height - LOWEST); + + wspin.setOnItemSelectedListener(new DimChooser("width")); + hspin.setOnItemSelectedListener(new DimChooser("height")); + + } + + public static Size getPatternSize(Context ctx) { + SharedPreferences settings = ctx.getSharedPreferences(CHESS_SIZE, 0); + int width = settings.getInt("width", 6); + + int height = settings.getInt("height", 8); + + return new Size(width, height); + } + +} diff --git a/android/apps/Calibration/src/com/opencv/calibration/services/CalibrationService.java b/android/apps/Calibration/src/com/opencv/calibration/services/CalibrationService.java new file mode 100644 index 0000000..bc9d5cd --- /dev/null +++ b/android/apps/Calibration/src/com/opencv/calibration/services/CalibrationService.java @@ -0,0 +1,151 @@ +package com.opencv.calibration.services; + +import java.io.File; +import java.io.IOException; + +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.Service; +import android.content.Intent; +import android.os.Binder; +import android.os.IBinder; +import android.util.Log; +import android.widget.Toast; + +import com.opencv.calibration.Calibration; +import com.opencv.calibration.Calibrator; +import com.opencv.calibration.Calibrator.CalibrationCallback; +import com.opencv.calibration.R; + +public class CalibrationService extends Service implements CalibrationCallback { + + public void startCalibrating(Calibrator calibrator, File calibration_file) + throws IOException { + calibrator.setCallback(this); + calibrator.calibrate(calibration_file); + } + + private NotificationManager mNM; + + /** + * Class for clients to access. Because we know this service always runs in + * the same process as its clients, we don't need to deal with IPC. + */ + public class CalibrationServiceBinder extends Binder { + public CalibrationService getService() { + return CalibrationService.this; + } + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Log.i("LocalService", "Received start id " + startId + ": " + intent); + // We want this service to continue running until it is explicitly + // stopped, so return sticky. + return START_NOT_STICKY; + } + + @Override + public void onCreate() { + mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); + + // Display a notification about us starting. We put an icon in the + // status bar. + showNotification(); + } + + @Override + public void onDestroy() { + // Cancel the persistent notification. + // mNM.cancel(R.string.calibration_service_started); + + // Tell the user we stopped. + Toast.makeText(this, R.string.calibration_service_finished, + Toast.LENGTH_SHORT).show(); + } + + private final IBinder mBinder = new CalibrationServiceBinder(); + + @Override + public IBinder onBind(Intent intent) { + return mBinder; + } + + /** + * Show a notification while this service is running. + */ + private void showNotification() { + // In this sample, we'll use the same text for the ticker and the + // expanded notification + CharSequence text = getText(R.string.calibration_service_started); + + // Set the icon, scrolling text and timestamp + Notification notification = new Notification(R.drawable.icon, text, + System.currentTimeMillis()); + + // The PendingIntent to launch our activity if the user selects this + // notification + PendingIntent contentIntent = PendingIntent.getActivity(this, 0, + new Intent(this, Calibration.class), 0); + + // Set the info for the views that show in the notification panel. + notification.setLatestEventInfo(this, + getText(R.string.calibration_service_label), text, + contentIntent); + + notification.defaults |= Notification.DEFAULT_SOUND; + // Send the notification. + // We use a layout id because it is a unique number. We use it later to + // cancel. + mNM.notify(R.string.calibration_service_started, notification); + } + + /** + * Show a notification while this service is running. + */ + private void doneNotification() { + // In this sample, we'll use the same text for the ticker and the + // expanded notification + CharSequence text = getText(R.string.calibration_service_finished); + + // Set the icon, scrolling text and timestamp + Notification notification = new Notification(R.drawable.icon, text, + System.currentTimeMillis()); + + // The PendingIntent to launch our activity if the user selects this + // notification + PendingIntent contentIntent = PendingIntent.getActivity(this, 0, + new Intent(this, Calibration.class), 0); + + // Set the info for the views that show in the notification panel. + notification.setLatestEventInfo(this, + getText(R.string.calibration_service_label), text, + contentIntent); + + notification.defaults |= Notification.DEFAULT_SOUND; + // Send the notification. + // We use a layout id because it is a unique number. We use it later to + // cancel. + mNM.notify(R.string.calibration_service_started, notification); + } + + @Override + public void onFoundChessboard(Calibrator calibrator) { + // TODO Auto-generated method stub + + } + + @Override + public void onDoneCalibration(Calibrator calibration, File calibfile) { + doneNotification(); + stopSelf(); + } + + @Override + public void onFailedChessboard(Calibrator calibrator) { + // TODO Auto-generated method stub + + } + +} diff --git a/android/apps/Calibration/src/com/opencv/misc/SDCardChecker.java b/android/apps/Calibration/src/com/opencv/misc/SDCardChecker.java new file mode 100644 index 0000000..1a7d2b7 --- /dev/null +++ b/android/apps/Calibration/src/com/opencv/misc/SDCardChecker.java @@ -0,0 +1,64 @@ +package com.opencv.misc; + +import java.io.File; + +import android.content.Context; +import android.os.Environment; +import android.widget.Toast; + +import com.opencv.calibration.R; + +public class SDCardChecker { + + public static File createThumb(Context ctx, File workingDir) { + return new File(workingDir, "thumb.jpg"); + } + + public static File getDir(Context ctx, String relativename) { + return new File(Environment.getExternalStorageDirectory() + + relativename); + } + + public static File getDir(Context ctx, int id) { + return new File(Environment.getExternalStorageDirectory() + + ctx.getResources().getString(id)); + } + + public static File getFile(Context ctx, int id) { + return new File(Environment.getExternalStorageDirectory() + + ctx.getResources().getString(id)); + } + + public static void MakeDataDir(Context ctx) { + File dir = getDir(ctx, R.string.sdcarddir); + dir.mkdirs(); + } + + public static boolean CheckStorage(Context ctx) { + boolean mExternalStorageAvailable = false; + boolean mExternalStorageWriteable = false; + String state = Environment.getExternalStorageState(); + + if (Environment.MEDIA_MOUNTED.equals(state)) { + // We can read and write the media + mExternalStorageAvailable = mExternalStorageWriteable = true; + } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { + // We can only read the media + mExternalStorageAvailable = true; + mExternalStorageWriteable = false; + } else { + // Something else is wrong. It may be one of many other states, but + // all we need + // to know is we can neither read nor write + mExternalStorageAvailable = mExternalStorageWriteable = false; + } + boolean goodmount = mExternalStorageAvailable + && mExternalStorageWriteable; + if (!goodmount) { + Toast.makeText(ctx, ctx.getString(R.string.sdcard_error_msg), + Toast.LENGTH_LONG).show(); + } + return goodmount; + } + +} diff --git a/android/apps/camera_template/AndroidManifest.xml b/android/apps/camera_template/AndroidManifest.xml new file mode 100644 index 0000000..6af45ff --- /dev/null +++ b/android/apps/camera_template/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/apps/camera_template/Makefile b/android/apps/camera_template/Makefile new file mode 100644 index 0000000..3d1e8ee --- /dev/null +++ b/android/apps/camera_template/Makefile @@ -0,0 +1,98 @@ +#Re-usable Makefile template for +#android-ndk + swig projects +#author: Ethan Rublee +#date: summer 2010 + +# The path to the NDK, requires crystax version r-4 for now, due to support +#for the standard library +ifndef ANDROID_NDK_BASE +ANDROID_NDK_BASE = $(HOME)/android-ndk-r4-crystax +$(info default ndk location set ANDROID_NDK_BASE = $(ANDROID_NDK_BASE)) +endif + +#define OPENCV_ROOT when calling this makefile +#OPENCV_ROOT = $(ANDROID_NDK_BASE)/apps/opencv +ifndef OPENCV_ROOT +$(error Please define OPENCV_ROOT with something like the command \ +make OPENCV_ROOT=) +endif + +ifndef PROJECT_PATH +$(info PROJECT_PATH defaulting to this directory) +PROJECT_PATH=. +endif + +$(info OPENCV_ROOT = $(OPENCV_ROOT)) + +# The name of the native library +LIBNAME = libfoobar.so + +#define the main jni swig interface file +#the desired java package name +#and the desired java directory +#notice that the package and the java dir +#are related... +SWIG_MAIN = jni/foobar.i +SWIG_JAVA_PACKAGE = com.foo.bar.jni +SWIG_JAVA_DIR = src/com/foo/bar/jni + +SWIG_BASE = foobar + +#swig definitions - auto as long as all the +#swig interface files are in jni/*.i +SWIG_JAVA_OUT = $(wildcard $(SWIG_JAVA_DIR)/*.java) +SWIG_IS = $(wildcard jni/*.i) + +#the directory where the jni sources are +C_DIR = jni + +#directory where to put generated files +#relative to the C_DIR +GEN_DIR = gen + +#the c swig is generated and put into the jni/gen folder +SWIG_C_DIR = $(C_DIR)/$(GEN_DIR) + +#this file - jin/gen/foobar_swig.cpp must be included in the Android.mk +#for it to be built! +SWIG_C_OUT = $(SWIG_C_DIR)/$(SWIG_BASE)_swig.cpp + +# The real native library stripped of symbols +LIB = libs/armeabi-v7a/$(LIBNAME) libs/armeabi/$(LIBNAME) + +# Find all the C++ sources in the native folder +SOURCES = $(wildcard jni/*.cpp) +HEADERS = $(wildcard jni/*.h) + +ANDROID_MKS = $(wildcard jni/*.mk) + +#this gets called by the make command +all: $(LIB) + +#calls the ndk-build script, passing it OPENCV_ROOT and OPENCV_LIBS_DIR +$(LIB): $(SWIG_C_OUT) $(SOURCES) $(HEADERS) $(ANDROID_MKS) + $(ANDROID_NDK_BASE)/ndk-build OPENCV_ROOT=$(OPENCV_ROOT) \ + OPENCV_LIBS_DIR=$(OPENCV_LIBS_DIR) PROJECT_PATH=$(PROJECT_PATH) SWIG_C_OUT=$(GEN_DIR)/$(SWIG_BASE)_swig.cpp V=$(V) $(NDK_FLAGS) + + +#this creates the swig wrappers +#-I$(OPENCV_ROOT)/android/jni is an additional swig include path +$(SWIG_C_OUT): $(SWIG_IS) + make clean-swig &&\ + mkdir -p $(SWIG_C_DIR) &&\ + mkdir -p $(SWIG_JAVA_DIR) &&\ + swig -java -c++ -I$(OPENCV_ROOT)/android/jni -package "$(SWIG_JAVA_PACKAGE)" \ + -outdir $(SWIG_JAVA_DIR) \ + -o $(SWIG_C_OUT) $(SWIG_MAIN) + + +#clean targets +.PHONY: clean clean-swig cleanall + +#this deletes the generated swig java and the generated c wrapper +clean-swig: + rm -f $(SWIG_JAVA_OUT) $(SWIG_C_OUT) + +#does clean-swig and then uses the ndk-build clean +clean: clean-swig + $(ANDROID_NDK_BASE)/ndk-build clean V=$(V) $(NDK_FLAGS) diff --git a/android/apps/camera_template/README.txt b/android/apps/camera_template/README.txt new file mode 100644 index 0000000..14d57b5 --- /dev/null +++ b/android/apps/camera_template/README.txt @@ -0,0 +1,2 @@ +see http://code.google.com/p/android-opencv/wiki/camera_template + diff --git a/android/apps/camera_template/build.sh b/android/apps/camera_template/build.sh new file mode 100644 index 0000000..92772c3 --- /dev/null +++ b/android/apps/camera_template/build.sh @@ -0,0 +1 @@ +make OPENCV_ROOT=../../opencv V=0 diff --git a/android/apps/camera_template/clean.sh b/android/apps/camera_template/clean.sh new file mode 100644 index 0000000..121e391 --- /dev/null +++ b/android/apps/camera_template/clean.sh @@ -0,0 +1 @@ +make OPENCV_ROOT=../../opencv V=0 clean diff --git a/android/apps/camera_template/default.properties b/android/apps/camera_template/default.properties new file mode 100644 index 0000000..8878724 --- /dev/null +++ b/android/apps/camera_template/default.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +android.library.reference.1=../../opencv/android/ +# Project target. +target=android-7 diff --git a/android/apps/camera_template/jni/Android.mk b/android/apps/camera_template/jni/Android.mk new file mode 100644 index 0000000..b66bb70 --- /dev/null +++ b/android/apps/camera_template/jni/Android.mk @@ -0,0 +1,36 @@ +# date: Summer, 2010 +# author: Ethan Rublee +# contact: ethan.rublee@gmail.com +# +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +#pass in OPENCV_ROOT or define it here +#OPENCV_ROOT := ~/android-opencv/opencv +ifndef OPENCV_ROOT +${error please define OPENCV_ROOT before this point!} +endif + +#define OPENCV_INCLUDES +include $(OPENCV_ROOT)/includes.mk +#define OPENCV_LIBS +include $(OPENCV_ROOT)/libs.mk + +LOCAL_LDLIBS += $(OPENCV_LIBS) $(ANDROID_OPENCV_LIBS) -llog -lGLESv2 + +LOCAL_C_INCLUDES += $(OPENCV_INCLUDES) $(ANDROID_OPENCV_INCLUDES) + +LOCAL_MODULE := foobar + + +ifndef SWIG_C_OUT +${error please define SWIG_C_OUT before this point!} +endif + +#make sure to pass in SWIG_C_OUT=gen/foobar_swig.cpp +#done in the makefile +LOCAL_SRC_FILES := ${SWIG_C_OUT} TestBar.cpp + +include $(BUILD_SHARED_LIBRARY) + diff --git a/android/apps/camera_template/jni/Application.mk b/android/apps/camera_template/jni/Application.mk new file mode 100644 index 0000000..a2c96a8 --- /dev/null +++ b/android/apps/camera_template/jni/Application.mk @@ -0,0 +1,2 @@ +# The ARMv7 is significanly faster due to the use of the hardware FPU +APP_ABI := armeabi armeabi-v7a \ No newline at end of file diff --git a/android/apps/camera_template/jni/TestBar.cpp b/android/apps/camera_template/jni/TestBar.cpp new file mode 100644 index 0000000..869113a --- /dev/null +++ b/android/apps/camera_template/jni/TestBar.cpp @@ -0,0 +1,5 @@ +#include "TestBar.h" + +void BarBar::crazy(){ + +} diff --git a/android/apps/camera_template/jni/TestBar.h b/android/apps/camera_template/jni/TestBar.h new file mode 100644 index 0000000..e919f8f --- /dev/null +++ b/android/apps/camera_template/jni/TestBar.h @@ -0,0 +1,26 @@ +/* + * TestBar.h + * + * Created on: Jul 17, 2010 + * Author: ethan + */ + +#ifndef TESTBAR_H_ +#define TESTBAR_H_ + +#include "image_pool.h" + +struct FooBarStruct { + + int pool_image_count(image_pool* pool){ + return pool->getCount(); + } + +}; + +class BarBar{ +public: + void crazy(); +}; + +#endif /* TESTBAR_H_ */ diff --git a/android/apps/camera_template/jni/foobar.i b/android/apps/camera_template/jni/foobar.i new file mode 100644 index 0000000..a66a059 --- /dev/null +++ b/android/apps/camera_template/jni/foobar.i @@ -0,0 +1,68 @@ +/* File : foobar.i */ +%module foobar + +/* + * the java import code muse be included for the opencv jni wrappers + * this means that the android project must reference opencv/android as a project + * see the default.properties for how this is done + */ +%pragma(java) jniclassimports=%{ +import com.opencv.jni.*; //import the android-opencv jni wrappers +%} + +%pragma(java) jniclasscode=%{ + static { + try { + //load the cvcamera library, make sure that libcvcamera.so is in your /libs/armeabi directory + //so that android sdk automatically installs it along with the app. + + //the android-opencv lib must be loaded first inorder for the cvcamera + //lib to be found + //check the apk generated, by opening it in an archive manager, to verify that + //both these libraries are present + System.loadLibrary("android-opencv"); + System.loadLibrary("foobar"); + } catch (UnsatisfiedLinkError e) { + //badness + throw e; + } + } + +%} + +%{ +#include "image_pool.h" +#include "TestBar.h" +using namespace cv; +%} + + +//import the android-cv.i file so that swig is aware of all that has been previous defined +//notice that it is not an include.... +%import "android-cv.i" + + +//make sure to import the image_pool as it is +//referenced by the Processor java generated +//class +%typemap(javaimports) FooBarStruct " +import com.opencv.jni.image_pool;// import the image_pool interface for playing nice with + // android-opencv + +/** FooBar - template +*/" + +//sample inline class that needs to include image_pool +struct FooBarStruct { + + int pool_image_count(image_pool* pool){ + return pool->getCount(); + } + +}; + +//sample jni class +class BarBar{ +public: + void crazy(); +}; diff --git a/android/apps/camera_template/res/drawable-hdpi/icon.png b/android/apps/camera_template/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4e828bafd86aae740c6d4da0af6cc67653b535a5 GIT binary patch literal 5760 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 V9}r2j|9cq#=xN{7s@8Of{2yTISoHt^ literal 0 HcmV?d00001 diff --git a/android/apps/camera_template/res/drawable-ldpi/icon.png b/android/apps/camera_template/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5e11406cb22ee31db3e88479d0dc73ee54e77127 GIT binary patch literal 2034 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 + +FooBar +FooBar is a template app for the android-opencv project!\nVisit http://code.google.com/p/android-opencv for details. +About FooBar +About +O.K. + diff --git a/android/apps/camera_template/src/com/foo/bar/FooBar.java b/android/apps/camera_template/src/com/foo/bar/FooBar.java new file mode 100644 index 0000000..6bc31be --- /dev/null +++ b/android/apps/camera_template/src/com/foo/bar/FooBar.java @@ -0,0 +1,224 @@ +package com.foo.bar; + +import java.util.LinkedList; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.Bundle; +import android.util.Log; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.Window; +import android.view.WindowManager; +import android.view.ViewGroup.LayoutParams; +import android.widget.FrameLayout; +import android.widget.LinearLayout; + +//make sure you have the OpenCV project open, so that the +//android-sdk can find it! +import com.foo.bar.jni.BarBar; +import com.foo.bar.jni.FooBarStruct; +import com.opencv.camera.NativePreviewer; +import com.opencv.camera.NativeProcessor; +import com.opencv.camera.NativeProcessor.PoolCallback; +import com.opencv.jni.image_pool; +import com.opencv.opengl.GL2CameraViewer; + +public class FooBar extends Activity { + + private final int FOOBARABOUT = 0; + + @Override + protected Dialog onCreateDialog(int id) { + Dialog dialog; + switch (id) { + case FOOBARABOUT: + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.about_title); + builder.setMessage(R.string.about_str); + builder.setPositiveButton(R.string.ok, + new DialogInterface.OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, int which) { + dismissDialog(FOOBARABOUT); + + } + }); + dialog = builder.create(); + default: + dialog = null; + } + return dialog; + } + + /* + * Handle the capture button as follows... + */ + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + + switch (keyCode) { + case KeyEvent.KEYCODE_CAMERA: + case KeyEvent.KEYCODE_SPACE: + case KeyEvent.KEYCODE_DPAD_CENTER: + // capture button pressed here + return true; + + default: + return super.onKeyUp(keyCode, event); + } + + } + + /* + * Handle the capture button as follows... On some phones there is no + * capture button, only trackball + */ + @Override + public boolean onTrackballEvent(MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_UP) { + // capture button pressed + return true; + } + return super.onTrackballEvent(event); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + menu.add(R.string.about_menu); + return true; + } + + private NativePreviewer mPreview; + private GL2CameraViewer glview; + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // example menu + if (item.getTitle().equals( + getResources().getString(R.string.about_menu))) { + showDialog(FOOBARABOUT); + } + return true; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + requestWindowFeature(Window.FEATURE_NO_TITLE); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + + FrameLayout frame = new FrameLayout(this); + + // Create our Preview view and set it as the content of our activity. + mPreview = new NativePreviewer(getApplication(), 300, 300); + + LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT); + params.height = getWindowManager().getDefaultDisplay().getHeight(); + params.width = (int) (params.height * 4.0 / 2.88); + + LinearLayout vidlay = new LinearLayout(getApplication()); + + vidlay.setGravity(Gravity.CENTER); + vidlay.addView(mPreview, params); + frame.addView(vidlay); + + // make the glview overlay ontop of video preview + mPreview.setZOrderMediaOverlay(false); + + glview = new GL2CameraViewer(getApplication(), false, 0, 0); + glview.setZOrderMediaOverlay(true); + glview.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, + LayoutParams.FILL_PARENT)); + frame.addView(glview); + + setContentView(frame); + + } + + @Override + protected void onPause() { + super.onPause(); + + // IMPORTANT + // must tell the NativePreviewer of a pause + // and the glview - so that they can release resources and start back up + // properly + // failing to do this will cause the application to crash with no + // warning + // on restart + // clears the callback stack + mPreview.onPause(); + + glview.onPause(); + + } + + @Override + protected void onResume() { + super.onResume(); + + // resume the opengl viewer first + glview.onResume(); + + // add an initial callback stack to the preview on resume... + // this one will just draw the frames to opengl + LinkedList cbstack = new LinkedList(); + + // SpamProcessor will be called first + cbstack.add(new SpamProcessor()); + + // then the same idx and pool will be passed to + // the glview callback - + // so operate on the image at idx, and modify, and then + // it will be drawn in the glview + // or remove this, and call glview manually in SpamProcessor + // cbstack.add(glview.getDrawCallback()); + + mPreview.addCallbackStack(cbstack); + mPreview.onResume(); + + } + + class SpamProcessor implements NativeProcessor.PoolCallback { + + FooBarStruct foo = new FooBarStruct(); + BarBar barbar = new BarBar(); + + @Override + public void process(int idx, image_pool pool, long timestamp, + NativeProcessor nativeProcessor) { + + // example of using the jni generated FoobarStruct; + int nImages = foo.pool_image_count(pool); + Log.i("foobar", "Number of images in pool: " + nImages); + + // call a function - this function does absolutely nothing! + barbar.crazy(); + + // sample processor + // this gets called every frame in the order of the list + // first add to the callback stack linked list will be the + // first called + // the idx and pool may be used to get the cv::Mat + // that is the latest frame being passed. + // pool.getClass(idx) + + // these are what the glview.getDrawCallback() calls + glview.drawMatToGL(idx, pool); + glview.requestRender(); + + } + + } + +} -- 2.7.4