parent
bbdd0aecbd
commit
68534d70f3
120 changed files with 3475 additions and 1612 deletions
@ -1,17 +0,0 @@ |
||||
LOCAL_PATH := ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
|
||||
include $(CLEAR_VARS) |
||||
|
||||
LOCAL_MODULE := ${android_module_name}
|
||||
|
||||
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) |
||||
LOCAL_ARM_NEON := true
|
||||
endif |
||||
|
||||
LOCAL_SRC_FILES := ${android_srcs}
|
||||
|
||||
LOCAL_CFLAGS := ${android_defs}
|
||||
|
||||
LOCAL_C_INCLUDES := ${include_dirs} $(LOCAL_PATH)
|
||||
|
||||
include $(BUILD_STATIC_LIBRARY) |
@ -1,5 +0,0 @@ |
||||
include android-opencv.mk |
||||
include modules/Android.mk |
||||
include 3rdparty/Android.mk |
||||
#include zlib-android/Android.mk |
||||
|
@ -1,2 +0,0 @@ |
||||
include $(call all-subdir-makefiles) |
||||
|
@ -1,28 +0,0 @@ |
||||
macro(define_android_manual name lib_srcs includes) |
||||
set(android_module_name ${name}) |
||||
set(android_srcs "") |
||||
set(include_dirs "${includes}") |
||||
foreach(f ${lib_srcs}) |
||||
string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" n_f ${f}) |
||||
set(android_srcs "${android_srcs} ${n_f}") |
||||
endforeach() |
||||
configure_file("${CMAKE_SOURCE_DIR}/Android.mk.in" "${CMAKE_CURRENT_BINARY_DIR}/Android.mk") |
||||
endmacro() |
||||
|
||||
|
||||
macro(define_3rdparty_module name) |
||||
file(GLOB lib_srcs "*.c" "*.cpp") |
||||
file(GLOB lib_int_hdrs "*.h*") |
||||
define_android_manual(${name} "${lib_srcs}" "$(LOCAL_PATH)/../include") |
||||
endmacro() |
||||
|
||||
macro(define_opencv_module name) |
||||
file(GLOB lib_srcs "src/*.cpp") |
||||
file(GLOB lib_int_hdrs "src/*.h*") |
||||
define_android_manual(opencv_${name} "${lib_srcs}" "$(LOCAL_PATH)/src $(OPENCV_INCLUDES)") |
||||
endmacro() |
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,7 +0,0 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" |
||||
package="com.opencv" |
||||
android:versionCode="1" |
||||
android:versionName="1.0"> |
||||
|
||||
</manifest> |
@ -1,6 +0,0 @@ |
||||
APP_BUILD_SCRIPT := $(call my-dir)/Android.mk
|
||||
APP_PROJECT_PATH := $(call my-dir)
|
||||
# The ARMv7 is significanly faster due to the use of the hardware FPU
|
||||
APP_ABI := ${ARM_TARGETS}
|
||||
APP_MODULES := png jpeg jasper zlib opencv_lapack opencv_core opencv_imgproc opencv_ml opencv_highgui opencv_features2d \
|
||||
opencv_legacy opencv_objdetect opencv_calib3d opencv_video opencv_contrib opencv_flann
|
@ -0,0 +1,110 @@ |
||||
######################## |
||||
# Initial cache settings for opencv on android |
||||
# run cmake with: |
||||
# cmake -C |
||||
######################## |
||||
#Build all examples |
||||
set(BUILD_EXAMPLES OFF CACHE BOOL "" ) |
||||
|
||||
#Build Reference Manual |
||||
set(BUILD_REFMAN OFF CACHE BOOL "" ) |
||||
|
||||
#Build LaTeX OpenCV Documentation |
||||
#set(BUILD_LATEX_DOCS OFF CACHE BOOL "" ) |
||||
|
||||
#Build with Python support |
||||
set(BUILD_NEW_PYTHON_SUPPORT OFF CACHE BOOL "" ) |
||||
|
||||
#Build a installer with the SDK |
||||
set(BUILD_PACKAGE OFF CACHE BOOL "" ) |
||||
|
||||
#Build shared libraries (.dll/.so CACHE BOOL "" ) instead of static ones (.lib/.a CACHE BOOL "" ) |
||||
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" ) |
||||
|
||||
#Build 3rd party libraries |
||||
set(OPENCV_BUILD_3RDPARTY_LIBS ON CACHE BOOL "" ) |
||||
|
||||
#Build tests |
||||
set(BUILD_TESTS OFF CACHE BOOL "" ) |
||||
|
||||
#Choose the type of build, options are: None Debug Release RelWithDebInfo |
||||
# MinSizeRel. |
||||
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" ) |
||||
|
||||
#Include IEEE1394 support |
||||
set(WITH_1394 OFF CACHE BOOL "" ) |
||||
|
||||
#Include NVidia Cuda Runtime support |
||||
set(WITH_CUDA OFF CACHE BOOL "" ) |
||||
|
||||
#Include Eigen2/Eigen3 support |
||||
set(WITH_EIGEN2 OFF CACHE BOOL "" ) |
||||
|
||||
#Include FFMPEG support |
||||
set(WITH_FFMPEG OFF CACHE BOOL "" ) |
||||
|
||||
#Include Gstreamer support |
||||
set(WITH_GSTREAMER OFF CACHE BOOL "" ) |
||||
|
||||
#Include GTK support |
||||
set(WITH_GTK OFF CACHE BOOL "" ) |
||||
|
||||
#Include Intel IPP support |
||||
set(WITH_IPP OFF CACHE BOOL "" ) |
||||
|
||||
#Include JPEG2K support |
||||
set(WITH_JASPER ON CACHE BOOL "" ) |
||||
|
||||
#Include JPEG support |
||||
set(WITH_JPEG ON CACHE BOOL "" ) |
||||
|
||||
#Include ILM support via OpenEXR |
||||
set(WITH_OPENEXR OFF CACHE BOOL "" ) |
||||
|
||||
#Include OpenNI support |
||||
set(WITH_OPENNI OFF CACHE BOOL "" ) |
||||
|
||||
#Include PNG support |
||||
set(WITH_PNG ON CACHE BOOL "" ) |
||||
|
||||
#Include Prosilica GigE support |
||||
set(WITH_PVAPI OFF CACHE BOOL "" ) |
||||
|
||||
#Build with Qt Backend support |
||||
set(WITH_QT OFF CACHE BOOL "" ) |
||||
|
||||
#Add OpenGL extension to Qt |
||||
set(WITH_QT_OPENGL OFF CACHE BOOL "" ) |
||||
|
||||
#Include Intel TBB support |
||||
set(WITH_TBB OFF CACHE BOOL "" ) |
||||
|
||||
#Include TIFF support |
||||
set(WITH_TIFF ON CACHE BOOL "" ) |
||||
|
||||
#Include Unicap support (GPL CACHE BOOL "" ) |
||||
set(WITH_UNICAP OFF CACHE BOOL "" ) |
||||
|
||||
#Include Video 4 Linux support |
||||
set(WITH_V4L OFF CACHE BOOL "" ) |
||||
|
||||
#Include Xine support (GPL CACHE BOOL "" ) |
||||
set(WITH_XINE OFF CACHE BOOL "" ) |
||||
|
||||
#Enable SSE instructions |
||||
SET( ENABLE_SSE OFF CACHE BOOL "" ) |
||||
|
||||
#Enable SSE2 instructions |
||||
SET( ENABLE_SSE2 OFF CACHE BOOL "" ) |
||||
|
||||
#Enable SSE3 instructions |
||||
SET( ENABLE_SSE3 OFF CACHE BOOL "" ) |
||||
|
||||
#Enable SSE4.1 instructions |
||||
SET( ENABLE_SSE41 OFF CACHE BOOL "" ) |
||||
|
||||
#Enable SSE4.2 instructions |
||||
SET( ENABLE_SSE42 OFF CACHE BOOL "" ) |
||||
|
||||
#Enable SSSE3 instructions |
||||
SET( ENABLE_SSSE3 OFF CACHE BOOL "" ) |
@ -1,93 +0,0 @@ |
||||
# ---------------------------------------------------------------------------- |
||||
# Root CMake file for Android Opencv Build |
||||
# |
||||
# To build with cmake |
||||
# $ mkdir build |
||||
# $ cd build |
||||
# $ cmake .. |
||||
# $ make |
||||
# Make sure to set the path in the cache for the crystax ndk available |
||||
# here: |
||||
# http://www.crystax.net/android/ndk-r4.php |
||||
# |
||||
# - initial version August 2010 Ethan Rublee ethan.ruble@gmail.com |
||||
# |
||||
# ---------------------------------------------------------------------------- |
||||
|
||||
project(android-opencv) |
||||
|
||||
cmake_minimum_required(VERSION 2.8) |
||||
|
||||
include(AndroidCVModule.cmake REQUIRED) |
||||
|
||||
set(opencv_root "${CMAKE_SOURCE_DIR}/.." CACHE STRING "opencv source root directory") |
||||
if(NOT EXISTS ${opencv_root}) |
||||
message(FATAL_ERROR "Cannot find your opencv root directory!" ) |
||||
endif() |
||||
set(ANDROID true) |
||||
set(WITH_JASPER true) |
||||
set(JASPER_FOUND false) |
||||
set(WITH_PNG true) |
||||
set(WITH_JPEG true) |
||||
|
||||
file(GLOB module_includes "${opencv_root}/modules/[a-zA-Z]*") |
||||
|
||||
list(REMOVE_ITEM module_includes ${opencv_root}/modules/CMakeLists.txt) |
||||
|
||||
set(module_includes ${module_includes} ${CMAKE_SOURCE_DIR}/../3rdparty $(OPENCV_BUILD_ROOT) ${opencv_root} ) |
||||
foreach(mdir ${module_includes}) |
||||
string(REPLACE "${opencv_root}" "$(OPENCV_ROOT)" n_f ${mdir}) |
||||
set(android_module_include_dirs "${android_module_include_dirs} ${n_f}/include") |
||||
endforeach() |
||||
|
||||
set(PossibleArmTargets |
||||
"armeabi armeabi-v7a;armeabi;armeabi-v7a") |
||||
set(ARM_TARGETS "armeabi armeabi-v7a" CACHE STRING "the arm targets for android, recommend armeabi-v7a for floating point support and neon") |
||||
set_property(CACHE ARM_TARGETS PROPERTY STRINGS ${PossibleArmTargets} ) |
||||
|
||||
|
||||
|
||||
configure_file("${CMAKE_SOURCE_DIR}/Android.mk.master.in" "${CMAKE_BINARY_DIR}/Android.mk") |
||||
configure_file("${CMAKE_SOURCE_DIR}/Application.mk.in" "${CMAKE_BINARY_DIR}/Application.mk") |
||||
configure_file("${CMAKE_SOURCE_DIR}/AndroidManifest.xml.in" "${CMAKE_BINARY_DIR}/AndroidManifest.xml") |
||||
configure_file("${CMAKE_SOURCE_DIR}/default.properties.in" "${CMAKE_BINARY_DIR}/default.properties") |
||||
configure_file("${CMAKE_SOURCE_DIR}/cvconfig.h.in" "${CMAKE_BINARY_DIR}/include/cvconfig.h") |
||||
|
||||
add_subdirectory(${opencv_root}/modules "${CMAKE_BINARY_DIR}/modules") |
||||
|
||||
add_subdirectory(${opencv_root}/3rdparty "${CMAKE_BINARY_DIR}/3rdparty") |
||||
|
||||
set(NDK_ROOT "$ENV{HOME}/android-ndk-r4-crystax" CACHE STRING "the crystax ndk directory") |
||||
if(NOT EXISTS ${NDK_ROOT}) |
||||
message(FATAL_ERROR "Cannot find your ndk root directory! please download and |
||||
unzip the android ndk from crystax to the directory specified by NDK_ROOT |
||||
You may download the crystax ndk from: |
||||
http://www.crystax.net/android/ndk-r4.php" ) |
||||
endif() |
||||
set(J "2" CACHE STRING "how many processes for make -j <J>") |
||||
|
||||
ADD_CUSTOM_COMMAND( |
||||
OUTPUT android-opencv |
||||
DEPENDS ${CMAKE_BINARY_DIR}/Android.mk |
||||
COMMAND "${NDK_ROOT}/ndk-build" |
||||
ARGS --directory=${CMAKE_BINARY_DIR} NDK_APPLICATION_MK=Application.mk -j${J} |
||||
) |
||||
|
||||
configure_file("${CMAKE_SOURCE_DIR}/android-opencv.mk.in" "${CMAKE_BINARY_DIR}/android-opencv.mk") |
||||
|
||||
ADD_CUSTOM_TARGET(ndk ALL echo |
||||
DEPENDS android-opencv |
||||
) |
||||
|
||||
message(STATUS "Make will use make -j${J} - for speeding up build - you may change this in the cache") |
||||
message(STATUS "The NDK directory is ${NDK_ROOT}") |
||||
message(STATUS "OpenCV source root is ${opencv_root}") |
||||
message(STATUS "just run make - and grab some coffee or tea ;)") |
||||
message(STATUS "The android opencv libs will be located in ${CMAKE_BINARY_DIR}/obj/local/armeabi*/") |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,39 +1,77 @@ |
||||
Author: Ethan Rublee |
||||
email: ethan.rublee@gmail.com |
||||
######################################################## |
||||
Prerequisites: |
||||
######################################################## |
||||
android-ndk-r5b http://developer.android.com/sdk/ndk/index.html |
||||
the official ndk with standalone toolchain |
||||
android-cmake http://code.google.com/p/android-cmake/ |
||||
this is for the cmake toolchain for android |
||||
mercurial |
||||
sudo apt-get install mercurial |
||||
cmake |
||||
opencv (you should have this if you're reading this file :) |
||||
|
||||
|
||||
To build with cmake: |
||||
######################################################## |
||||
Quick NDK Setup(ubuntu and bash): |
||||
######################################################## |
||||
create some working directory: |
||||
WORK=$HOME/android_dev |
||||
cd $WORK |
||||
|
||||
now get the android-cmake project with mercurial |
||||
hg clone https://android-cmake.googlecode.com/hg/ android-cmake |
||||
|
||||
mkdir build |
||||
cd build |
||||
cmake .. |
||||
make |
||||
there is a convenience script in there for pulling down and setting up the |
||||
android ndk as a standalone toolchain |
||||
cd android-cmake/scripts |
||||
./get_ndk_toolchain_linux.sh $WORK |
||||
|
||||
add the cmake toolchain location to your bashrc or otherwise export it to your env |
||||
echo export ANDTOOLCHAIN=$WORK/android-cmake/toolchain/android.toolchain.cmake >> $HOME/.bashrc |
||||
|
||||
######################################################## |
||||
Quick opencv build(ubuntu and bash): |
||||
######################################################## |
||||
Make sure you either source your bashrc or otherwise export the ANDTOOLCHAIN variable. |
||||
|
||||
Make sure to set the path in the cache for the crystax ndk available |
||||
here: |
||||
http://www.crystax.net/android/ndk-r4.php |
||||
|
||||
|
||||
to include in an android project - |
||||
just include the generated android-opencv.mk in you android ndk project |
||||
(in an Android.mk file) |
||||
with: |
||||
There is a script in the android folder for running cmake with the proper cache |
||||
variables set. It is recommended that you use this to setup a smake build directory. |
||||
cd opencv/android |
||||
sh ./cmake_android.sh |
||||
|
||||
include android-opencv.mk |
||||
You should now see a build directory, that is ready to be made. |
||||
cd build |
||||
make -j8 |
||||
|
||||
this defines OPENCV_INCLUDES and OPENCV_LIBS - which you should add to your |
||||
makefiles like: |
||||
That will build most of the opencv modules, except for those that don't make sense |
||||
on android - gpu, etc.. |
||||
|
||||
To install to the toolchain: |
||||
make install |
||||
######################################################## |
||||
Using opencv in you're cmake own projects. |
||||
######################################################## |
||||
Use the cmake find script for opencv: |
||||
find_package(OpenCV REQUIRED) |
||||
|
||||
Then when you run cmake, use: |
||||
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDTOOLCHAIN .. |
||||
|
||||
#define OPENCV_INCLUDES and OPENCV_LIBS |
||||
include $(PATH_TO_OPENCV_ANDROID_BUILD)/android-opencv.mk |
||||
And direct your cmake cache for OpenCV_Dir to the path that you build opencv for android. |
||||
something like : opencv/android/build |
||||
|
||||
LOCAL_LDLIBS += $(OPENCV_LIBS) |
||||
|
||||
LOCAL_C_INCLUDES += $(OPENCV_INCLUDES) |
||||
To avoid setting the cmake cache for OpenCV_Dir, you can just "install" opencv to your |
||||
android toolchain. Run the following from the opencv/android/build path: |
||||
make install |
||||
|
||||
for now, you also need to cd to android-jni and run make |
||||
this will create the android shared library with some useful functionality |
||||
that may be reused in android projects. |
||||
######################################################## |
||||
android targets |
||||
######################################################## |
||||
You may wish to build android for multiple hardware targets. |
||||
|
||||
Just change the cmake cache ARM_TARGETS to either: |
||||
"armeabi" "armeab-v7a" "armeab-v7a with NEON" |
||||
|
||||
You may install each of these to the toolchain, and they should be linked against |
||||
properly via way of the android-cmake toolchain. |
||||
|
@ -1,90 +0,0 @@ |
||||
# ---------------------------------------------------------------------------- |
||||
# Root CMake file for Android Opencv Build |
||||
# |
||||
# To build with cmake |
||||
# $ mkdir build |
||||
# $ cd build |
||||
# $ cmake .. |
||||
# $ make |
||||
# Make sure to set the path in the cache for the crystax ndk available |
||||
# here: |
||||
# http://www.crystax.net/android/ndk-r4.php |
||||
# |
||||
# - initial version August 2010 Ethan Rublee ethan.rublee@gmail.com |
||||
# |
||||
# ---------------------------------------------------------------------------- |
||||
|
||||
project(android-opencv-shared) |
||||
|
||||
cmake_minimum_required(VERSION 2.8) |
||||
|
||||
set(opencv_root "$ENV{HOME}/opencv" CACHE PATH "opencv source root directory") |
||||
if(NOT EXISTS ${opencv_root}) |
||||
message(FATAL_ERROR "Cannot find your opencv root directory!" ) |
||||
endif() |
||||
|
||||
set(android_opencv_mk "${opencv_root}/android/build/android-opencv.mk" cache FILE "the generated android-opencv.mk file") |
||||
if(NOT EXISTS ${android_opencv_mk}) |
||||
message(FATAL_ERROR "please locate the cmake generated android-opencv.mk file, usually in the android/build directory...") |
||||
endif() |
||||
|
||||
set(ANDROID true) |
||||
|
||||
file(GLOB module_includes "${opencv_root}/modules/[a-zA-Z]*") |
||||
|
||||
list(REMOVE_ITEM module_includes ${opencv_root}/modules/CMakeLists.txt) |
||||
|
||||
set(module_includes ${module_includes} ${CMAKE_SOURCE_DIR}/../3rdparty $(OPENCV_BUILD_ROOT) ) |
||||
foreach(mdir ${module_includes}) |
||||
string(REPLACE "${opencv_root}" "$(OPENCV_ROOT)" n_f ${mdir}) |
||||
set(android_module_include_dirs "${android_module_include_dirs} ${n_f}/include") |
||||
endforeach() |
||||
|
||||
configure_file("${CMAKE_SOURCE_DIR}/Android.mk.master.in" "${CMAKE_BINARY_DIR}/Android.mk") |
||||
configure_file("${CMAKE_SOURCE_DIR}/Application.mk.in" "${CMAKE_BINARY_DIR}/Application.mk") |
||||
configure_file("${CMAKE_SOURCE_DIR}/AndroidManifest.xml.in" "${CMAKE_BINARY_DIR}/AndroidManifest.xml") |
||||
configure_file("${CMAKE_SOURCE_DIR}/default.properties.in" "${CMAKE_BINARY_DIR}/default.properties") |
||||
|
||||
set(NDK_ROOT "$ENV{HOME}/android-ndk-r4-crystax" CACHE STRING "the crystax ndk directory") |
||||
if(NOT EXISTS ${NDK_ROOT}) |
||||
message(FATAL_ERROR "Cannot find your ndk root directory! please download and |
||||
unzip the android ndk from crystax to the directory specified by NDK_ROOT |
||||
You may download the crystax ndk from: |
||||
http://www.crystax.net/android/ndk-r4.php" ) |
||||
endif() |
||||
|
||||
set(J "2" CACHE STRING "how many processes for make -j <J>") |
||||
|
||||
ADD_CUSTOM_COMMAND( |
||||
OUTPUT android-ndk |
||||
DEPENDS ${CMAKE_BINARY_DIR}/Android.mk |
||||
COMMAND "${NDK_ROOT}/ndk-build" |
||||
ARGS --directory=${CMAKE_BINARY_DIR} NDK_APPLICATION_MK=Application.mk -j${J} |
||||
) |
||||
|
||||
ADD_CUSTOM_COMMAND( |
||||
OUTPUT android-swig |
||||
DEPENDS ${SWIG_MAIN} |
||||
COMMAND "swig" |
||||
ARGS --directory=${CMAKE_BINARY_DIR} NDK_APPLICATION_MK=Application.mk -j${J} |
||||
) |
||||
|
||||
|
||||
configure_file("${CMAKE_SOURCE_DIR}/android-opencv.mk.in" "${CMAKE_BINARY_DIR}/android-opencv.mk") |
||||
|
||||
ADD_CUSTOM_TARGET(ndk ALL echo |
||||
DEPENDS android-ndk |
||||
) |
||||
|
||||
message(STATUS "Make will use make -j${J} - for speeding up build - you may change this in the cache") |
||||
message(STATUS "The NDK directory is ${NDK_ROOT}") |
||||
message(STATUS "OpenCV source root is ${opencv_root}") |
||||
message(STATUS "just run make - and grab some coffee or tea ;)") |
||||
message(STATUS "The android opencv libs will be located in ${CMAKE_BINARY_DIR}/obj/local/armeabi*/") |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,24 +0,0 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" |
||||
package="com.opencv" android:versionCode="1" |
||||
android:versionName="0.1"> |
||||
|
||||
<application android:debuggable="true"> |
||||
<!-- The activity tag here is currently not used. The main project TicTacToeMain |
||||
must currently redefine the activities to be used from the libraries. |
||||
However later the tools will pick up the activities from here and merge them |
||||
automatically, so it's best to define your activities here like for any |
||||
regular Android project. |
||||
--> |
||||
<activity android:name="com.opencv.OpenCV" /> |
||||
<activity android:name="com.opencv.calibration.ChessBoardChooser"/> |
||||
<activity android:name="com.opencv.calibration.CameraConfig"/> |
||||
<activity android:name="com.opencv.calibration.CalibrationViewer"/> |
||||
<service android:name="com.opencv.calibration.services.CalibrationService"/> |
||||
</application> |
||||
<!-- set the opengl version |
||||
<uses-feature android:glEsVersion="0x00020000" />--> |
||||
<uses-sdk android:minSdkVersion="7" /> |
||||
<uses-permission android:name="android.permission.CAMERA"></uses-permission> |
||||
|
||||
</manifest> |
@ -1,78 +0,0 @@ |
||||
# 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 |
||||
|
||||
ifndef ARM_TARGETS |
||||
ARM_TARGETS="armeabi armeabi-v7a"
|
||||
endif |
||||
|
||||
ANDROID_NDK_BASE = $(ANDROID_NDK_ROOT)
|
||||
|
||||
$(info OPENCV_CONFIG = $(OPENCV_CONFIG)) |
||||
|
||||
# The name of the native library
|
||||
LIBNAME = libandroid-opencv.so
|
||||
|
||||
# Find all the C++ sources in the native folder
|
||||
SOURCES = $(wildcard jni/*.cpp)
|
||||
HEADERS = $(wildcard jni/*.h)
|
||||
SWIG_IS = $(wildcard jni/*.i)
|
||||
|
||||
ANDROID_MKS = $(wildcard jni/*.mk)
|
||||
|
||||
SWIG_MAIN = jni/android-cv.i
|
||||
|
||||
SWIG_JAVA_DIR = src/com/opencv/jni
|
||||
SWIG_JAVA_OUT = $(wildcard $(SWIG_JAVA_DIR)/*.java)
|
||||
|
||||
SWIG_C_DIR = jni/gen
|
||||
SWIG_C_OUT = $(SWIG_C_DIR)/android_cv_wrap.cpp
|
||||
|
||||
# The real native library stripped of symbols
|
||||
LIB = libs/armeabi-v7a/$(LIBNAME) libs/armeabi/$(LIBNAME)
|
||||
|
||||
|
||||
all: $(LIB) nogdb |
||||
|
||||
|
||||
#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_CONFIG=$(OPENCV_CONFIG) \
|
||||
PROJECT_PATH=$(PROJECT_PATH) ARM_TARGETS=$(ARM_TARGETS) V=$(V) $(NDK_FLAGS)
|
||||
|
||||
|
||||
#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++ -package "com.opencv.jni" \
|
||||
-outdir $(SWIG_JAVA_DIR) \
|
||||
-o $(SWIG_C_OUT) $(SWIG_MAIN)
|
||||
|
||||
|
||||
#clean targets
|
||||
.PHONY: clean clean-swig cleanall nogdb |
||||
|
||||
nogdb: $(LIB) |
||||
rm -f libs/armeabi*/gdb*
|
||||
|
||||
#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 OPENCV_CONFIG=$(OPENCV_CONFIG) \
|
||||
PROJECT_PATH=$(PROJECT_PATH) clean ARM_TARGETS=$(ARM_TARGETS) V=$(V) $(NDK_FLAGS)
|
||||
|
@ -1,41 +0,0 @@ |
||||
android-jni |
||||
|
||||
this is an example of an android library project that has some reusable |
||||
code that exposes part of OpenCV to android. In particular this provides a |
||||
native camera interface for loading live video frames from the android camera |
||||
into native opencv functions(as cv::Mat's) |
||||
|
||||
pre-reqs: |
||||
* build the opencv/android libraries - up one directory |
||||
* you need swig in you path for android-jni |
||||
on ubuntu - sudo apt-get install swig |
||||
others: http://www.swig.org/ |
||||
|
||||
to build: |
||||
|
||||
make |
||||
|
||||
that should work... If it doesn't make sure to edit the generated local.env.mk |
||||
to reflect your machine's setup |
||||
|
||||
see the sample for how to use this in your own projects |
||||
|
||||
If you only support armeabi-v7a or armeabi your final apks will be much smaller. |
||||
|
||||
To build the class files, either start a new Android project from existing sources |
||||
in eclipse |
||||
or from the commmand line: |
||||
sh project_create.sh |
||||
ant debug |
||||
|
||||
This should be linked to in your android projects, if you would like to reuse the |
||||
code. See Calibration or CVCamera in the opencv/android/apps directory |
||||
|
||||
With cdt installed in eclipse, you may also "convert to C++ project" once you have |
||||
opened this as an android project. Select makefile project->toolchain other to do this. |
||||
|
||||
Eclipse tip of the day: |
||||
You may get build warnings when linking to the project, complainging about duplicate something |
||||
or other in you .svn directories. Right click project->settings->java build path->source->excude paths->add |
||||
.svn/ and **/.svn/ should do it ;) |
||||
|
@ -1,31 +0,0 @@ |
||||
# 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) -llog -lGLESv2
|
||||
|
||||
LOCAL_C_INCLUDES += $(OPENCV_INCLUDES)
|
||||
|
||||
LOCAL_MODULE := android-opencv
|
||||
|
||||
LOCAL_SRC_FILES := gen/android_cv_wrap.cpp image_pool.cpp \
|
||||
gl_code.cpp Calibration.cpp
|
||||
|
||||
|
||||
#ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
|
||||
# LOCAL_CFLAGS := -DHAVE_NEON=1
|
||||
# LOCAL_SRC_FILES += yuv2rgb_neon.c.neon
|
||||
#else
|
||||
LOCAL_SRC_FILES += yuv420sp2rgb.c
|
||||
#endif
|
||||
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY) |
||||
|
@ -1,2 +0,0 @@ |
||||
APP_ABI := $(ARM_TARGETS)
|
||||
APP_MODULES := android-opencv
|
@ -1,59 +0,0 @@ |
||||
%typemap(javaimports) Mat " |
||||
/** Wrapper for the OpenCV Mat object. Good for passing around as a pointer to a Mat. |
||||
*/" |
||||
|
||||
%typemap(javaimports) Size " |
||||
/** Wrapper for the OpenCV Size object. Good for setting dimensions of cv::Mat... |
||||
*/" |
||||
|
||||
class Mat { |
||||
public: |
||||
%immutable; |
||||
int rows; |
||||
int cols; |
||||
}; |
||||
|
||||
class Size{ |
||||
public: |
||||
Size(int width,int height); |
||||
int width; |
||||
int height; |
||||
|
||||
}; |
||||
|
||||
template<class _Tp> class Ptr |
||||
{ |
||||
public: |
||||
//! empty constructor |
||||
Ptr(); |
||||
//! take ownership of the pointer. The associated reference counter is allocated and set to 1 |
||||
Ptr(_Tp* _obj); |
||||
//! calls release() |
||||
~Ptr(); |
||||
//! copy constructor. Copies the members and calls addref() |
||||
Ptr(const Ptr& ptr); |
||||
//! copy operator. Calls ptr.addref() and release() before copying the members |
||||
// Ptr& operator = (const Ptr& ptr); |
||||
//! increments the reference counter |
||||
void addref(); |
||||
//! decrements the reference counter. If it reaches 0, delete_obj() is called |
||||
void release(); |
||||
//! deletes the object. Override if needed |
||||
void delete_obj(); |
||||
//! returns true iff obj==NULL |
||||
bool empty() const; |
||||
|
||||
|
||||
//! helper operators making "Ptr<T> ptr" use very similar to "T* ptr". |
||||
_Tp* operator -> (); |
||||
// const _Tp* operator -> () const; |
||||
|
||||
// operator _Tp* (); |
||||
// operator const _Tp*() const; |
||||
|
||||
protected: |
||||
_Tp* obj; //< the object pointer. |
||||
int* refcount; //< the associated reference counter |
||||
}; |
||||
|
||||
%template(PtrMat) Ptr<Mat>; |
@ -1,80 +0,0 @@ |
||||
#include <string.h> |
||||
#include <jni.h> |
||||
|
||||
#include <yuv420sp2rgb.h> |
||||
|
||||
/*
|
||||
YUV 4:2:0 image with a plane of 8 bit Y samples followed by an interleaved |
||||
U/V plane containing 8 bit 2x2 subsampled chroma samples. |
||||
except the interleave order of U and V is reversed. |
||||
|
||||
H V |
||||
Y Sample Period 1 1 |
||||
U (Cb) Sample Period 2 2 |
||||
V (Cr) Sample Period 2 2 |
||||
*/ |
||||
|
||||
/*
|
||||
size of a char: |
||||
find . -name limits.h -exec grep CHAR_BIT {} \; |
||||
*/ |
||||
|
||||
#ifndef max |
||||
#define max(a,b) ({typeof(a) _a = (a); typeof(b) _b = (b); _a > _b ? _a : _b; }) |
||||
#define min(a,b) ({typeof(a) _a = (a); typeof(b) _b = (b); _a < _b ? _a : _b; }) |
||||
#endif |
||||
|
||||
const int bytes_per_pixel = 2; |
||||
void color_convert_common(const unsigned char *pY, const unsigned char *pUV, int width, int height, unsigned char *buffer, int grey) |
||||
{ |
||||
|
||||
int i, j; |
||||
int nR, nG, nB; |
||||
int nY, nU, nV; |
||||
unsigned char *out = buffer; |
||||
int offset = 0; |
||||
|
||||
if (grey) |
||||
{ |
||||
memcpy(out,pY,width*height*sizeof(unsigned char)); |
||||
} |
||||
else |
||||
// YUV 4:2:0
|
||||
for (i = 0; i < height; i++) |
||||
{ |
||||
for (j = 0; j < width; j++) |
||||
{ |
||||
nY = *(pY + i * width + j); |
||||
nV = *(pUV + (i / 2) * width + bytes_per_pixel * (j / 2)); |
||||
nU = *(pUV + (i / 2) * width + bytes_per_pixel * (j / 2) + 1); |
||||
|
||||
// Yuv Convert
|
||||
nY -= 16; |
||||
nU -= 128; |
||||
nV -= 128; |
||||
|
||||
if (nY < 0) |
||||
nY = 0; |
||||
|
||||
nB = (int)(1192 * nY + 2066 * nU); |
||||
nG = (int)(1192 * nY - 833 * nV - 400 * nU); |
||||
nR = (int)(1192 * nY + 1634 * nV); |
||||
|
||||
nR = min(262143, max(0, nR)); |
||||
nG = min(262143, max(0, nG)); |
||||
nB = min(262143, max(0, nB)); |
||||
|
||||
nR >>= 10; |
||||
nR &= 0xff; |
||||
nG >>= 10; |
||||
nG &= 0xff; |
||||
nB >>= 10; |
||||
nB &= 0xff; |
||||
|
||||
out[offset++] = (unsigned char)nR; |
||||
out[offset++] = (unsigned char)nG; |
||||
out[offset++] = (unsigned char)nB; |
||||
} |
||||
} |
||||
|
||||
} |
@ -1,10 +0,0 @@ |
||||
#location of android-opencv.mk file that was generated by the cmake build
|
||||
#of opencv for android
|
||||
OPENCV_CONFIG=../build/android-opencv.mk
|
||||
|
||||
#the root directory of the crystax r4 ndk - ndk-build should be in this dir
|
||||
#you can download the ndk from http://www.crystax.net/android/ndk-r4.php
|
||||
ANDROID_NDK_ROOT=$(HOME)/android-ndk-r4-crystax
|
||||
|
||||
#define only armeabi-v7a to make the final apk smaller or armeabi
|
||||
ARM_TARGETS="armeabi armeabi-v7a"
|
@ -1,38 +0,0 @@ |
||||
#you may override this if you move the build
|
||||
#just define it before including this or on the command line - or with
|
||||
#an environment variable
|
||||
#this points to the root of the opencv trunk - where the original opencv
|
||||
#sources are - with modules 3rparty ...
|
||||
ifndef OPENCV_ROOT |
||||
OPENCV_ROOT := ${opencv_root}
|
||||
endif |
||||
|
||||
#you may override this same as above
|
||||
#this points to the actually directory that you built opencv for android from
|
||||
#maybe in under opencv/android/build
|
||||
ifndef OPENCV_BUILD_ROOT |
||||
OPENCV_BUILD_ROOT := ${CMAKE_BINARY_DIR}
|
||||
endif |
||||
|
||||
OPENCV_INCLUDES := ${android_module_include_dirs}
|
||||
|
||||
ANDROID_OPENCV_INCLUDES := $(OPENCV_ROOT)/android/android-jni/jni
|
||||
|
||||
ARMOBJS := local/armeabi
|
||||
ARMOBJS_V7A := local/armeabi-v7a
|
||||
|
||||
OPENCV_LIB_DIRS := -L$(OPENCV_BUILD_ROOT)/obj/$(ARMOBJS_V7A) \
|
||||
-L$(OPENCV_BUILD_ROOT)/obj/$(ARMOBJS) -L$(OPENCV_BUILD_ROOT)/bin/ndk/$(ARMOBJS) \
|
||||
-L$(OPENCV_BUILD_ROOT)/bin/ndk/$(ARMOBJS_V7A)
|
||||
|
||||
ANDROID_OPENCV_LIB_DIRS := -L$(OPENCV_ROOT)/android/android-jni/libs/armeabi-v7a \
|
||||
-L$(OPENCV_ROOT)/android/android-jni/libs/armeabi
|
||||
|
||||
#order of linking very important ---- may have stuff out of order here, but
|
||||
#important that modules that are more dependent come first...
|
||||
|
||||
OPENCV_LIBS := $(OPENCV_LIB_DIRS) -lopencv_calib3d -lopencv_features2d -lopencv_objdetect -lopencv_imgproc \
|
||||
-lopencv_video -lopencv_highgui -lopencv_ml -lopencv_legacy -lopencv_core -lopencv_lapack -lopencv_flann \
|
||||
-lzlib -lpng -ljpeg -ljasper
|
||||
ANDROID_OPENCV_LIBS := -landroid-opencv $(ANDROID_OPENCV_LIB_DIRS)
|
||||
|
@ -0,0 +1,29 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" |
||||
package="com.opencv" android:versionCode="1" android:versionName="0.1"> |
||||
|
||||
<application android:debuggable="true"> |
||||
<!-- The activity tag here is currently not used. The main project TicTacToeMain |
||||
must currently redefine the activities to be used from the libraries. However |
||||
later the tools will pick up the activities from here and merge them automatically, |
||||
so it's best to define your activities here like for any regular Android |
||||
project. --> |
||||
<activity android:name="com.opencv.OpenCV"> |
||||
<intent-filter> |
||||
<action android:name="android.intent.action.MAIN" /> |
||||
<category android:name="android.intent.category.LAUNCHER" /> |
||||
</intent-filter> |
||||
</activity> |
||||
<activity android:name="com.opencv.calibration.ChessBoardChooser" /> |
||||
<activity android:name="com.opencv.calibration.CameraConfig" /> |
||||
<activity android:name="com.opencv.calibration.CalibrationViewer" /> |
||||
<service android:name="com.opencv.calibration.services.CalibrationService" /> |
||||
</application> |
||||
<uses-sdk android:minSdkVersion="7" /> |
||||
|
||||
<!-- set the opengl version --> |
||||
<uses-feature android:glEsVersion="0x00020000" /> |
||||
<!-- set the opengl version --> |
||||
<uses-permission android:name="android.permission.CAMERA"></uses-permission> |
||||
|
||||
</manifest> |
@ -0,0 +1,44 @@ |
||||
# ============================================================================ |
||||
# The AndroidOpenCV CMake configuration file |
||||
# |
||||
# ** File generated automatically, do not modify ** |
||||
# |
||||
# Usage from an external project: |
||||
# In your CMakeLists.txt, add these lines: |
||||
# |
||||
# FIND_PACKAGE(AndroidOpenCV REQUIRED ) |
||||
# TARGET_LINK_LIBRARIES(MY_TARGET_NAME ${AndroidOpenCV_LIBS}) |
||||
# |
||||
# This file will define the following variables: |
||||
# - AndroidOpenCV_LIBS : The list of libraries to links against. |
||||
# - AndroidOpenCV_LIB_DIR : The directory where lib files are. |
||||
# Calling LINK_DIRECTORIES with this path |
||||
# is NOT needed. |
||||
# - AndroidOpenCV_INCLUDE_DIRS : The AndroidOpenCV include directories. |
||||
# - AndroidOpenCV_SWIG_DIR : The swig path |
||||
# |
||||
# =========================================================================== |
||||
|
||||
|
||||
# ====================================================== |
||||
# Include directories to add to the user project: |
||||
# ====================================================== |
||||
|
||||
# Provide the include directories to the caller |
||||
SET(AndroidOpenCV_INCLUDE_DIRS @CMAKE_INCLUDE_DIRS_CONFIGCMAKE@) |
||||
INCLUDE_DIRECTORIES(${AndroidOpenCV_INCLUDE_DIRS}) |
||||
|
||||
# ====================================================== |
||||
# Link directories to add to the user project: |
||||
# ====================================================== |
||||
|
||||
# Provide the libs directory anyway, it may be needed in some cases. |
||||
SET(AndroidOpenCV_LIB_DIR @CMAKE_LIB_DIRS_CONFIGCMAKE@) |
||||
LINK_DIRECTORIES(${AndroidOpenCV_LIB_DIR}) |
||||
|
||||
# ====================================================== |
||||
# Libraries to add to the user project: |
||||
# ====================================================== |
||||
SET(AndroidOpenCV_LIBS @CMAKE_LIBS_CONFIGCMAKE@) |
||||
|
||||
SET(AndroidOpenCV_SWIG_DIR @CMAKE_SWIG_DIR_CONFIGCMAKE@) |
@ -0,0 +1,5 @@ |
||||
cmake_minimum_required(VERSION 2.8) |
||||
|
||||
project(android-jni) |
||||
|
||||
add_subdirectory(jni) |
@ -0,0 +1,13 @@ |
||||
========================================= |
||||
CMake Build |
||||
========================================= |
||||
mkdir build |
||||
cd build |
||||
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDTOOLCHAIN .. |
||||
|
||||
========================================= |
||||
Android Build |
||||
========================================= |
||||
sh project_create.sh |
||||
ant compile |
||||
ant install |
@ -0,0 +1,70 @@ |
||||
######################################################### |
||||
# Find opencv and android-opencv |
||||
######################################################### |
||||
|
||||
set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/../build |
||||
CACHE PATH "The path where you built opencv for android") |
||||
find_package(OpenCV REQUIRED) |
||||
|
||||
######################################################### |
||||
#c flags, included, and lib dependencies |
||||
######################################################### |
||||
#notice the "recycling" of CMAKE_C_FLAGS |
||||
#this is necessary to pick up android flags |
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -pedantic -fPIC" ) |
||||
|
||||
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR} |
||||
${CMAKE_CURRENT_SOURCE_DIR}/include) |
||||
|
||||
set( LIBRARY_DEPS ${OpenCV_LIBS} ) |
||||
if(ANDROID) |
||||
set( LIBRARY_DEPS ${LIBRARY_DEPS} log dl GLESv2) |
||||
endif(ANDROID) |
||||
|
||||
######################################################### |
||||
#SWIG STUFF |
||||
######################################################### |
||||
#the java package to place swig generated java files in |
||||
set(MY_PACKAGE com.opencv.jni) |
||||
|
||||
if(NOT ANDROID) |
||||
#non android swig and jni |
||||
#jni is available by default on android |
||||
find_package(JNI REQUIRED) |
||||
include_directories(${JNI_INCLUDE_DIRS}) |
||||
FIND_PACKAGE(SWIG) |
||||
endif() |
||||
|
||||
INCLUDE(${SWIG_USE_FILE}) #on android this is found by the cmake toolchain |
||||
|
||||
if(ANDROID) |
||||
#this will set the output path for the java package |
||||
#and properly create the package declarations in generated java sources |
||||
SET_SWIG_JAVA_PACKAGE( ${MY_PACKAGE} ) #defined in the android toolchain |
||||
endif(ANDROID) |
||||
|
||||
SET_SOURCE_FILES_PROPERTIES(android-cv.i PROPERTIES CPLUSPLUS ON) |
||||
|
||||
SWIG_ADD_MODULE(android-opencv java |
||||
android-cv.i |
||||
Calibration.cpp |
||||
gl_code.cpp |
||||
image_pool.cpp |
||||
yuv420sp2rgb.c |
||||
#yuv420rgb888c.c |
||||
#yuv420rgb888.s |
||||
yuv2rgb16tab.c |
||||
) |
||||
|
||||
target_link_libraries(android-opencv ${LIBRARY_DEPS} ) |
||||
|
||||
################################################################### |
||||
# Setup the configure file for other's to link against. |
||||
################################################################### |
||||
set(CMAKE_INCLUDE_DIRS_CONFIGCMAKE ${CMAKE_CURRENT_SOURCE_DIR}/include) |
||||
set(CMAKE_LIB_DIRS_CONFIGCMAKE ${LIBRARY_OUTPUT_PATH}) |
||||
set(CMAKE_LIBS_CONFIGCMAKE android-opencv) |
||||
set(CMAKE_SWIG_DIR_CONFIGCMAKE ${CMAKE_CURRENT_SOURCE_DIR}) |
||||
configure_file( "${CMAKE_SOURCE_DIR}/AndroidOpenCVConfig.cmake.in" |
||||
"${CMAKE_BINARY_DIR}/AndroidOpenCVConfig.cmake" |
||||
IMMEDIATE @ONLY) |
@ -0,0 +1,156 @@ |
||||
%typemap(javaimports) Mat " |
||||
/** Wrapper for the OpenCV Mat object. Good for passing around as a pointer to a Mat. |
||||
*/" |
||||
|
||||
%typemap(javaimports) Size " |
||||
/** Wrapper for the OpenCV Size object. Good for setting dimensions of cv::Mat... |
||||
*/" |
||||
|
||||
|
||||
class Size{ |
||||
public: |
||||
Size(); |
||||
Size(int width,int height); |
||||
~Size(); |
||||
int width; |
||||
int height; |
||||
}; |
||||
|
||||
#define CV_CN_MAX 512 |
||||
#define CV_CN_SHIFT 3 |
||||
#define CV_DEPTH_MAX (1 << CV_CN_SHIFT) |
||||
|
||||
#define CV_8U 0 |
||||
#define CV_8S 1 |
||||
#define CV_16U 2 |
||||
#define CV_16S 3 |
||||
#define CV_32S 4 |
||||
#define CV_32F 5 |
||||
#define CV_64F 6 |
||||
#define CV_USRTYPE1 7 |
||||
|
||||
#define CV_MAT_DEPTH_MASK (CV_DEPTH_MAX - 1) |
||||
#define CV_MAT_DEPTH(flags) ((flags) & CV_MAT_DEPTH_MASK) |
||||
|
||||
#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT)) |
||||
#define CV_MAKE_TYPE CV_MAKETYPE |
||||
|
||||
#define CV_8UC1 CV_MAKETYPE(CV_8U,1) |
||||
#define CV_8UC2 CV_MAKETYPE(CV_8U,2) |
||||
#define CV_8UC3 CV_MAKETYPE(CV_8U,3) |
||||
#define CV_8UC4 CV_MAKETYPE(CV_8U,4) |
||||
#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n)) |
||||
|
||||
#define CV_8SC1 CV_MAKETYPE(CV_8S,1) |
||||
#define CV_8SC2 CV_MAKETYPE(CV_8S,2) |
||||
#define CV_8SC3 CV_MAKETYPE(CV_8S,3) |
||||
#define CV_8SC4 CV_MAKETYPE(CV_8S,4) |
||||
#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n)) |
||||
|
||||
#define CV_16UC1 CV_MAKETYPE(CV_16U,1) |
||||
#define CV_16UC2 CV_MAKETYPE(CV_16U,2) |
||||
#define CV_16UC3 CV_MAKETYPE(CV_16U,3) |
||||
#define CV_16UC4 CV_MAKETYPE(CV_16U,4) |
||||
#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n)) |
||||
|
||||
#define CV_16SC1 CV_MAKETYPE(CV_16S,1) |
||||
#define CV_16SC2 CV_MAKETYPE(CV_16S,2) |
||||
#define CV_16SC3 CV_MAKETYPE(CV_16S,3) |
||||
#define CV_16SC4 CV_MAKETYPE(CV_16S,4) |
||||
#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n)) |
||||
|
||||
#define CV_32SC1 CV_MAKETYPE(CV_32S,1) |
||||
#define CV_32SC2 CV_MAKETYPE(CV_32S,2) |
||||
#define CV_32SC3 CV_MAKETYPE(CV_32S,3) |
||||
#define CV_32SC4 CV_MAKETYPE(CV_32S,4) |
||||
#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n)) |
||||
|
||||
#define CV_32FC1 CV_MAKETYPE(CV_32F,1) |
||||
#define CV_32FC2 CV_MAKETYPE(CV_32F,2) |
||||
#define CV_32FC3 CV_MAKETYPE(CV_32F,3) |
||||
#define CV_32FC4 CV_MAKETYPE(CV_32F,4) |
||||
#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n)) |
||||
|
||||
#define CV_64FC1 CV_MAKETYPE(CV_64F,1) |
||||
#define CV_64FC2 CV_MAKETYPE(CV_64F,2) |
||||
#define CV_64FC3 CV_MAKETYPE(CV_64F,3) |
||||
#define CV_64FC4 CV_MAKETYPE(CV_64F,4) |
||||
#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n)) |
||||
|
||||
#define CV_AUTO_STEP 0x7fffffff |
||||
#define CV_WHOLE_ARR cvSlice( 0, 0x3fffffff ) |
||||
|
||||
#define CV_MAT_CN_MASK ((CV_CN_MAX - 1) << CV_CN_SHIFT) |
||||
#define CV_MAT_CN(flags) ((((flags) & CV_MAT_CN_MASK) >> CV_CN_SHIFT) + 1) |
||||
#define CV_MAT_TYPE_MASK (CV_DEPTH_MAX*CV_CN_MAX - 1) |
||||
#define CV_MAT_TYPE(flags) ((flags) & CV_MAT_TYPE_MASK) |
||||
#define CV_MAT_CONT_FLAG_SHIFT 14 |
||||
#define CV_MAT_CONT_FLAG (1 << CV_MAT_CONT_FLAG_SHIFT) |
||||
#define CV_IS_MAT_CONT(flags) ((flags) & CV_MAT_CONT_FLAG) |
||||
#define CV_IS_CONT_MAT CV_IS_MAT_CONT |
||||
#define CV_SUBMAT_FLAG_SHIFT 15 |
||||
#define CV_SUBMAT_FLAG (1 << CV_SUBMAT_FLAG_SHIFT) |
||||
#define CV_IS_SUBMAT(flags) ((flags) & CV_MAT_SUBMAT_FLAG) |
||||
|
||||
#define CV_MAGIC_MASK 0xFFFF0000 |
||||
#define CV_MAT_MAGIC_VAL 0x42420000 |
||||
#define CV_TYPE_NAME_MAT "opencv-matrix" |
||||
|
||||
class Mat { |
||||
public: |
||||
Mat(); |
||||
~Mat(); |
||||
void create(Size size, int type); |
||||
int channels() const; |
||||
%immutable; |
||||
int rows; |
||||
int cols; |
||||
}; |
||||
|
||||
template<class _Tp> class Ptr |
||||
{ |
||||
public: |
||||
//! empty constructor |
||||
Ptr(); |
||||
//! take ownership of the pointer. The associated reference counter is allocated and set to 1 |
||||
Ptr(_Tp* _obj); |
||||
//! calls release() |
||||
~Ptr(); |
||||
//! copy constructor. Copies the members and calls addref() |
||||
Ptr(const Ptr& ptr); |
||||
//! copy operator. Calls ptr.addref() and release() before copying the members |
||||
// Ptr& operator = (const Ptr& ptr); |
||||
//! increments the reference counter |
||||
void addref(); |
||||
//! decrements the reference counter. If it reaches 0, delete_obj() is called |
||||
void release(); |
||||
//! deletes the object. Override if needed |
||||
void delete_obj(); |
||||
//! returns true iff obj==NULL |
||||
bool empty() const; |
||||
|
||||
|
||||
//! helper operators making "Ptr<T> ptr" use very similar to "T* ptr". |
||||
_Tp* operator -> (); |
||||
// const _Tp* operator -> () const; |
||||
|
||||
// operator _Tp* (); |
||||
// operator const _Tp*() const; |
||||
|
||||
protected: |
||||
_Tp* obj; //< the object pointer. |
||||
int* refcount; //< the associated reference counter |
||||
}; |
||||
|
||||
|
||||
|
||||
%template(PtrMat) Ptr<Mat>; |
||||
|
||||
void imwrite(const char* image_name, const Mat& image); |
||||
Mat imread(const char* image_name); |
||||
|
||||
%include "buffers.i" |
||||
%apply char* BUFF {const char* buffer} |
||||
%apply char* BUFF {char* buffer} |
||||
void copyMatToBuffer(char* buffer, const Mat& mat); |
||||
void copyBufferToMat(Mat& mat, const char* buffer); |
@ -0,0 +1,19 @@ |
||||
#pragma once |
||||
#include <iostream> |
||||
#include <sstream> |
||||
|
||||
#define LOG_TAG "libopencv" |
||||
#if ANDROID |
||||
#include <android/log.h> |
||||
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) |
||||
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) |
||||
#else |
||||
#include <cstdio> |
||||
#define LOGI(...) printf("info:");printf("%s:",LOG_TAG); fprintf(stdout,__VA_ARGS__);printf("\n"); |
||||
#define LOGE(...) printf("error:");printf("%s:",LOG_TAG); fprintf(stderr,__VA_ARGS__);printf("\n"); |
||||
#endif |
||||
|
||||
#ifndef LOGI_STREAM |
||||
#define LOGI_STREAM(x) {std::stringstream ss; ss << x; LOGI("%s",ss.str().c_str());} |
||||
#endif |
||||
#define LOGE_STREAM(x) {std::stringstream ss; ss << x; LOGE("%s",ss.str().c_str());} |
@ -0,0 +1,147 @@ |
||||
/* YUV-> RGB conversion code.
|
||||
* |
||||
* Copyright (C) 2008-9 Robin Watts (robin@wss.co.uk) for Pinknoise |
||||
* Productions Ltd. |
||||
* |
||||
* Licensed under the GNU GPL. If you need it under another license, contact |
||||
* me and ask. |
||||
* |
||||
* This program is free software ; you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation ; either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY ; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program ; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||
* |
||||
*/ |
||||
|
||||
#ifndef YUV2RGB_H |
||||
|
||||
#define YUV2RGB_H |
||||
|
||||
/* Define these to something appropriate in your build */ |
||||
typedef unsigned int uint32_t; |
||||
typedef signed int int32_t; |
||||
typedef unsigned short uint16_t; |
||||
typedef unsigned char uint8_t; |
||||
|
||||
extern const uint32_t yuv2rgb565_table[]; |
||||
extern const uint32_t yuv2bgr565_table[]; |
||||
|
||||
void yuv420_2_rgb565(uint8_t *dst_ptr, |
||||
const uint8_t *y_ptr, |
||||
const uint8_t *u_ptr, |
||||
const uint8_t *v_ptr, |
||||
int32_t width, |
||||
int32_t height, |
||||
int32_t y_span, |
||||
int32_t uv_span, |
||||
int32_t dst_span, |
||||
const uint32_t *tables, |
||||
int32_t dither); |
||||
|
||||
void yuv422_2_rgb565(uint8_t *dst_ptr, |
||||
const uint8_t *y_ptr, |
||||
const uint8_t *u_ptr, |
||||
const uint8_t *v_ptr, |
||||
int32_t width, |
||||
int32_t height, |
||||
int32_t y_span, |
||||
int32_t uv_span, |
||||
int32_t dst_span, |
||||
const uint32_t *tables, |
||||
int32_t dither); |
||||
|
||||
void yuv444_2_rgb565(uint8_t *dst_ptr, |
||||
const uint8_t *y_ptr, |
||||
const uint8_t *u_ptr, |
||||
const uint8_t *v_ptr, |
||||
int32_t width, |
||||
int32_t height, |
||||
int32_t y_span, |
||||
int32_t uv_span, |
||||
int32_t dst_span, |
||||
const uint32_t *tables, |
||||
int32_t dither); |
||||
|
||||
void yuv420_2_rgb888(uint8_t *dst_ptr, |
||||
const uint8_t *y_ptr, |
||||
const uint8_t *u_ptr, |
||||
const uint8_t *v_ptr, |
||||
int32_t width, |
||||
int32_t height, |
||||
int32_t y_span, |
||||
int32_t uv_span, |
||||
int32_t dst_span, |
||||
const uint32_t *tables, |
||||
int32_t dither); |
||||
|
||||
void yuv422_2_rgb888(uint8_t *dst_ptr, |
||||
const uint8_t *y_ptr, |
||||
const uint8_t *u_ptr, |
||||
const uint8_t *v_ptr, |
||||
int32_t width, |
||||
int32_t height, |
||||
int32_t y_span, |
||||
int32_t uv_span, |
||||
int32_t dst_span, |
||||
const uint32_t *tables, |
||||
int32_t dither); |
||||
|
||||
void yuv444_2_rgb888(uint8_t *dst_ptr, |
||||
const uint8_t *y_ptr, |
||||
const uint8_t *u_ptr, |
||||
const uint8_t *v_ptr, |
||||
int32_t width, |
||||
int32_t height, |
||||
int32_t y_span, |
||||
int32_t uv_span, |
||||
int32_t dst_span, |
||||
const uint32_t *tables, |
||||
int32_t dither); |
||||
|
||||
void yuv420_2_rgb8888(uint8_t *dst_ptr, |
||||
const uint8_t *y_ptr, |
||||
const uint8_t *u_ptr, |
||||
const uint8_t *v_ptr, |
||||
int32_t width, |
||||
int32_t height, |
||||
int32_t y_span, |
||||
int32_t uv_span, |
||||
int32_t dst_span, |
||||
const uint32_t *tables, |
||||
int32_t dither); |
||||
|
||||
void yuv422_2_rgb8888(uint8_t *dst_ptr, |
||||
const uint8_t *y_ptr, |
||||
const uint8_t *u_ptr, |
||||
const uint8_t *v_ptr, |
||||
int32_t width, |
||||
int32_t height, |
||||
int32_t y_span, |
||||
int32_t uv_span, |
||||
int32_t dst_span, |
||||
const uint32_t *tables, |
||||
int32_t dither); |
||||
|
||||
void yuv444_2_rgb8888(uint8_t *dst_ptr, |
||||
const uint8_t *y_ptr, |
||||
const uint8_t *u_ptr, |
||||
const uint8_t *v_ptr, |
||||
int32_t width, |
||||
int32_t height, |
||||
int32_t y_span, |
||||
int32_t uv_span, |
||||
int32_t dst_span, |
||||
const uint32_t *tables, |
||||
int32_t dither); |
||||
|
||||
|
||||
#endif /* YUV2RGB_H */ |
@ -1,4 +1,3 @@ |
||||
//yuv420sp2rgb.h
|
||||
#ifndef YUV420SP2RGB_H |
||||
#define YUV420SP2RGB_H |
||||
|
@ -0,0 +1,802 @@ |
||||
/* YUV-> RGB conversion code.
|
||||
* |
||||
* Copyright (C) 2008-9 Robin Watts (robin@wss.co.uk) for Pinknoise |
||||
* Productions Ltd. |
||||
* |
||||
* Licensed under the GNU GPL. If you need it under another license, contact |
||||
* me and ask. |
||||
* |
||||
* This program is free software ; you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation ; either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY ; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program ; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||
*/ |
||||
|
||||
/* For BREW or Symbian you might need to make this static const rather than
|
||||
* just const, and introduce a function to get the address. */ |
||||
|
||||
#include "yuv2rgb.h" |
||||
|
||||
const uint32_t yuv2rgb565_table[256*3] = |
||||
{ |
||||
/* y_table */ |
||||
0x7FFFFFEDU, |
||||
0x7FFFFFEFU, |
||||
0x7FFFFFF0U, |
||||
0x7FFFFFF1U, |
||||
0x7FFFFFF2U, |
||||
0x7FFFFFF3U, |
||||
0x7FFFFFF4U, |
||||
0x7FFFFFF6U, |
||||
0x7FFFFFF7U, |
||||
0x7FFFFFF8U, |
||||
0x7FFFFFF9U, |
||||
0x7FFFFFFAU, |
||||
0x7FFFFFFBU, |
||||
0x7FFFFFFDU, |
||||
0x7FFFFFFEU, |
||||
0x7FFFFFFFU, |
||||
0x80000000U, |
||||
0x80400801U, |
||||
0x80A01002U, |
||||
0x80E01803U, |
||||
0x81202805U, |
||||
0x81803006U, |
||||
0x81C03807U, |
||||
0x82004008U, |
||||
0x82604809U, |
||||
0x82A0500AU, |
||||
0x82E0600CU, |
||||
0x8340680DU, |
||||
0x8380700EU, |
||||
0x83C0780FU, |
||||
0x84208010U, |
||||
0x84608811U, |
||||
0x84A09813U, |
||||
0x8500A014U, |
||||
0x8540A815U, |
||||
0x8580B016U, |
||||
0x85E0B817U, |
||||
0x8620C018U, |
||||
0x8660D01AU, |
||||
0x86C0D81BU, |
||||
0x8700E01CU, |
||||
0x8740E81DU, |
||||
0x87A0F01EU, |
||||
0x87E0F81FU, |
||||
0x88210821U, |
||||
0x88811022U, |
||||
0x88C11823U, |
||||
0x89012024U, |
||||
0x89412825U, |
||||
0x89A13026U, |
||||
0x89E14028U, |
||||
0x8A214829U, |
||||
0x8A81502AU, |
||||
0x8AC1582BU, |
||||
0x8B01602CU, |
||||
0x8B61682DU, |
||||
0x8BA1782FU, |
||||
0x8BE18030U, |
||||
0x8C418831U, |
||||
0x8C819032U, |
||||
0x8CC19833U, |
||||
0x8D21A034U, |
||||
0x8D61B036U, |
||||
0x8DA1B837U, |
||||
0x8E01C038U, |
||||
0x8E41C839U, |
||||
0x8E81D03AU, |
||||
0x8EE1D83BU, |
||||
0x8F21E83DU, |
||||
0x8F61F03EU, |
||||
0x8FC1F83FU, |
||||
0x90020040U, |
||||
0x90420841U, |
||||
0x90A21042U, |
||||
0x90E22044U, |
||||
0x91222845U, |
||||
0x91823046U, |
||||
0x91C23847U, |
||||
0x92024048U, |
||||
0x92624849U, |
||||
0x92A2504AU, |
||||
0x92E2604CU, |
||||
0x9342684DU, |
||||
0x9382704EU, |
||||
0x93C2784FU, |
||||
0x94228050U, |
||||
0x94628851U, |
||||
0x94A29853U, |
||||
0x9502A054U, |
||||
0x9542A855U, |
||||
0x9582B056U, |
||||
0x95E2B857U, |
||||
0x9622C058U, |
||||
0x9662D05AU, |
||||
0x96C2D85BU, |
||||
0x9702E05CU, |
||||
0x9742E85DU, |
||||
0x97A2F05EU, |
||||
0x97E2F85FU, |
||||
0x98230861U, |
||||
0x98831062U, |
||||
0x98C31863U, |
||||
0x99032064U, |
||||
0x99632865U, |
||||
0x99A33066U, |
||||
0x99E34068U, |
||||
0x9A434869U, |
||||
0x9A83506AU, |
||||
0x9AC3586BU, |
||||
0x9B23606CU, |
||||
0x9B63686DU, |
||||
0x9BA3786FU, |
||||
0x9BE38070U, |
||||
0x9C438871U, |
||||
0x9C839072U, |
||||
0x9CC39873U, |
||||
0x9D23A074U, |
||||
0x9D63B076U, |
||||
0x9DA3B877U, |
||||
0x9E03C078U, |
||||
0x9E43C879U, |
||||
0x9E83D07AU, |
||||
0x9EE3D87BU, |
||||
0x9F23E87DU, |
||||
0x9F63F07EU, |
||||
0x9FC3F87FU, |
||||
0xA0040080U, |
||||
0xA0440881U, |
||||
0xA0A41082U, |
||||
0xA0E42084U, |
||||
0xA1242885U, |
||||
0xA1843086U, |
||||
0xA1C43887U, |
||||
0xA2044088U, |
||||
0xA2644889U, |
||||
0xA2A4588BU, |
||||
0xA2E4608CU, |
||||
0xA344688DU, |
||||
0xA384708EU, |
||||
0xA3C4788FU, |
||||
0xA4248090U, |
||||
0xA4649092U, |
||||
0xA4A49893U, |
||||
0xA504A094U, |
||||
0xA544A895U, |
||||
0xA584B096U, |
||||
0xA5E4B897U, |
||||
0xA624C098U, |
||||
0xA664D09AU, |
||||
0xA6C4D89BU, |
||||
0xA704E09CU, |
||||
0xA744E89DU, |
||||
0xA7A4F09EU, |
||||
0xA7E4F89FU, |
||||
0xA82508A1U, |
||||
0xA88510A2U, |
||||
0xA8C518A3U, |
||||
0xA90520A4U, |
||||
0xA96528A5U, |
||||
0xA9A530A6U, |
||||
0xA9E540A8U, |
||||
0xAA4548A9U, |
||||
0xAA8550AAU, |
||||
0xAAC558ABU, |
||||
0xAB2560ACU, |
||||
0xAB6568ADU, |
||||
0xABA578AFU, |
||||
0xAC0580B0U, |
||||
0xAC4588B1U, |
||||
0xAC8590B2U, |
||||
0xACE598B3U, |
||||
0xAD25A0B4U, |
||||
0xAD65B0B6U, |
||||
0xADA5B8B7U, |
||||
0xAE05C0B8U, |
||||
0xAE45C8B9U, |
||||
0xAE85D0BAU, |
||||
0xAEE5D8BBU, |
||||
0xAF25E8BDU, |
||||
0xAF65F0BEU, |
||||
0xAFC5F8BFU, |
||||
0xB00600C0U, |
||||
0xB04608C1U, |
||||
0xB0A610C2U, |
||||
0xB0E620C4U, |
||||
0xB12628C5U, |
||||
0xB18630C6U, |
||||
0xB1C638C7U, |
||||
0xB20640C8U, |
||||
0xB26648C9U, |
||||
0xB2A658CBU, |
||||
0xB2E660CCU, |
||||
0xB34668CDU, |
||||
0xB38670CEU, |
||||
0xB3C678CFU, |
||||
0xB42680D0U, |
||||
0xB46690D2U, |
||||
0xB4A698D3U, |
||||
0xB506A0D4U, |
||||
0xB546A8D5U, |
||||
0xB586B0D6U, |
||||
0xB5E6B8D7U, |
||||
0xB626C8D9U, |
||||
0xB666D0DAU, |
||||
0xB6C6D8DBU, |
||||
0xB706E0DCU, |
||||
0xB746E8DDU, |
||||
0xB7A6F0DEU, |
||||
0xB7E6F8DFU, |
||||
0xB82708E1U, |
||||
0xB88710E2U, |
||||
0xB8C718E3U, |
||||
0xB90720E4U, |
||||
0xB96728E5U, |
||||
0xB9A730E6U, |
||||
0xB9E740E8U, |
||||
0xBA4748E9U, |
||||
0xBA8750EAU, |
||||
0xBAC758EBU, |
||||
0xBB2760ECU, |
||||
0xBB6768EDU, |
||||
0xBBA778EFU, |
||||
0xBC0780F0U, |
||||
0xBC4788F1U, |
||||
0xBC8790F2U, |
||||
0xBCE798F3U, |
||||
0xBD27A0F4U, |
||||
0xBD67B0F6U, |
||||
0xBDC7B8F7U, |
||||
0xBE07C0F8U, |
||||
0xBE47C8F9U, |
||||
0xBEA7D0FAU, |
||||
0xBEE7D8FBU, |
||||
0xBF27E8FDU, |
||||
0xBF87F0FEU, |
||||
0xBFC7F8FFU, |
||||
0xC0080100U, |
||||
0xC0480901U, |
||||
0xC0A81102U, |
||||
0xC0E82104U, |
||||
0xC0E82104U, |
||||
0xC0E82104U, |
||||
0xC0E82104U, |
||||
0xC0E82104U, |
||||
0xC0E82104U, |
||||
0xC0E82104U, |
||||
0xC0E82104U, |
||||
0xC0E82104U, |
||||
0xC0E82104U, |
||||
0xC0E82104U, |
||||
0xC0E82104U, |
||||
0xC0E82104U, |
||||
0xC0E82104U, |
||||
0xC0E82104U, |
||||
0xC0E82104U, |
||||
0xC0E82104U, |
||||
/* u_table */ |
||||
0x0C400103U, |
||||
0x0C200105U, |
||||
0x0C200107U, |
||||
0x0C000109U, |
||||
0x0BE0010BU, |
||||
0x0BC0010DU, |
||||
0x0BA0010FU, |
||||
0x0BA00111U, |
||||
0x0B800113U, |
||||
0x0B600115U, |
||||
0x0B400117U, |
||||
0x0B400119U, |
||||
0x0B20011BU, |
||||
0x0B00011DU, |
||||
0x0AE0011FU, |
||||
0x0AE00121U, |
||||
0x0AC00123U, |
||||
0x0AA00125U, |
||||
0x0A800127U, |
||||
0x0A600129U, |
||||
0x0A60012BU, |
||||
0x0A40012DU, |
||||
0x0A20012FU, |
||||
0x0A000131U, |
||||
0x0A000132U, |
||||
0x09E00134U, |
||||
0x09C00136U, |
||||
0x09A00138U, |
||||
0x09A0013AU, |
||||
0x0980013CU, |
||||
0x0960013EU, |
||||
0x09400140U, |
||||
0x09400142U, |
||||
0x09200144U, |
||||
0x09000146U, |
||||
0x08E00148U, |
||||
0x08C0014AU, |
||||
0x08C0014CU, |
||||
0x08A0014EU, |
||||
0x08800150U, |
||||
0x08600152U, |
||||
0x08600154U, |
||||
0x08400156U, |
||||
0x08200158U, |
||||
0x0800015AU, |
||||
0x0800015CU, |
||||
0x07E0015EU, |
||||
0x07C00160U, |
||||
0x07A00162U, |
||||
0x07A00164U, |
||||
0x07800166U, |
||||
0x07600168U, |
||||
0x0740016AU, |
||||
0x0720016CU, |
||||
0x0720016EU, |
||||
0x07000170U, |
||||
0x06E00172U, |
||||
0x06C00174U, |
||||
0x06C00176U, |
||||
0x06A00178U, |
||||
0x0680017AU, |
||||
0x0660017CU, |
||||
0x0660017EU, |
||||
0x06400180U, |
||||
0x06200182U, |
||||
0x06000184U, |
||||
0x05E00185U, |
||||
0x05E00187U, |
||||
0x05C00189U, |
||||
0x05A0018BU, |
||||
0x0580018DU, |
||||
0x0580018FU, |
||||
0x05600191U, |
||||
0x05400193U, |
||||
0x05200195U, |
||||
0x05200197U, |
||||
0x05000199U, |
||||
0x04E0019BU, |
||||
0x04C0019DU, |
||||
0x04C0019FU, |
||||
0x04A001A1U, |
||||
0x048001A3U, |
||||
0x046001A5U, |
||||
0x044001A7U, |
||||
0x044001A9U, |
||||
0x042001ABU, |
||||
0x040001ADU, |
||||
0x03E001AFU, |
||||
0x03E001B1U, |
||||
0x03C001B3U, |
||||
0x03A001B5U, |
||||
0x038001B7U, |
||||
0x038001B9U, |
||||
0x036001BBU, |
||||
0x034001BDU, |
||||
0x032001BFU, |
||||
0x032001C1U, |
||||
0x030001C3U, |
||||
0x02E001C5U, |
||||
0x02C001C7U, |
||||
0x02A001C9U, |
||||
0x02A001CBU, |
||||
0x028001CDU, |
||||
0x026001CFU, |
||||
0x024001D1U, |
||||
0x024001D3U, |
||||
0x022001D5U, |
||||
0x020001D7U, |
||||
0x01E001D8U, |
||||
0x01E001DAU, |
||||
0x01C001DCU, |
||||
0x01A001DEU, |
||||
0x018001E0U, |
||||
0x016001E2U, |
||||
0x016001E4U, |
||||
0x014001E6U, |
||||
0x012001E8U, |
||||
0x010001EAU, |
||||
0x010001ECU, |
||||
0x00E001EEU, |
||||
0x00C001F0U, |
||||
0x00A001F2U, |
||||
0x00A001F4U, |
||||
0x008001F6U, |
||||
0x006001F8U, |
||||
0x004001FAU, |
||||
0x004001FCU, |
||||
0x002001FEU, |
||||
0x00000200U, |
||||
0xFFE00202U, |
||||
0xFFC00204U, |
||||
0xFFC00206U, |
||||
0xFFA00208U, |
||||
0xFF80020AU, |
||||
0xFF60020CU, |
||||
0xFF60020EU, |
||||
0xFF400210U, |
||||
0xFF200212U, |
||||
0xFF000214U, |
||||
0xFF000216U, |
||||
0xFEE00218U, |
||||
0xFEC0021AU, |
||||
0xFEA0021CU, |
||||
0xFEA0021EU, |
||||
0xFE800220U, |
||||
0xFE600222U, |
||||
0xFE400224U, |
||||
0xFE200226U, |
||||
0xFE200228U, |
||||
0xFE000229U, |
||||
0xFDE0022BU, |
||||
0xFDC0022DU, |
||||
0xFDC0022FU, |
||||
0xFDA00231U, |
||||
0xFD800233U, |
||||
0xFD600235U, |
||||
0xFD600237U, |
||||
0xFD400239U, |
||||
0xFD20023BU, |
||||
0xFD00023DU, |
||||
0xFCE0023FU, |
||||
0xFCE00241U, |
||||
0xFCC00243U, |
||||
0xFCA00245U, |
||||
0xFC800247U, |
||||
0xFC800249U, |
||||
0xFC60024BU, |
||||
0xFC40024DU, |
||||
0xFC20024FU, |
||||
0xFC200251U, |
||||
0xFC000253U, |
||||
0xFBE00255U, |
||||
0xFBC00257U, |
||||
0xFBC00259U, |
||||
0xFBA0025BU, |
||||
0xFB80025DU, |
||||
0xFB60025FU, |
||||
0xFB400261U, |
||||
0xFB400263U, |
||||
0xFB200265U, |
||||
0xFB000267U, |
||||
0xFAE00269U, |
||||
0xFAE0026BU, |
||||
0xFAC0026DU, |
||||
0xFAA0026FU, |
||||
0xFA800271U, |
||||
0xFA800273U, |
||||
0xFA600275U, |
||||
0xFA400277U, |
||||
0xFA200279U, |
||||
0xFA20027BU, |
||||
0xFA00027CU, |
||||
0xF9E0027EU, |
||||
0xF9C00280U, |
||||
0xF9A00282U, |
||||
0xF9A00284U, |
||||
0xF9800286U, |
||||
0xF9600288U, |
||||
0xF940028AU, |
||||
0xF940028CU, |
||||
0xF920028EU, |
||||
0xF9000290U, |
||||
0xF8E00292U, |
||||
0xF8E00294U, |
||||
0xF8C00296U, |
||||
0xF8A00298U, |
||||
0xF880029AU, |
||||
0xF860029CU, |
||||
0xF860029EU, |
||||
0xF84002A0U, |
||||
0xF82002A2U, |
||||
0xF80002A4U, |
||||
0xF80002A6U, |
||||
0xF7E002A8U, |
||||
0xF7C002AAU, |
||||
0xF7A002ACU, |
||||
0xF7A002AEU, |
||||
0xF78002B0U, |
||||
0xF76002B2U, |
||||
0xF74002B4U, |
||||
0xF74002B6U, |
||||
0xF72002B8U, |
||||
0xF70002BAU, |
||||
0xF6E002BCU, |
||||
0xF6C002BEU, |
||||
0xF6C002C0U, |
||||
0xF6A002C2U, |
||||
0xF68002C4U, |
||||
0xF66002C6U, |
||||
0xF66002C8U, |
||||
0xF64002CAU, |
||||
0xF62002CCU, |
||||
0xF60002CEU, |
||||
0xF60002CFU, |
||||
0xF5E002D1U, |
||||
0xF5C002D3U, |
||||
0xF5A002D5U, |
||||
0xF5A002D7U, |
||||
0xF58002D9U, |
||||
0xF56002DBU, |
||||
0xF54002DDU, |
||||
0xF52002DFU, |
||||
0xF52002E1U, |
||||
0xF50002E3U, |
||||
0xF4E002E5U, |
||||
0xF4C002E7U, |
||||
0xF4C002E9U, |
||||
0xF4A002EBU, |
||||
0xF48002EDU, |
||||
0xF46002EFU, |
||||
0xF46002F1U, |
||||
0xF44002F3U, |
||||
0xF42002F5U, |
||||
0xF40002F7U, |
||||
0xF3E002F9U, |
||||
0xF3E002FBU, |
||||
/* v_table */ |
||||
0x1A09A000U, |
||||
0x19E9A800U, |
||||
0x19A9B800U, |
||||
0x1969C800U, |
||||
0x1949D000U, |
||||
0x1909E000U, |
||||
0x18C9E800U, |
||||
0x18A9F800U, |
||||
0x186A0000U, |
||||
0x182A1000U, |
||||
0x180A2000U, |
||||
0x17CA2800U, |
||||
0x17AA3800U, |
||||
0x176A4000U, |
||||
0x172A5000U, |
||||
0x170A6000U, |
||||
0x16CA6800U, |
||||
0x168A7800U, |
||||
0x166A8000U, |
||||
0x162A9000U, |
||||
0x160AA000U, |
||||
0x15CAA800U, |
||||
0x158AB800U, |
||||
0x156AC000U, |
||||
0x152AD000U, |
||||
0x14EAE000U, |
||||
0x14CAE800U, |
||||
0x148AF800U, |
||||
0x146B0000U, |
||||
0x142B1000U, |
||||
0x13EB2000U, |
||||
0x13CB2800U, |
||||
0x138B3800U, |
||||
0x134B4000U, |
||||
0x132B5000U, |
||||
0x12EB6000U, |
||||
0x12CB6800U, |
||||
0x128B7800U, |
||||
0x124B8000U, |
||||
0x122B9000U, |
||||
0x11EBA000U, |
||||
0x11ABA800U, |
||||
0x118BB800U, |
||||
0x114BC000U, |
||||
0x112BD000U, |
||||
0x10EBE000U, |
||||
0x10ABE800U, |
||||
0x108BF800U, |
||||
0x104C0000U, |
||||
0x100C1000U, |
||||
0x0FEC2000U, |
||||
0x0FAC2800U, |
||||
0x0F8C3800U, |
||||
0x0F4C4000U, |
||||
0x0F0C5000U, |
||||
0x0EEC5800U, |
||||
0x0EAC6800U, |
||||
0x0E6C7800U, |
||||
0x0E4C8000U, |
||||
0x0E0C9000U, |
||||
0x0DEC9800U, |
||||
0x0DACA800U, |
||||
0x0D6CB800U, |
||||
0x0D4CC000U, |
||||
0x0D0CD000U, |
||||
0x0CCCD800U, |
||||
0x0CACE800U, |
||||
0x0C6CF800U, |
||||
0x0C4D0000U, |
||||
0x0C0D1000U, |
||||
0x0BCD1800U, |
||||
0x0BAD2800U, |
||||
0x0B6D3800U, |
||||
0x0B2D4000U, |
||||
0x0B0D5000U, |
||||
0x0ACD5800U, |
||||
0x0AAD6800U, |
||||
0x0A6D7800U, |
||||
0x0A2D8000U, |
||||
0x0A0D9000U, |
||||
0x09CD9800U, |
||||
0x098DA800U, |
||||
0x096DB800U, |
||||
0x092DC000U, |
||||
0x090DD000U, |
||||
0x08CDD800U, |
||||
0x088DE800U, |
||||
0x086DF800U, |
||||
0x082E0000U, |
||||
0x07EE1000U, |
||||
0x07CE1800U, |
||||
0x078E2800U, |
||||
0x076E3800U, |
||||
0x072E4000U, |
||||
0x06EE5000U, |
||||
0x06CE5800U, |
||||
0x068E6800U, |
||||
0x064E7800U, |
||||
0x062E8000U, |
||||
0x05EE9000U, |
||||
0x05CE9800U, |
||||
0x058EA800U, |
||||
0x054EB800U, |
||||
0x052EC000U, |
||||
0x04EED000U, |
||||
0x04AED800U, |
||||
0x048EE800U, |
||||
0x044EF000U, |
||||
0x042F0000U, |
||||
0x03EF1000U, |
||||
0x03AF1800U, |
||||
0x038F2800U, |
||||
0x034F3000U, |
||||
0x030F4000U, |
||||
0x02EF5000U, |
||||
0x02AF5800U, |
||||
0x028F6800U, |
||||
0x024F7000U, |
||||
0x020F8000U, |
||||
0x01EF9000U, |
||||
0x01AF9800U, |
||||
0x016FA800U, |
||||
0x014FB000U, |
||||
0x010FC000U, |
||||
0x00EFD000U, |
||||
0x00AFD800U, |
||||
0x006FE800U, |
||||
0x004FF000U, |
||||
0x00100000U, |
||||
0xFFD01000U, |
||||
0xFFB01800U, |
||||
0xFF702800U, |
||||
0xFF303000U, |
||||
0xFF104000U, |
||||
0xFED05000U, |
||||
0xFEB05800U, |
||||
0xFE706800U, |
||||
0xFE307000U, |
||||
0xFE108000U, |
||||
0xFDD09000U, |
||||
0xFD909800U, |
||||
0xFD70A800U, |
||||
0xFD30B000U, |
||||
0xFD10C000U, |
||||
0xFCD0D000U, |
||||
0xFC90D800U, |
||||
0xFC70E800U, |
||||
0xFC30F000U, |
||||
0xFBF10000U, |
||||
0xFBD11000U, |
||||
0xFB911800U, |
||||
0xFB712800U, |
||||
0xFB313000U, |
||||
0xFAF14000U, |
||||
0xFAD14800U, |
||||
0xFA915800U, |
||||
0xFA516800U, |
||||
0xFA317000U, |
||||
0xF9F18000U, |
||||
0xF9D18800U, |
||||
0xF9919800U, |
||||
0xF951A800U, |
||||
0xF931B000U, |
||||
0xF8F1C000U, |
||||
0xF8B1C800U, |
||||
0xF891D800U, |
||||
0xF851E800U, |
||||
0xF831F000U, |
||||
0xF7F20000U, |
||||
0xF7B20800U, |
||||
0xF7921800U, |
||||
0xF7522800U, |
||||
0xF7123000U, |
||||
0xF6F24000U, |
||||
0xF6B24800U, |
||||
0xF6925800U, |
||||
0xF6526800U, |
||||
0xF6127000U, |
||||
0xF5F28000U, |
||||
0xF5B28800U, |
||||
0xF5729800U, |
||||
0xF552A800U, |
||||
0xF512B000U, |
||||
0xF4F2C000U, |
||||
0xF4B2C800U, |
||||
0xF472D800U, |
||||
0xF452E800U, |
||||
0xF412F000U, |
||||
0xF3D30000U, |
||||
0xF3B30800U, |
||||
0xF3731800U, |
||||
0xF3532800U, |
||||
0xF3133000U, |
||||
0xF2D34000U, |
||||
0xF2B34800U, |
||||
0xF2735800U, |
||||
0xF2336800U, |
||||
0xF2137000U, |
||||
0xF1D38000U, |
||||
0xF1B38800U, |
||||
0xF1739800U, |
||||
0xF133A800U, |
||||
0xF113B000U, |
||||
0xF0D3C000U, |
||||
0xF093C800U, |
||||
0xF073D800U, |
||||
0xF033E000U, |
||||
0xF013F000U, |
||||
0xEFD40000U, |
||||
0xEF940800U, |
||||
0xEF741800U, |
||||
0xEF342000U, |
||||
0xEEF43000U, |
||||
0xEED44000U, |
||||
0xEE944800U, |
||||
0xEE745800U, |
||||
0xEE346000U, |
||||
0xEDF47000U, |
||||
0xEDD48000U, |
||||
0xED948800U, |
||||
0xED549800U, |
||||
0xED34A000U, |
||||
0xECF4B000U, |
||||
0xECD4C000U, |
||||
0xEC94C800U, |
||||
0xEC54D800U, |
||||
0xEC34E000U, |
||||
0xEBF4F000U, |
||||
0xEBB50000U, |
||||
0xEB950800U, |
||||
0xEB551800U, |
||||
0xEB352000U, |
||||
0xEAF53000U, |
||||
0xEAB54000U, |
||||
0xEA954800U, |
||||
0xEA555800U, |
||||
0xEA156000U, |
||||
0xE9F57000U, |
||||
0xE9B58000U, |
||||
0xE9958800U, |
||||
0xE9559800U, |
||||
0xE915A000U, |
||||
0xE8F5B000U, |
||||
0xE8B5C000U, |
||||
0xE875C800U, |
||||
0xE855D800U, |
||||
0xE815E000U, |
||||
0xE7F5F000U, |
||||
0xE7B60000U, |
||||
0xE7760800U, |
||||
0xE7561800U, |
||||
0xE7162000U, |
||||
0xE6D63000U, |
||||
0xE6B64000U, |
||||
0xE6764800U, |
||||
0xE6365800U |
||||
}; |
@ -0,0 +1,379 @@ |
||||
; YUV-> RGB conversion code Copyright (C) 2008 Robin Watts (robin;wss.co.uk).
|
||||
;
|
||||
; Licensed under the GPL. If you need it under another license, contact me
|
||||
; and ask.
|
||||
;
|
||||
; This program is free software ; you can redistribute it and/or modify
|
||||
; it under the terms of the GNU General Public License as published by
|
||||
; the Free Software Foundation ; either version 2 of the License, or
|
||||
; (at your option) any later version.
|
||||
;
|
||||
; This program is distributed in the hope that it will be useful,
|
||||
; but WITHOUT ANY WARRANTY ; without even the implied warranty of
|
||||
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
; GNU General Public License for more details.
|
||||
;
|
||||
; You should have received a copy of the GNU General Public License
|
||||
; along with this program ; if not, write to the Free Software
|
||||
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
;
|
||||
;
|
||||
; The algorithm used here is based heavily on one created by Sophie Wilson
|
||||
; of Acorn/e-14/Broadcomm. Many thanks.
|
||||
;
|
||||
; Additional tweaks (in the fast fixup code) are from Paul Gardiner.
|
||||
;
|
||||
; The old implementation of YUV -> RGB did:
|
||||
;
|
||||
; R = CLAMP((Y-16)*1.164 + 1.596*V)
|
||||
; G = CLAMP((Y-16)*1.164 - 0.391*U - 0.813*V)
|
||||
; B = CLAMP((Y-16)*1.164 + 2.018*U )
|
||||
;
|
||||
; We're going to bend that here as follows:
|
||||
;
|
||||
; R = CLAMP(y + 1.596*V)
|
||||
; G = CLAMP(y - 0.383*U - 0.813*V)
|
||||
; B = CLAMP(y + 1.976*U )
|
||||
;
|
||||
; where y = 0 for Y <= 16,
|
||||
; y = ( Y-16)*1.164, for 16 < Y <= 239,
|
||||
; y = (239-16)*1.164, for 239 < Y
|
||||
;
|
||||
; i.e. We clamp Y to the 16 to 239 range (which it is supposed to be in
|
||||
; anyway). We then pick the B_U factor so that B never exceeds 511. We then
|
||||
; shrink the G_U factor in line with that to avoid a colour shift as much as
|
||||
; possible.
|
||||
;
|
||||
; We're going to use tables to do it faster, but rather than doing it using
|
||||
; 5 tables as as the above suggests, we're going to do it using just 3.
|
||||
;
|
||||
; We do this by working in parallel within a 32 bit word, and using one
|
||||
; table each for Y U and V.
|
||||
;
|
||||
; Source Y values are 0 to 255, so 0.. 260 after scaling
|
||||
; Source U values are -128 to 127, so -49.. 49(G), -253..251(B) after
|
||||
; Source V values are -128 to 127, so -204..203(R), -104..103(G) after
|
||||
;
|
||||
; So total summed values:
|
||||
; -223 <= R <= 481, -173 <= G <= 431, -253 <= B < 511
|
||||
;
|
||||
; We need to pack R G and B into a 32 bit word, and because of Bs range we
|
||||
; need 2 bits above the valid range of B to detect overflow, and another one
|
||||
; to detect the sense of the overflow. We therefore adopt the following
|
||||
; representation:
|
||||
;
|
||||
; osGGGGGgggggosBBBBBbbbosRRRRRrrr
|
||||
;
|
||||
; Each such word breaks down into 3 ranges.
|
||||
;
|
||||
; osGGGGGggggg osBBBBBbbb osRRRRRrrr
|
||||
;
|
||||
; Thus we have 8 bits for each B and R table entry, and 10 bits for G (good
|
||||
; as G is the most noticable one). The s bit for each represents the sign,
|
||||
; and o represents the overflow.
|
||||
;
|
||||
; For R and B we pack the table by taking the 11 bit representation of their
|
||||
; values, and toggling bit 10 in the U and V tables.
|
||||
;
|
||||
; For the green case we calculate 4*G (thus effectively using 10 bits for the
|
||||
; valid range) truncate to 12 bits. We toggle bit 11 in the Y table.
|
||||
|
||||
; Theorarm library
|
||||
; Copyright (C) 2009 Robin Watts for Pinknoise Productions Ltd
|
||||
|
||||
AREA |.text|, CODE, READONLY |
||||
|
||||
EXPORT yuv420_2_rgb888 |
||||
EXPORT yuv420_2_rgb888_PROFILE |
||||
|
||||
; void yuv420_2_rgb565
|
||||
; uint8_t *dst_ptr
|
||||
; uint8_t *y_ptr
|
||||
; uint8_t *u_ptr
|
||||
; uint8_t *v_ptr
|
||||
; int width
|
||||
; int height
|
||||
; int y_span
|
||||
; int uv_span
|
||||
; int dst_span
|
||||
; int *tables
|
||||
; int dither
|
||||
|
||||
CONST_flags |
||||
DCD 0x40080100 |
||||
yuv420_2_rgb888 |
||||
; r0 = dst_ptr
|
||||
; r1 = y_ptr
|
||||
; r2 = u_ptr
|
||||
; r3 = v_ptr
|
||||
; <> = width
|
||||
; <> = height
|
||||
; <> = y_span
|
||||
; <> = uv_span
|
||||
; <> = dst_span
|
||||
; <> = y_table
|
||||
; <> = dither
|
||||
STMFD r13!,{r4-r11,r14} |
||||
|
||||
LDR r8, [r13,#10*4] ; r8 = height
|
||||
LDR r10,[r13,#11*4] ; r10= y_span
|
||||
LDR r9, [r13,#13*4] ; r9 = dst_span
|
||||
LDR r14,[r13,#14*4] ; r14= y_table
|
||||
LDR r5, CONST_flags |
||||
LDR r11,[r13,#9*4] ; r11= width
|
||||
ADD r4, r14, #256*4 |
||||
SUBS r8, r8, #1 |
||||
BLT end |
||||
BEQ trail_row1 |
||||
yloop1 |
||||
SUB r8, r8, r11,LSL #16 ; r8 = height-(width<<16)
|
||||
ADDS r8, r8, #1<<16 ; if (width == 1)
|
||||
BGE trail_pair1 ; just do 1 column
|
||||
xloop1 |
||||
LDRB r11,[r2], #1 ; r11 = u = *u_ptr++
|
||||
LDRB r12,[r3], #1 ; r12 = v = *v_ptr++
|
||||
LDRB r7, [r1, r10] ; r7 = y2 = y_ptr[stride]
|
||||
LDRB r6, [r1], #1 ; r6 = y0 = *y_ptr++
|
||||
ADD r12,r12,#512 |
||||
LDR r11,[r4, r11,LSL #2] ; r11 = u = u_table[u]
|
||||
LDR r12,[r14,r12,LSL #2] ; r12 = v = v_table[v]
|
||||
LDR r7, [r14,r7, LSL #2] ; r7 = y2 = y_table[y2]
|
||||
LDR r6, [r14,r6, LSL #2] ; r6 = y0 = y_table[y0]
|
||||
ADD r11,r11,r12 ; r11 = uv = u+v
|
||||
|
||||
ADD r7, r7, r11 ; r7 = y2 + uv
|
||||
ADD r6, r6, r11 ; r6 = y0 + uv
|
||||
ANDS r12,r7, r5 |
||||
TSTEQ r6, r5 |
||||
BNE fix101 |
||||
return101 |
||||
; Store the bottom one first
|
||||
ADD r12,r0, r9 |
||||
STRB r7,[r12],#1 ; Store R
|
||||
MOV r7, r7, ROR #22 |
||||
STRB r7,[r12],#1 ; Store G
|
||||
MOV r7, r7, ROR #21 |
||||
STRB r7,[r12],#1 ; Store B
|
||||
|
||||
; Then store the top one
|
||||
STRB r6,[r0], #1 ; Store R
|
||||
MOV r6, r6, ROR #22 |
||||
STRB r6,[r0], #1 ; Store G
|
||||
|
||||
LDRB r7, [r1, r10] ; r7 = y3 = y_ptr[stride]
|
||||
LDRB r12,[r1], #1 ; r12= y1 = *y_ptr++
|
||||
MOV r6, r6, ROR #21 |
||||
LDR r7, [r14, r7, LSL #2] ; r7 = y3 = y_table[y2]
|
||||
LDR r12,[r14, r12,LSL #2] ; r12= y1 = y_table[y0]
|
||||
STRB r6,[r0], #1 ; Store B
|
||||
|
||||
ADD r7, r7, r11 ; r7 = y3 + uv
|
||||
ADD r6, r12,r11 ; r6 = y1 + uv
|
||||
ANDS r12,r7, r5 |
||||
TSTEQ r6, r5 |
||||
BNE fix102 |
||||
return102 |
||||
; Store the bottom one first
|
||||
ADD r12,r0, r9 |
||||
STRB r7,[r12],#1 ; Store R
|
||||
MOV r7, r7, ROR #22 |
||||
STRB r7,[r12],#1 ; Store G
|
||||
MOV r7, r7, ROR #21 |
||||
STRB r7,[r12],#1 ; Store B
|
||||
|
||||
; Then store the top one
|
||||
STRB r6,[r0], #1 ; Store R
|
||||
MOV r6, r6, ROR #22 |
||||
STRB r6,[r0], #1 ; Store G
|
||||
MOV r6, r6, ROR #21 |
||||
STRB r6,[r0], #1 ; Store B
|
||||
|
||||
ADDS r8, r8, #2<<16 |
||||
BLT xloop1 |
||||
MOVS r8, r8, LSL #16 ; Clear the top 16 bits of r8
|
||||
MOV r8, r8, LSR #16 ; If the C bit is clear we still have
|
||||
BCC trail_pair1 ; 1 more pixel pair to do
|
||||
end_xloop1 |
||||
LDR r11,[r13,#9*4] ; r11= width
|
||||
LDR r12,[r13,#12*4] ; r12= uv_stride
|
||||
ADD r0, r0, r9, LSL #1 |
||||
SUB r0, r0, r11,LSL #1 |
||||
SUB r0, r0, r11 |
||||
ADD r1, r1, r10,LSL #1 |
||||
SUB r1, r1, r11 |
||||
SUB r2, r2, r11,LSR #1 |
||||
SUB r3, r3, r11,LSR #1 |
||||
ADD r2, r2, r12 |
||||
ADD r3, r3, r12 |
||||
|
||||
SUBS r8, r8, #2 |
||||
BGT yloop1 |
||||
|
||||
LDMLTFD r13!,{r4-r11,pc} |
||||
trail_row1 |
||||
; We have a row of pixels left to do
|
||||
SUB r8, r8, r11,LSL #16 ; r8 = height-(width<<16)
|
||||
ADDS r8, r8, #1<<16 ; if (width == 1)
|
||||
BGE trail_pix1 ; just do 1 pixel
|
||||
xloop12 |
||||
LDRB r11,[r2], #1 ; r11 = u = *u_ptr++
|
||||
LDRB r12,[r3], #1 ; r12 = v = *v_ptr++
|
||||
LDRB r6, [r1], #1 ; r6 = y0 = *y_ptr++
|
||||
LDRB r7, [r1], #1 ; r7 = y1 = *y_ptr++
|
||||
ADD r12,r12,#512 |
||||
LDR r11,[r4, r11,LSL #2] ; r11 = u = u_table[u]
|
||||
LDR r12,[r14,r12,LSL #2] ; r12 = v = v_table[v]
|
||||
LDR r7, [r14,r7, LSL #2] ; r7 = y1 = y_table[y1]
|
||||
LDR r6, [r14,r6, LSL #2] ; r6 = y0 = y_table[y0]
|
||||
ADD r11,r11,r12 ; r11 = uv = u+v
|
||||
|
||||
ADD r6, r6, r11 ; r6 = y0 + uv
|
||||
ADD r7, r7, r11 ; r7 = y1 + uv
|
||||
ANDS r12,r7, r5 |
||||
TSTEQ r6, r5 |
||||
BNE fix104 |
||||
return104 |
||||
; Store the bottom one first
|
||||
STRB r6,[r0], #1 ; Store R
|
||||
MOV r6, r6, ROR #22 |
||||
STRB r6,[r0], #1 ; Store G
|
||||
MOV r6, r6, ROR #21 |
||||
STRB r6,[r0], #1 ; Store B
|
||||
|
||||
; Then store the top one
|
||||
STRB r7,[r0], #1 ; Store R
|
||||
MOV r7, r7, ROR #22 |
||||
STRB r7,[r0], #1 ; Store G
|
||||
MOV r7, r7, ROR #21 |
||||
STRB r7,[r0], #1 ; Store B
|
||||
|
||||
ADDS r8, r8, #2<<16 |
||||
BLT xloop12 |
||||
MOVS r8, r8, LSL #16 ; Clear the top 16 bits of r8
|
||||
MOV r8, r8, LSR #16 ; If the C bit is clear we still have
|
||||
BCC trail_pix1 ; 1 more pixel pair to do
|
||||
end |
||||
LDMFD r13!,{r4-r11,pc} |
||||
trail_pix1 |
||||
; We have a single extra pixel to do
|
||||
LDRB r11,[r2], #1 ; r11 = u = *u_ptr++
|
||||
LDRB r12,[r3], #1 ; r12 = v = *v_ptr++
|
||||
LDRB r6, [r1], #1 ; r6 = y0 = *y_ptr++
|
||||
ADD r12,r12,#512 |
||||
LDR r11,[r4, r11,LSL #2] ; r11 = u = u_table[u]
|
||||
LDR r12,[r14,r12,LSL #2] ; r12 = v = v_table[v]
|
||||
LDR r6, [r14,r6, LSL #2] ; r6 = y0 = y_table[y0]
|
||||
ADD r11,r11,r12 ; r11 = uv = u+v
|
||||
|
||||
ADD r6, r6, r11 ; r6 = y0 + uv
|
||||
ANDS r12,r6, r5 |
||||
BNE fix105 |
||||
return105 |
||||
STRB r6,[r0], #1 ; Store R
|
||||
MOV r6, r6, ROR #22 |
||||
STRB r6,[r0], #1 ; Store G
|
||||
MOV r6, r6, ROR #21 |
||||
STRB r6,[r0], #1 ; Store B
|
||||
|
||||
LDMFD r13!,{r4-r11,pc} |
||||
|
||||
trail_pair1 |
||||
; We have a pair of pixels left to do
|
||||
LDRB r11,[r2] ; r11 = u = *u_ptr++
|
||||
LDRB r12,[r3] ; r12 = v = *v_ptr++
|
||||
LDRB r7, [r1, r10] ; r7 = y2 = y_ptr[stride]
|
||||
LDRB r6, [r1], #1 ; r6 = y0 = *y_ptr++
|
||||
ADD r12,r12,#512 |
||||
LDR r11,[r4, r11,LSL #2] ; r11 = u = u_table[u]
|
||||
LDR r12,[r14,r12,LSL #2] ; r12 = v = v_table[v]
|
||||
LDR r7, [r14,r7, LSL #2] ; r7 = y2 = y_table[y2]
|
||||
LDR r6, [r14,r6, LSL #2] ; r6 = y0 = y_table[y0]
|
||||
ADD r11,r11,r12 ; r11 = uv = u+v
|
||||
|
||||
ADD r7, r7, r11 ; r7 = y2 + uv
|
||||
ADD r6, r6, r11 ; r6 = y0 + uv
|
||||
ANDS r12,r7, r5 |
||||
TSTEQ r6, r5 |
||||
BNE fix103 |
||||
return103 |
||||
; Store the bottom one first
|
||||
ADD r12,r0, r9 |
||||
STRB r7,[r12],#1 ; Store R
|
||||
MOV r7, r7, ROR #22 |
||||
STRB r7,[r12],#1 ; Store G
|
||||
MOV r7, r7, ROR #21 |
||||
STRB r7,[r12],#1 ; Store B
|
||||
|
||||
; Then store the top one
|
||||
STRB r6,[r0], #1 ; Store R
|
||||
MOV r6, r6, ROR #22 |
||||
STRB r6,[r0], #1 ; Store G
|
||||
MOV r6, r6, ROR #21 |
||||
STRB r6,[r0], #1 ; Store B
|
||||
B end_xloop1 |
||||
fix101 |
||||
; r7 and r6 are the values, at least one of which has overflowed
|
||||
; r12 = r7 & mask = .s......s......s......
|
||||
SUB r12,r12,r12,LSR #8 ; r12 = ..SSSSSS.SSSSSS.SSSSSS
|
||||
ORR r7, r7, r12 ; r7 |= ..SSSSSS.SSSSSS.SSSSSS
|
||||
BIC r12,r5, r7, LSR #1 ; r12 = .o......o......o......
|
||||
ADD r7, r7, r12,LSR #8 ; r7 = fixed value
|
||||
|
||||
AND r12, r6, r5 ; r12 = .S......S......S......
|
||||
SUB r12,r12,r12,LSR #8 ; r12 = ..SSSSSS.SSSSSS.SSSSSS
|
||||
ORR r6, r6, r12 ; r6 |= ..SSSSSS.SSSSSS.SSSSSS
|
||||
BIC r12,r5, r6, LSR #1 ; r12 = .o......o......o......
|
||||
ADD r6, r6, r12,LSR #8 ; r6 = fixed value
|
||||
B return101 |
||||
fix102 |
||||
; r7 and r6 are the values, at least one of which has overflowed
|
||||
; r12 = r7 & mask = .s......s......s......
|
||||
SUB r12,r12,r12,LSR #8 ; r12 = ..SSSSSS.SSSSSS.SSSSSS
|
||||
ORR r7, r7, r12 ; r7 |= ..SSSSSS.SSSSSS.SSSSSS
|
||||
BIC r12,r5, r7, LSR #1 ; r12 = .o......o......o......
|
||||
ADD r7, r7, r12,LSR #8 ; r7 = fixed value
|
||||
|
||||
AND r12, r6, r5 ; r12 = .S......S......S......
|
||||
SUB r12,r12,r12,LSR #8 ; r12 = ..SSSSSS..SSSSS.SSSSSS
|
||||
ORR r6, r6, r12 ; r6 |= ..SSSSSS..SSSSS.SSSSSS
|
||||
BIC r12,r5, r6, LSR #1 ; r12 = .o......o......o......
|
||||
ADD r6, r6, r12,LSR #8 ; r6 = fixed value
|
||||
B return102 |
||||
fix103 |
||||
; r7 and r6 are the values, at least one of which has overflowed
|
||||
; r12 = r7 & mask = .s......s......s......
|
||||
SUB r12,r12,r12,LSR #8 ; r12 = ..SSSSSS.SSSSSS.SSSSSS
|
||||
ORR r7, r7, r12 ; r7 |= ..SSSSSS.SSSSSS.SSSSSS
|
||||
BIC r12,r5, r7, LSR #1 ; r12 = .o......o......o......
|
||||
ADD r7, r7, r12,LSR #8 ; r7 = fixed value
|
||||
|
||||
AND r12, r6, r5 ; r12 = .S......S......S......
|
||||
SUB r12,r12,r12,LSR #8 ; r12 = ..SSSSSS.SSSSSS.SSSSSS
|
||||
ORR r6, r6, r12 ; r6 |= ..SSSSSS.SSSSSS.SSSSSS
|
||||
BIC r12,r5, r6, LSR #1 ; r12 = .o......o......o......
|
||||
ADD r6, r6, r12,LSR #8 ; r6 = fixed value
|
||||
B return103 |
||||
fix104 |
||||
; r7 and r6 are the values, at least one of which has overflowed
|
||||
; r12 = r7 & mask = .s......s......s......
|
||||
SUB r12,r12,r12,LSR #8 ; r12 = ..SSSSSS.SSSSSS.SSSSSS
|
||||
ORR r7, r7, r12 ; r7 |= ..SSSSSS.SSSSSS.SSSSSS
|
||||
BIC r12,r5, r7, LSR #1 ; r12 = .o......o......o......
|
||||
ADD r7, r7, r12,LSR #8 ; r7 = fixed value
|
||||
|
||||
AND r12, r6, r5 ; r12 = .S......S......S......
|
||||
SUB r12,r12,r12,LSR #8 ; r12 = ..SSSSSS.SSSSSS.SSSSSS
|
||||
ORR r6, r6, r12 ; r6 |= ..SSSSSS.SSSSSS.SSSSSS
|
||||
BIC r12,r5, r6, LSR #1 ; r12 = .o......o......o......
|
||||
ADD r6, r6, r12,LSR #8 ; r6 = fixed value
|
||||
B return104 |
||||
fix105 |
||||
; r6 is the value, which has has overflowed
|
||||
; r12 = r7 & mask = .s......s......s......
|
||||
SUB r12,r12,r12,LSR #8 ; r12 = ..SSSSSS.SSSSSS.SSSSSS
|
||||
ORR r6, r6, r12 ; r6 |= ..SSSSSS.SSSSSS.SSSSSS
|
||||
BIC r12,r5, r6, LSR #1 ; r12 = .o......o......o......
|
||||
ADD r6, r6, r12,LSR #8 ; r6 = fixed value
|
||||
B return105 |
||||
|
||||
END |
@ -0,0 +1,208 @@ |
||||
/* YUV-> RGB conversion code. (YUV420 to RGB565)
|
||||
* |
||||
* Copyright (C) 2008-9 Robin Watts (robin@wss.co.uk) for Pinknoise |
||||
* Productions Ltd. |
||||
* |
||||
* Licensed under the GNU GPL. If you need it under another license, contact |
||||
* me and ask. |
||||
* |
||||
* This program is free software ; you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation ; either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY ; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program ; if not, write to the Free Software |
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||
* |
||||
* |
||||
* The algorithm used here is based heavily on one created by Sophie Wilson |
||||
* of Acorn/e-14/Broadcomm. Many thanks. |
||||
* |
||||
* Additional tweaks (in the fast fixup code) are from Paul Gardiner. |
||||
* |
||||
* The old implementation of YUV -> RGB did: |
||||
* |
||||
* R = CLAMP((Y-16)*1.164 + 1.596*V) |
||||
* G = CLAMP((Y-16)*1.164 - 0.391*U - 0.813*V) |
||||
* B = CLAMP((Y-16)*1.164 + 2.018*U ) |
||||
* |
||||
* We're going to bend that here as follows: |
||||
* |
||||
* R = CLAMP(y + 1.596*V) |
||||
* G = CLAMP(y - 0.383*U - 0.813*V) |
||||
* B = CLAMP(y + 1.976*U ) |
||||
* |
||||
* where y = 0 for Y <= 16, |
||||
* y = ( Y-16)*1.164, for 16 < Y <= 239, |
||||
* y = (239-16)*1.164, for 239 < Y |
||||
* |
||||
* i.e. We clamp Y to the 16 to 239 range (which it is supposed to be in |
||||
* anyway). We then pick the B_U factor so that B never exceeds 511. We then |
||||
* shrink the G_U factor in line with that to avoid a colour shift as much as |
||||
* possible. |
||||
* |
||||
* We're going to use tables to do it faster, but rather than doing it using |
||||
* 5 tables as as the above suggests, we're going to do it using just 3. |
||||
* |
||||
* We do this by working in parallel within a 32 bit word, and using one |
||||
* table each for Y U and V. |
||||
* |
||||
* Source Y values are 0 to 255, so 0.. 260 after scaling |
||||
* Source U values are -128 to 127, so -49.. 49(G), -253..251(B) after |
||||
* Source V values are -128 to 127, so -204..203(R), -104..103(G) after |
||||
* |
||||
* So total summed values: |
||||
* -223 <= R <= 481, -173 <= G <= 431, -253 <= B < 511 |
||||
* |
||||
* We need to pack R G and B into a 32 bit word, and because of Bs range we |
||||
* need 2 bits above the valid range of B to detect overflow, and another one |
||||
* to detect the sense of the overflow. We therefore adopt the following |
||||
* representation: |
||||
* |
||||
* osGGGGGgggggosBBBBBbbbosRRRRRrrr |
||||
* |
||||
* Each such word breaks down into 3 ranges. |
||||
* |
||||
* osGGGGGggggg osBBBBBbbb osRRRRRrrr |
||||
* |
||||
* Thus we have 8 bits for each B and R table entry, and 10 bits for G (good |
||||
* as G is the most noticable one). The s bit for each represents the sign, |
||||
* and o represents the overflow. |
||||
* |
||||
* For R and B we pack the table by taking the 11 bit representation of their |
||||
* values, and toggling bit 10 in the U and V tables. |
||||
* |
||||
* For the green case we calculate 4*G (thus effectively using 10 bits for the |
||||
* valid range) truncate to 12 bits. We toggle bit 11 in the Y table. |
||||
*/ |
||||
|
||||
#include "yuv2rgb.h" |
||||
|
||||
enum |
||||
{ |
||||
FLAGS = 0x40080100 |
||||
}; |
||||
|
||||
#define READUV(U,V) (tables[256 + (U)] + tables[512 + (V)]) |
||||
#define READY(Y) tables[Y] |
||||
#define FIXUP(Y) \ |
||||
do { \
|
||||
int tmp = (Y) & FLAGS; \
|
||||
if (tmp != 0) \
|
||||
{ \
|
||||
tmp -= tmp>>8; \
|
||||
(Y) |= tmp; \
|
||||
tmp = FLAGS & ~(Y>>1); \
|
||||
(Y) += tmp>>8; \
|
||||
} \
|
||||
} while (0 == 1) |
||||
|
||||
#define STORE(Y,DSTPTR) \ |
||||
do { \
|
||||
uint32_t Y2 = (Y); \
|
||||
uint8_t *DSTPTR2 = (DSTPTR); \
|
||||
(DSTPTR2)[0] = (Y2); \
|
||||
(DSTPTR2)[1] = (Y2)>>22; \
|
||||
(DSTPTR2)[2] = (Y2)>>11; \
|
||||
} while (0 == 1) |
||||
|
||||
void yuv420_2_rgb888(uint8_t *dst_ptr, |
||||
const uint8_t *y_ptr, |
||||
const uint8_t *u_ptr, |
||||
const uint8_t *v_ptr, |
||||
int32_t width, |
||||
int32_t height, |
||||
int32_t y_span, |
||||
int32_t uv_span, |
||||
int32_t dst_span, |
||||
const uint32_t *tables, |
||||
int32_t dither) |
||||
{ |
||||
height -= 1; |
||||
while (height > 0) |
||||
{ |
||||
height -= width<<16; |
||||
height += 1<<16; |
||||
while (height < 0) |
||||
{ |
||||
/* Do 2 column pairs */ |
||||
uint32_t uv, y0, y1; |
||||
|
||||
uv = READUV(*u_ptr++,*v_ptr++); |
||||
y1 = uv + READY(y_ptr[y_span]); |
||||
y0 = uv + READY(*y_ptr++); |
||||
FIXUP(y1); |
||||
FIXUP(y0); |
||||
STORE(y1, &dst_ptr[dst_span]); |
||||
STORE(y0, dst_ptr); |
||||
dst_ptr += 3; |
||||
y1 = uv + READY(y_ptr[y_span]); |
||||
y0 = uv + READY(*y_ptr++); |
||||
FIXUP(y1); |
||||
FIXUP(y0); |
||||
STORE(y1, &dst_ptr[dst_span]); |
||||
STORE(y0, dst_ptr); |
||||
dst_ptr += 3; |
||||
height += (2<<16); |
||||
} |
||||
if ((height>>16) == 0) |
||||
{ |
||||
/* Trailing column pair */ |
||||
uint32_t uv, y0, y1; |
||||
|
||||
uv = READUV(*u_ptr,*v_ptr); |
||||
y1 = uv + READY(y_ptr[y_span]); |
||||
y0 = uv + READY(*y_ptr++); |
||||
FIXUP(y1); |
||||
FIXUP(y0); |
||||
STORE(y0, &dst_ptr[dst_span]); |
||||
STORE(y1, dst_ptr); |
||||
dst_ptr += 3; |
||||
} |
||||
dst_ptr += dst_span*2-width*3; |
||||
y_ptr += y_span*2-width; |
||||
u_ptr += uv_span-(width>>1); |
||||
v_ptr += uv_span-(width>>1); |
||||
height = (height<<16)>>16; |
||||
height -= 2; |
||||
} |
||||
if (height == 0) |
||||
{ |
||||
/* Trail row */ |
||||
height -= width<<16; |
||||
height += 1<<16; |
||||
while (height < 0) |
||||
{ |
||||
/* Do a row pair */ |
||||
uint32_t uv, y0, y1; |
||||
|
||||
uv = READUV(*u_ptr++,*v_ptr++); |
||||
y1 = uv + READY(*y_ptr++); |
||||
y0 = uv + READY(*y_ptr++); |
||||
FIXUP(y1); |
||||
FIXUP(y0); |
||||
STORE(y1, dst_ptr); |
||||
dst_ptr += 3; |
||||
STORE(y0, dst_ptr); |
||||
dst_ptr += 3; |
||||
height += (2<<16); |
||||
} |
||||
if ((height>>16) == 0) |
||||
{ |
||||
/* Trailing pix */ |
||||
uint32_t uv, y0; |
||||
|
||||
uv = READUV(*u_ptr++,*v_ptr++); |
||||
y0 = uv + READY(*y_ptr++); |
||||
FIXUP(y0); |
||||
STORE(y0, dst_ptr); |
||||
dst_ptr += 3; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,156 @@ |
||||
#include <string.h> |
||||
#include <jni.h> |
||||
|
||||
#include <yuv420sp2rgb.h> |
||||
#include <yuv2rgb.h> |
||||
|
||||
/*
|
||||
YUV 4:2:0 image with a plane of 8 bit Y samples followed by an interleaved |
||||
U/V plane containing 8 bit 2x2 subsampled chroma samples. |
||||
except the interleave order of U and V is reversed. |
||||
|
||||
H V |
||||
Y Sample Period 1 1 |
||||
U (Cb) Sample Period 2 2 |
||||
V (Cr) Sample Period 2 2 |
||||
*/ |
||||
|
||||
/*
|
||||
size of a char: |
||||
find . -name limits.h -exec grep CHAR_BIT {} \; |
||||
*/ |
||||
|
||||
#ifndef max |
||||
#define max(a,b) (a > b ? a : b ) |
||||
#define min(a,b) (a < b ? a : b ) |
||||
#endif |
||||
enum |
||||
{ |
||||
FLAGS = 0x40080100 |
||||
}; |
||||
|
||||
#define READUV(U,V) (tables[256 + (U)] + tables[512 + (V)]) |
||||
#define READY(Y) tables[Y] |
||||
#define FIXUP(Y) \ |
||||
do { \
|
||||
int tmp = (Y) & FLAGS; \
|
||||
if (tmp != 0) \
|
||||
{ \
|
||||
tmp -= tmp>>8; \
|
||||
(Y) |= tmp; \
|
||||
tmp = FLAGS & ~(Y>>1); \
|
||||
(Y) += tmp>>8; \
|
||||
} \
|
||||
} while (0 == 1) |
||||
|
||||
#define STORE(Y,DSTPTR) \ |
||||
do { \
|
||||
uint32_t Y2 = (Y); \
|
||||
uint8_t *DSTPTR2 = (DSTPTR); \
|
||||
(DSTPTR2)[2] = (Y2); \
|
||||
(DSTPTR2)[1] = (Y2)>>22; \
|
||||
(DSTPTR2)[0] = (Y2)>>11; \
|
||||
} while (0 == 1) |
||||
|
||||
typedef unsigned char byte; |
||||
const int bytes_per_pixel = 2; |
||||
void color_convert_common(const unsigned char *pY, const unsigned char *pUV, int width, int height, |
||||
unsigned char *buffer, int grey) |
||||
{ |
||||
#define LOOKUP 1 |
||||
#if ! LOOKUP |
||||
int nR, nG, nB; |
||||
#endif |
||||
int dest_span = 3 * width; |
||||
unsigned char *out = buffer; |
||||
if (grey) |
||||
{ |
||||
memcpy(out, pY, width * height * sizeof(unsigned char)); |
||||
} |
||||
else |
||||
{ |
||||
|
||||
#if LOOKUP |
||||
const uint32_t* tables = yuv2rgb565_table; |
||||
const byte* nY = pY; |
||||
const byte* nUV = pUV; |
||||
int idx = 0; |
||||
while (nY+width < pUV) |
||||
{ |
||||
int y = (idx / width); |
||||
int x = (idx % width); |
||||
byte Y = *nY; |
||||
byte Y2 = nY[width]; |
||||
byte V = *nUV; |
||||
byte U = *(nUV + 1); |
||||
/* Do 2 row pairs */ |
||||
uint32_t uv, y0, y1; |
||||
|
||||
uv = READUV(U,V); |
||||
y1 = uv + READY(Y); |
||||
y0 = uv + READY(Y2); |
||||
FIXUP(y1); |
||||
FIXUP(y0); |
||||
STORE(y1, &out[dest_span]); |
||||
STORE(y0, out); |
||||
out += 3; |
||||
Y = *(++nY); |
||||
Y2 = nY[width]; |
||||
y1 = uv + READY(Y); |
||||
y0 = uv + READY(Y2); |
||||
FIXUP(y1); |
||||
FIXUP(y0); |
||||
STORE(y1, &out[dest_span]); |
||||
STORE(y0, out); |
||||
out += 3; |
||||
height += (2 << 16); |
||||
++nY; |
||||
nUV = pUV + (y / 2) * width + 2 * (x / 2); |
||||
idx+=2; |
||||
} |
||||
#else |
||||
const byte* nY = pY; |
||||
const byte* nUV = pUV; |
||||
int idx = 0; |
||||
while (nY < pUV) |
||||
{ |
||||
|
||||
int y = (idx / width); |
||||
int x = (idx % width); |
||||
int Y = *nY; |
||||
int V = *nUV; |
||||
int U = *(nUV + 1); |
||||
|
||||
Y -= 16; |
||||
V -= 128; |
||||
U -= 128; |
||||
if (y < 0) |
||||
y = 0; |
||||
|
||||
nB = (int)(1192 * Y + 2066 * U); |
||||
nG = (int)(1192 * Y - 833 * V - 400 * U); |
||||
nR = (int)(1192 * Y + 1634 * V); |
||||
|
||||
nR = min(262143, max(0, nR)); |
||||
nG = min(262143, max(0, nG)); |
||||
nB = min(262143, max(0, nB)); |
||||
|
||||
nR >>= 10; |
||||
nR &= 0xff; |
||||
nG >>= 10; |
||||
nG &= 0xff; |
||||
nB >>= 10; |
||||
nB &= 0xff; |
||||
|
||||
*(out++) = (unsigned char)nR; |
||||
*(out++) = (unsigned char)nG; |
||||
*(out++) = (unsigned char)nB; |
||||
nY += 1; |
||||
nUV = pUV + (y / 2) * width + 2 * (x / 2); |
||||
++idx; |
||||
} |
||||
#endif |
||||
} |
||||
|
||||
|
||||
} |
After Width: | Height: | Size: 161 KiB |
@ -0,0 +1,28 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" |
||||
android:layout_width="fill_parent" android:layout_height="fill_parent" |
||||
android:background="@drawable/cameraback"> |
||||
<!--<SurfaceView--> |
||||
<com.opencv.camera.NativePreviewer |
||||
android:id="@+id/nativepreviewer" android:layout_width="400dip" |
||||
android:layout_height="300dip" android:layout_alignParentLeft="true" |
||||
android:layout_margin="20dip" android:gravity="center_horizontal|center_vertical" |
||||
android:layout_marginRight="20dip" /> |
||||
<LinearLayout android:id="@+id/glview_layout" |
||||
android:layout_width="400dip" android:layout_height="300dip" |
||||
android:layout_alignParentLeft="true" android:layout_margin="20dip" |
||||
android:gravity="center_horizontal|center_vertical" |
||||
android:layout_marginRight="20dip"> |
||||
</LinearLayout> |
||||
<LinearLayout android:layout_width="wrap_content" |
||||
android:layout_height="fill_parent" android:orientation="vertical" |
||||
android:layout_margin="20dip" android:gravity="center_horizontal|center_vertical" |
||||
android:layout_alignParentRight="true"> |
||||
<ImageButton android:src="@android:drawable/ic_menu_camera" |
||||
android:id="@+id/button_capture" android:layout_width="60dip" |
||||
android:layout_height="60dip" android:layout_marginBottom="10dip"></ImageButton> |
||||
<ImageButton android:src="@android:drawable/ic_menu_preferences" |
||||
android:id="@+id/button_camera_settings" android:layout_width="60dip" |
||||
android:layout_height="60dip" android:layout_marginBottom="10dip"></ImageButton> |
||||
</LinearLayout> |
||||
</RelativeLayout> |
@ -0,0 +1,128 @@ |
||||
package com.opencv.camera; |
||||
|
||||
import java.util.LinkedList; |
||||
|
||||
import android.app.Activity; |
||||
import android.content.pm.ActivityInfo; |
||||
import android.os.Bundle; |
||||
import android.view.KeyEvent; |
||||
import android.view.MotionEvent; |
||||
import android.view.Window; |
||||
import android.view.WindowManager; |
||||
import android.widget.LinearLayout; |
||||
|
||||
import com.opencv.camera.CameraButtonsHandler.CaptureListener; |
||||
import com.opencv.opengl.GL2CameraViewer; |
||||
|
||||
public abstract class CameraActivity extends Activity implements CaptureListener { |
||||
|
||||
/** Called when the activity is first created. */ |
||||
@Override |
||||
public void onCreate(Bundle savedInstanceState) { |
||||
super.onCreate(savedInstanceState); |
||||
setFullscreen(); |
||||
setOrientation(); |
||||
disableScreenTurnOff(); |
||||
setContentView(com.opencv.R.layout.camera); |
||||
cameraButtonHandler = new CameraButtonsHandler(this,this); |
||||
mPreview = (NativePreviewer) findViewById(com.opencv.R.id.nativepreviewer); |
||||
LinearLayout glview_layout = (LinearLayout) findViewById(com.opencv.R.id.glview_layout); |
||||
glview = new GL2CameraViewer(getApplication(), true, 0, 0); |
||||
glview_layout.addView(glview); |
||||
} |
||||
|
||||
/** |
||||
* 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: |
||||
cameraButtonHandler.setIsCapture(true); |
||||
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) { |
||||
cameraButtonHandler.setIsCapture(true); |
||||
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); |
||||
} |
||||
|
||||
@Override |
||||
protected void onPause() { |
||||
super.onPause(); |
||||
mPreview.onPause(); |
||||
glview.onPause(); |
||||
} |
||||
|
||||
@Override |
||||
protected void onResume() { |
||||
super.onResume(); |
||||
mPreview.setParamsFromPrefs(getApplicationContext()); |
||||
glview.onResume(); |
||||
mPreview.onResume(); |
||||
setCallbackStack(); |
||||
} |
||||
|
||||
protected void setCallbackStack() { |
||||
LinkedList<NativeProcessor.PoolCallback> callbackstack = getCallBackStack(); |
||||
if (callbackstack == null){ |
||||
callbackstack = new LinkedList<NativeProcessor.PoolCallback>(); |
||||
callbackstack.add(glview.getDrawCallback()); |
||||
} |
||||
mPreview.addCallbackStack(callbackstack); |
||||
} |
||||
|
||||
/** |
||||
* Overide this and provide your processors to the camera |
||||
* |
||||
* @return null for default drawing |
||||
*/ |
||||
protected abstract LinkedList<NativeProcessor.PoolCallback> getCallBackStack(); |
||||
public void onCapture(){ |
||||
|
||||
} |
||||
|
||||
protected NativePreviewer mPreview; |
||||
protected GL2CameraViewer glview; |
||||
protected CameraButtonsHandler cameraButtonHandler; |
||||
} |
@ -0,0 +1,83 @@ |
||||
package com.opencv.camera; |
||||
|
||||
import android.app.Activity; |
||||
import android.content.Context; |
||||
import android.content.Intent; |
||||
import android.view.View; |
||||
import android.view.View.OnClickListener; |
||||
import android.widget.ImageButton; |
||||
|
||||
public class CameraButtonsHandler { |
||||
/** Constructs a buttons handler, will register with the capture button |
||||
* and the camera settings button. |
||||
* @param a The activity that has inflated the com.opencv.R.layout.camera |
||||
* as its layout. |
||||
*/ |
||||
public CameraButtonsHandler(Activity a, CaptureListener l) { |
||||
ImageButton capture = (ImageButton) a |
||||
.findViewById(com.opencv.R.id.button_capture); |
||||
ImageButton settings = (ImageButton) a |
||||
.findViewById(com.opencv.R.id.button_camera_settings); |
||||
capture.setOnClickListener(capture_listener); |
||||
settings.setOnClickListener(settings_listener); |
||||
captureListener = l; |
||||
ctx = a; |
||||
} |
||||
|
||||
public CameraButtonsHandler(Activity a) { |
||||
ImageButton capture = (ImageButton) a |
||||
.findViewById(com.opencv.R.id.button_capture); |
||||
ImageButton settings = (ImageButton) a |
||||
.findViewById(com.opencv.R.id.button_camera_settings); |
||||
capture.setOnClickListener(capture_listener); |
||||
settings.setOnClickListener(settings_listener); |
||||
ctx = a; |
||||
} |
||||
|
||||
|
||||
/** Check if the capture button has been pressed |
||||
* @return true if the capture button has been pressed |
||||
*/ |
||||
synchronized public boolean isCapture(){ |
||||
return capture_flag; |
||||
} |
||||
|
||||
/** Reset the capture flag |
||||
*/ |
||||
synchronized public void resetIsCapture(){ |
||||
capture_flag = false; |
||||
} |
||||
|
||||
/** Manually set the flag - call this on any event that should trigger |
||||
* a capture |
||||
* @param isCapture true if a capture should take place |
||||
*/ |
||||
synchronized public void setIsCapture(boolean isCapture){ |
||||
capture_flag = isCapture; |
||||
if(capture_flag && captureListener != null){ |
||||
captureListener.onCapture(); |
||||
} |
||||
} |
||||
|
||||
private OnClickListener capture_listener = new View.OnClickListener() { |
||||
@Override |
||||
public void onClick(View v) { |
||||
setIsCapture(true); |
||||
} |
||||
}; |
||||
private OnClickListener settings_listener = new View.OnClickListener() { |
||||
@Override |
||||
public void onClick(View v) { |
||||
Intent configurer = new Intent(ctx, |
||||
CameraConfig.class); |
||||
ctx.startActivity(configurer); |
||||
} |
||||
}; |
||||
|
||||
interface CaptureListener{ |
||||
public void onCapture(); |
||||
} |
||||
private CaptureListener captureListener; |
||||
private Context ctx; |
||||
private boolean capture_flag = false; |
||||
} |
@ -0,0 +1,34 @@ |
||||
package com.opencv.utils; |
||||
|
||||
import java.nio.ByteBuffer; |
||||
|
||||
import com.opencv.jni.Mat; |
||||
import com.opencv.jni.Size; |
||||
import com.opencv.jni.opencv; |
||||
|
||||
import android.graphics.Bitmap; |
||||
import android.graphics.Bitmap.Config; |
||||
|
||||
public class BitmapBridge { |
||||
static void copyBitmap(Bitmap bmap, Mat mat) throws Exception { |
||||
if ((bmap.getConfig() == null) || bmap.getConfig() == Config.ARGB_8888) |
||||
throw new Exception("bad config"); |
||||
Size sz = new Size(bmap.getWidth(), bmap.getHeight()); |
||||
mat.create(sz, opencv.CV_8UC4); |
||||
ByteBuffer buffer = ByteBuffer.allocate(4 * bmap.getWidth() |
||||
* bmap.getHeight()); |
||||
bmap.copyPixelsToBuffer(buffer); |
||||
opencv.copyBufferToMat(mat, buffer); |
||||
|
||||
} |
||||
|
||||
static Bitmap matToBitmap(Mat mat) { |
||||
Bitmap bmap = Bitmap.createBitmap(mat.getCols(), mat.getRows(), |
||||
Config.ARGB_8888); |
||||
ByteBuffer buffer = ByteBuffer.allocate(4 * bmap.getWidth() |
||||
* bmap.getHeight()); |
||||
opencv.copyMatToBuffer(buffer, mat); |
||||
bmap.copyPixelsFromBuffer(buffer); |
||||
return bmap; |
||||
} |
||||
} |
@ -0,0 +1,5 @@ |
||||
cmake_minimum_required(VERSION 2.8) |
||||
|
||||
project(CVCamera) |
||||
|
||||
add_subdirectory(jni) |
@ -1,86 +0,0 @@ |
||||
# 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 |
||||
ifndef ARM_TARGETS |
||||
ARM_TARGETS="armeabi armeabi-v7a"
|
||||
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) \
|
||||
ARM_TARGETS=$(ARM_TARGETS)
|
||||
|
||||
# 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)
|
||||
|
@ -1 +0,0 @@ |
||||
make V=0 |
@ -1 +0,0 @@ |
||||
make OPENCV_ROOT=../../opencv V=0 clean |
@ -1,21 +0,0 @@ |
||||
# 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) |
||||
|
@ -1,2 +0,0 @@ |
||||
# The ARMv7 is significanly faster due to the use of the hardware FPU
|
||||
APP_ABI := $(ARM_TARGETS)
|
@ -0,0 +1,62 @@ |
||||
######################################################### |
||||
# Find opencv and android-opencv |
||||
######################################################### |
||||
|
||||
set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/../../build |
||||
CACHE PATH "The path where you built opencv for android") |
||||
set(AndroidOpenCV_DIR ${CMAKE_SOURCE_DIR}/../../android-opencv/build |
||||
CACHE PATH "The path where you built android-opencv") |
||||
|
||||
find_package(OpenCV REQUIRED) |
||||
FIND_PACKAGE(AndroidOpenCV REQUIRED ) |
||||
|
||||
######################################################### |
||||
#c flags, included, and lib dependencies |
||||
######################################################### |
||||
|
||||
#notice the "recycling" of CMAKE_C_FLAGS |
||||
#this is necessary to pick up android flags |
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -pedantic -fPIC" ) |
||||
|
||||
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) |
||||
|
||||
set( LIBRARY_DEPS ${AndroidOpenCV_LIBS} ${OpenCV_LIBS} ) |
||||
if(ANDROID) |
||||
set( LIBRARY_DEPS ${LIBRARY_DEPS} log dl) |
||||
endif(ANDROID) |
||||
|
||||
######################################################### |
||||
#SWIG STUFF |
||||
######################################################### |
||||
#the java package to place swig generated java files in |
||||
set(MY_PACKAGE com.theveganrobot.cvcamera.jni) |
||||
|
||||
if(NOT ANDROID) |
||||
#non android swig and jni |
||||
#jni is available by default on android |
||||
find_package(JNI REQUIRED) |
||||
include_directories(${JNI_INCLUDE_DIRS}) |
||||
FIND_PACKAGE(SWIG) |
||||
endif() |
||||
|
||||
INCLUDE(${SWIG_USE_FILE}) #on android this is found by the cmake toolchain |
||||
|
||||
if(ANDROID) |
||||
#this will set the output path for the java package |
||||
#and properly create the package declarations in generated java sources |
||||
SET_SWIG_JAVA_PACKAGE( ${MY_PACKAGE} ) #defined in the android toolchain |
||||
endif(ANDROID) |
||||
|
||||
#this add's the swig path for the opencv wrappers |
||||
SET(CMAKE_SWIG_FLAGS ${CMAKE_SWIG_FLAGS} "-I${AndroidOpenCV_SWIG_DIR}" ) |
||||
|
||||
SET_SOURCE_FILES_PROPERTIES(cvcamera.i PROPERTIES CPLUSPLUS ON) |
||||
|
||||
#add the swig module, giving it the name, java, and then all of the source files |
||||
SWIG_ADD_MODULE(cvcamera java |
||||
cvcamera.i #swig file |
||||
Processor.cpp #cpp files can be compiled to |
||||
) |
||||
|
||||
#link the module like any other |
||||
target_link_libraries(cvcamera ${LIBRARY_DEPS} ) |
@ -1,4 +0,0 @@ |
||||
#location of android-opencv port of OpenCV to android
|
||||
OPENCV_CONFIG=../../build/android-opencv.mk
|
||||
ANDROID_NDK_ROOT=$(HOME)/android-ndk-r4-crystax
|
||||
ARM_TARGETS="armeabi armeabi-v7a"
|
@ -0,0 +1,29 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" |
||||
package="com.OpenCV_SAMPLE" android:versionCode="1" |
||||
android:versionName="1.0"> |
||||
<application android:label="@string/app_name" |
||||
android:debuggable="true" android:icon="@drawable/icon"> |
||||
<activity android:name=".OpenCV_SAMPLE" android:label="@string/app_name" |
||||
android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden|keyboard"> |
||||
<intent-filter> |
||||
<action android:name="android.intent.action.MAIN" /> |
||||
<category android:name="android.intent.category.LAUNCHER" /> |
||||
</intent-filter> |
||||
</activity> |
||||
<!-- These activities are defined in the android-opencv library, and just |
||||
reused here --> |
||||
<activity android:name="com.opencv.camera.CameraConfig" |
||||
android:label="@string/app_name" android:screenOrientation="landscape" |
||||
android:configChanges="orientation|keyboardHidden|keyboard"> |
||||
</activity> |
||||
</application> |
||||
|
||||
<uses-sdk android:minSdkVersion="7" /> |
||||
|
||||
<!-- set the opengl version --> |
||||
<uses-feature android:glEsVersion="0x00020000" /> |
||||
<!-- use the camera --> |
||||
<uses-permission android:name="android.permission.CAMERA"></uses-permission> |
||||
|
||||
</manifest> |
@ -0,0 +1,5 @@ |
||||
cmake_minimum_required(VERSION 2.8) |
||||
|
||||
project(OpenCV_SAMPLE) |
||||
|
||||
add_subdirectory(jni) |
@ -1,11 +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. |
||||
|
||||
# Project target. |
||||
target=android-7 |
||||
android.library.reference.1=../../android-opencv/ |
@ -0,0 +1,68 @@ |
||||
######################################################### |
||||
# Find opencv and android-opencv |
||||
######################################################### |
||||
|
||||
set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/../../build |
||||
CACHE PATH "The path where you built opencv for android") |
||||
set(AndroidOpenCV_DIR ${CMAKE_SOURCE_DIR}/../../android-opencv/build |
||||
CACHE PATH "The path where you built android-opencv") |
||||
|
||||
find_package(OpenCV REQUIRED) |
||||
FIND_PACKAGE(AndroidOpenCV REQUIRED ) |
||||
|
||||
######################################################### |
||||
#c flags, included, and lib dependencies |
||||
######################################################### |
||||
|
||||
#notice the "recycling" of CMAKE_C_FLAGS |
||||
#this is necessary to pick up android flags |
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -pedantic -fPIC" ) |
||||
|
||||
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) |
||||
|
||||
set( LIBRARY_DEPS ${AndroidOpenCV_LIBS} ${OpenCV_LIBS} ) |
||||
if(ANDROID) |
||||
set( LIBRARY_DEPS ${LIBRARY_DEPS} log dl) |
||||
endif(ANDROID) |
||||
|
||||
######################################################### |
||||
#SWIG STUFF |
||||
######################################################### |
||||
#the java package to place swig generated java files in |
||||
set(MY_PACKAGE com.OpenCV_SAMPLE.jni ) |
||||
set(MY_MODULE OpenCV_SAMPLE ) |
||||
set(MY_SWIG |
||||
OpenCV_SAMPLE.i #swig file |
||||
) |
||||
set(MY_SRCS |
||||
cvsample.cpp #cpp files can be compiled to |
||||
) |
||||
|
||||
if(NOT ANDROID) |
||||
#non android swig and jni |
||||
#jni is available by default on android |
||||
find_package(JNI REQUIRED) |
||||
include_directories(${JNI_INCLUDE_DIRS}) |
||||
FIND_PACKAGE(SWIG) |
||||
endif() |
||||
|
||||
INCLUDE(${SWIG_USE_FILE}) #on android this is found by the cmake toolchain |
||||
|
||||
if(ANDROID) |
||||
#this will set the output path for the java package |
||||
#and properly create the package declarations in generated java sources |
||||
SET_SWIG_JAVA_PACKAGE( ${MY_PACKAGE} ) #defined in the android toolchain |
||||
endif(ANDROID) |
||||
|
||||
#this add's the swig path for the opencv wrappers |
||||
SET(CMAKE_SWIG_FLAGS ${CMAKE_SWIG_FLAGS} "-I${AndroidOpenCV_SWIG_DIR}" ) |
||||
|
||||
SET_SOURCE_FILES_PROPERTIES(${MY_SWIG} PROPERTIES CPLUSPLUS ON) |
||||
|
||||
#add the swig module, giving it the name, java, and then all of the source files |
||||
SWIG_ADD_MODULE(${MY_MODULE} java |
||||
${MY_SWIG} |
||||
${MY_SRCS} |
||||
) |
||||
#link the module like any other |
||||
target_link_libraries(${MY_MODULE} ${LIBRARY_DEPS} ) |
@ -0,0 +1,48 @@ |
||||
/* File : foobar.i */ |
||||
%module OpenCV_SAMPLE |
||||
|
||||
/* |
||||
* 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 up our shared libraries |
||||
System.loadLibrary("android-opencv"); |
||||
System.loadLibrary("OpenCV_SAMPLE"); |
||||
} catch (UnsatisfiedLinkError e) { |
||||
//badness |
||||
throw e; |
||||
} |
||||
} |
||||
|
||||
%} |
||||
|
||||
//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" |
||||
|
||||
%{ |
||||
#include "cvsample.h" |
||||
using cv::Mat; |
||||
%} |
||||
|
||||
//make sure to import the image_pool as it is |
||||
//referenced by the Processor java generated |
||||
//class |
||||
%typemap(javaimports) CVSample " |
||||
import com.opencv.jni.*;// import the opencv java bindings |
||||
" |
||||
class CVSample |
||||
{ |
||||
public: |
||||
void canny(const Mat& input, Mat& output, int edgeThresh); |
||||
void invert(Mat& inout); |
||||
void blur(Mat& inout, int half_kernel_size); |
||||
}; |
@ -0,0 +1,27 @@ |
||||
#include "cvsample.h" |
||||
#include <opencv2/imgproc/imgproc.hpp> |
||||
|
||||
void CVSample::canny(const cv::Mat& input, cv::Mat& output, int edgeThresh) |
||||
{ |
||||
if (input.empty()) |
||||
return; |
||||
cv::Mat gray; |
||||
if (input.channels() == 3) |
||||
{ |
||||
cv::cvtColor(input, gray, CV_RGB2GRAY); |
||||
} |
||||
else |
||||
gray = input; |
||||
cv::Canny(gray, output, edgeThresh, edgeThresh * 3, 3); |
||||
} |
||||
|
||||
void CVSample::invert(cv::Mat& inout) |
||||
{ |
||||
cv::bitwise_not(inout, inout); |
||||
} |
||||
void CVSample::blur(cv::Mat& inout, int half_kernel_size) |
||||
{ |
||||
int ksz = half_kernel_size*2 + 1; |
||||
cv::Size kernel(ksz,ksz); |
||||
cv::blur(inout,inout,kernel); |
||||
} |
@ -0,0 +1,11 @@ |
||||
#pragma once |
||||
|
||||
#include <opencv2/core/core.hpp> |
||||
|
||||
class CVSample |
||||
{ |
||||
public: |
||||
void canny(const cv::Mat& input, cv::Mat& output, int edgeThresh); |
||||
void invert(cv::Mat& inout); |
||||
void blur(cv::Mat& inout, int half_kernel_size); |
||||
}; |
@ -0,0 +1,3 @@ |
||||
#this generates an ant based cli build of the android-jni project |
||||
android update project --name OpenCV_SAMPLE \ |
||||
--path . |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue