Merged android-experimental branch back to trunk.
This commit is contained in:
parent
bbdd0aecbd
commit
68534d70f3
4
3rdparty/CMakeLists.txt
vendored
4
3rdparty/CMakeLists.txt
vendored
@ -1,7 +1,3 @@
|
||||
if(ANDROID)
|
||||
configure_file("${CMAKE_SOURCE_DIR}/Android.mk.modules.in" "${CMAKE_CURRENT_BINARY_DIR}/Android.mk")
|
||||
endif()
|
||||
|
||||
add_subdirectory(lapack)
|
||||
add_subdirectory(zlib)
|
||||
if(WITH_JASPER AND NOT JASPER_FOUND)
|
||||
|
5
3rdparty/lapack/CMakeLists.txt
vendored
5
3rdparty/lapack/CMakeLists.txt
vendored
@ -2,9 +2,6 @@
|
||||
# CMake file for opencv_lapack. See root CMakeLists.txt
|
||||
#
|
||||
# ----------------------------------------------------------------------------
|
||||
if(ANDROID)
|
||||
define_3rdparty_module(opencv_lapack)
|
||||
else()
|
||||
|
||||
project(opencv_lapack)
|
||||
|
||||
@ -65,5 +62,3 @@ if(NOT BUILD_SHARED_LIBS)
|
||||
install(TARGETS ${the_target}
|
||||
ARCHIVE DESTINATION share/opencv/3rdparty/lib COMPONENT main)
|
||||
endif()
|
||||
|
||||
endif() #android
|
||||
|
9
3rdparty/libjasper/CMakeLists.txt
vendored
9
3rdparty/libjasper/CMakeLists.txt
vendored
@ -1,10 +1,3 @@
|
||||
if(ANDROID)
|
||||
set(android_defs "-DEXCLUDE_MIF_SUPPORT -DEXCLUDE_PNM_SUPPORT -DEXCLUDE_BMP_SUPPORT -DEXCLUDE_RAS_SUPPORT -DEXCLUDE_JPG_SUPPORT -DEXCLUDE_PGX_SUPPORT")
|
||||
define_3rdparty_module(jasper)
|
||||
set(android_defs "")
|
||||
else(ANDROID)
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# CMake file for libjasper. See root CMakeLists.txt
|
||||
#
|
||||
@ -62,5 +55,3 @@ if(NOT BUILD_SHARED_LIBS)
|
||||
install(TARGETS ${the_target}
|
||||
ARCHIVE DESTINATION share/opencv/3rdparty/lib COMPONENT main)
|
||||
endif()
|
||||
|
||||
endif(ANDROID)#!android
|
||||
|
6
3rdparty/libjpeg/CMakeLists.txt
vendored
6
3rdparty/libjpeg/CMakeLists.txt
vendored
@ -1,7 +1,3 @@
|
||||
if(ANDROID)
|
||||
define_3rdparty_module(jpeg)
|
||||
else()
|
||||
#endif()#android
|
||||
# ----------------------------------------------------------------------------
|
||||
# CMake file for libjpeg. See root CMakeLists.txt
|
||||
#
|
||||
@ -52,5 +48,3 @@ if(NOT BUILD_SHARED_LIBS)
|
||||
install(TARGETS ${the_target}
|
||||
ARCHIVE DESTINATION share/opencv/3rdparty/lib COMPONENT main)
|
||||
endif()
|
||||
|
||||
endif()#android
|
||||
|
5
3rdparty/libpng/CMakeLists.txt
vendored
5
3rdparty/libpng/CMakeLists.txt
vendored
@ -1,6 +1,3 @@
|
||||
if(ANDROID)
|
||||
define_3rdparty_module(png)
|
||||
else()
|
||||
# ----------------------------------------------------------------------------
|
||||
# CMake file for libpng. See root CMakeLists.txt
|
||||
#
|
||||
@ -46,5 +43,3 @@ if(NOT BUILD_SHARED_LIBS)
|
||||
install(TARGETS ${the_target}
|
||||
ARCHIVE DESTINATION share/opencv/3rdparty/lib COMPONENT main)
|
||||
endif()
|
||||
|
||||
endif()#android
|
||||
|
2
3rdparty/libtiff/tif_config.h
vendored
2
3rdparty/libtiff/tif_config.h
vendored
@ -20,8 +20,10 @@
|
||||
/* Define to 1 if you have the <io.h> header file. */
|
||||
#define HAVE_IO_H 1
|
||||
|
||||
#if !__ANDROID__
|
||||
/* Define to 1 if you have the <search.h> header file. */
|
||||
#define HAVE_SEARCH_H 1
|
||||
#endif
|
||||
|
||||
/* Define to 1 if you have the `setmode' function. */
|
||||
#define HAVE_SETMODE 1
|
||||
|
5
3rdparty/zlib/CMakeLists.txt
vendored
5
3rdparty/zlib/CMakeLists.txt
vendored
@ -1,6 +1,3 @@
|
||||
if(ANDROID)
|
||||
define_3rdparty_module(zlib)
|
||||
else()
|
||||
# ----------------------------------------------------------------------------
|
||||
# CMake file for zlib. See root CMakeLists.txt
|
||||
#
|
||||
@ -43,5 +40,3 @@ if(NOT BUILD_SHARED_LIBS)
|
||||
install(TARGETS ${the_target}
|
||||
ARCHIVE DESTINATION share/opencv/3rdparty/lib COMPONENT main)
|
||||
endif()
|
||||
|
||||
endif(ANDROID)
|
||||
|
@ -482,8 +482,10 @@ if(UNIX)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" OR ${CMAKE_SYSTEM_NAME} MATCHES "NetBSD")
|
||||
if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" OR ${CMAKE_SYSTEM_NAME} MATCHES "NetBSD" AND NOT ANDROID)
|
||||
set(OPENCV_LINKER_LIBS m pthread)
|
||||
elseif(ANDROID)
|
||||
set(OPENCV_LINKER_LIBS dl m)
|
||||
else()
|
||||
set(OPENCV_LINKER_LIBS dl m pthread rt)
|
||||
endif()
|
||||
@ -508,6 +510,18 @@ if(WITH_JASPER AND NOT JASPER_FOUND)
|
||||
set(JASPER_LIBRARIES libjasper)
|
||||
endif()
|
||||
|
||||
if (ANDROID)
|
||||
set(NativeCamera_DIR "${CMAKE_SOURCE_DIR}/android/native-camera/build")
|
||||
FIND_PACKAGE(NativeCamera QUIET)
|
||||
if(NativeCamera_FOUND)
|
||||
set(HAVE_ANDROID_NATIVE_CAMERA TRUE)
|
||||
set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${NativeCamera_LIBS} log)
|
||||
else()
|
||||
set(HAVE_ANDROID_NATIVE_CAMERA FALSE)
|
||||
message("-- Could NOT find NativeCamera for Android")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
#message(STATUS "Graphic libraries: ${PNG_LIBRARIES} ${JPEG_LIBRARIES} ${TIFF_LIBRARIES} ${JASPER_LIBRARIES}")
|
||||
|
||||
if(WITH_OPENEXR)
|
||||
@ -895,7 +909,9 @@ if(CMAKE_COMPILER_IS_GNUCXX)
|
||||
|
||||
# We need pthread's
|
||||
if(UNIX)
|
||||
if(NOT ANDROID)
|
||||
set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -pthread")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(OPENCV_WARNINGS_ARE_ERRORS)
|
||||
@ -1083,7 +1099,17 @@ endif()
|
||||
set(CMAKE_INCLUDE_DIRS_CONFIGCMAKE "\"${OPENCV_CONFIG_FILE_INCLUDE_DIR}\" \"${CMAKE_CURRENT_SOURCE_DIR}/include\" \"${CMAKE_CURRENT_SOURCE_DIR}/include/opencv\"")
|
||||
set(CMAKE_BASE_INCLUDE_DIRS_CONFIGCMAKE "\"${CMAKE_CURRENT_SOURCE_DIR}\"")
|
||||
|
||||
set(CMAKE_LIB_DIRS_CONFIGCMAKE "${LIBRARY_OUTPUT_PATH}")
|
||||
set(CMAKE_LIB_DIRS_CONFIGCMAKE "${LIBRARY_OUTPUT_PATH}")
|
||||
|
||||
if (ANDROID)
|
||||
if (NOT BUILD_SHARED_LIBS)
|
||||
set(CMAKE_LIB_DIRS_CONFIGCMAKE ${CMAKE_LIB_DIRS_CONFIGCMAKE} "${CMAKE_BINARY_DIR}/lib")
|
||||
endif()
|
||||
|
||||
if( HAVE_ANDROID_NATIVE_CAMERA )
|
||||
set(CMAKE_LIB_DIRS_CONFIGCMAKE ${CMAKE_LIB_DIRS_CONFIGCMAKE} ${NativeCamera_LIB_DIR})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/OpenCVConfig.cmake.in" "${CMAKE_BINARY_DIR}/OpenCVConfig.cmake" IMMEDIATE @ONLY)
|
||||
|
||||
@ -1367,6 +1393,9 @@ else()
|
||||
message(STATUS " V4L/V4L2: ${HAVE_CAMV4L}/${HAVE_CAMV4L2}")
|
||||
endif()
|
||||
message(STATUS " Xine: ${HAVE_XINE}")
|
||||
if(ANDROID)
|
||||
message(STATUS " AndroidNativeCamera: ${HAVE_ANDROID_NATIVE_CAMERA}")
|
||||
endif()
|
||||
endif() #if(UNIX AND NOT APPLE)
|
||||
|
||||
if(APPLE)
|
||||
|
@ -52,8 +52,14 @@ LINK_DIRECTORIES(${OpenCV_LIB_DIR})
|
||||
|
||||
# ====================================================================
|
||||
# Link libraries: e.g. opencv_core220.so, opencv_imgproc220d.lib, etc...
|
||||
# ====================================================================
|
||||
set(OPENCV_LIB_COMPONENTS opencv_core opencv_imgproc opencv_features2d opencv_gpu opencv_calib3d opencv_objdetect opencv_video opencv_highgui opencv_ml opencv_legacy opencv_contrib opencv_flann)
|
||||
# ====================================================================
|
||||
if(NOT ANDROID)
|
||||
set(OPENCV_LIB_COMPONENTS opencv_core opencv_imgproc opencv_features2d opencv_gpu opencv_calib3d opencv_objdetect opencv_video opencv_highgui opencv_ml opencv_legacy opencv_contrib opencv_flann)
|
||||
else()
|
||||
#libraries order is very important because linker from Android NDK is one-pass linker
|
||||
set(OPENCV_LIB_COMPONENTS opencv_calib3d opencv_objdetect opencv_features2d opencv_imgproc opencv_video opencv_highgui opencv_ml opencv_legacy opencv_flann opencv_core )
|
||||
endif()
|
||||
|
||||
SET(OpenCV_LIBS "")
|
||||
foreach(__CVLIB ${OPENCV_LIB_COMPONENTS})
|
||||
# CMake>=2.6 supports the notation "debug XXd optimized XX"
|
||||
@ -85,6 +91,9 @@ IF (NOT @OPENCV_BUILD_SHARED_LIB@)
|
||||
LINK_DIRECTORIES(@CMAKE_LIB_DIRS_CONFIGCMAKE@/../3rdparty/lib)
|
||||
if(WIN32)
|
||||
LINK_DIRECTORIES(@CMAKE_BASE_INCLUDE_DIRS_CONFIGCMAKE@/3rdparty/lib)
|
||||
elseif(ANDROID)
|
||||
LINK_DIRECTORIES(@CMAKE_BINARY_DIR@/3rdparty/lib)
|
||||
LINK_DIRECTORIES(@CMAKE_LIB_DIRS_CONFIGCMAKE@/3rdparty/lib)
|
||||
else()
|
||||
LINK_DIRECTORIES(@CMAKE_LIB_DIRS_CONFIGCMAKE@/../share/opencv/3rdparty/lib)
|
||||
endif()
|
||||
|
@ -29,18 +29,6 @@ macro(define_opencv_module name)
|
||||
|
||||
add_library(${the_target} ${lib_srcs} ${lib_hdrs} ${lib_int_hdrs})
|
||||
|
||||
if(PCHSupport_FOUND)
|
||||
set(pch_header ${CMAKE_CURRENT_SOURCE_DIR}/src/precomp.hpp)
|
||||
if(${CMAKE_GENERATOR} MATCHES "Visual*" OR ${CMAKE_GENERATOR} MATCHES "Xcode*")
|
||||
if(${CMAKE_GENERATOR} MATCHES "Visual*")
|
||||
set(${the_target}_pch "src/precomp.cpp")
|
||||
endif()
|
||||
add_native_precompiled_header(${the_target} ${pch_header})
|
||||
elseif(CMAKE_COMPILER_IS_GNUCXX AND ${CMAKE_GENERATOR} MATCHES ".*Makefiles")
|
||||
add_precompiled_header(${the_target} ${pch_header})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# For dynamic link numbering convenions
|
||||
set_target_properties(${the_target} PROPERTIES
|
||||
VERSION ${OPENCV_VERSION}
|
||||
@ -56,6 +44,18 @@ macro(define_opencv_module name)
|
||||
INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib"
|
||||
)
|
||||
|
||||
if(PCHSupport_FOUND)
|
||||
set(pch_header ${CMAKE_CURRENT_SOURCE_DIR}/src/precomp.hpp)
|
||||
if(${CMAKE_GENERATOR} MATCHES "Visual*" OR ${CMAKE_GENERATOR} MATCHES "Xcode*")
|
||||
if(${CMAKE_GENERATOR} MATCHES "Visual*")
|
||||
set(${the_target}_pch "src/precomp.cpp")
|
||||
endif()
|
||||
add_native_precompiled_header(${the_target} ${pch_header})
|
||||
elseif(CMAKE_COMPILER_IS_GNUCXX AND ${CMAKE_GENERATOR} MATCHES ".*Makefiles")
|
||||
add_precompiled_header(${the_target} ${pch_header})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Add the required libraries for linking:
|
||||
target_link_libraries(${the_target} ${OPENCV_LINKER_LIBS} ${IPP_LIBS} ${ARGN})
|
||||
|
||||
|
@ -34,6 +34,10 @@ ELSE()
|
||||
ENDIF()
|
||||
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
|
||||
|
||||
#if (ANDROID)
|
||||
#SET(PCHSupport_FOUND FALSE)
|
||||
#endif()
|
||||
|
||||
|
||||
MACRO(_PCH_GET_COMPILE_FLAGS _out_compile_flags)
|
||||
|
||||
|
@ -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
|
110
android/CMakeCache.android.initial.cmake
Normal file
110
android/CMakeCache.android.initial.cmake
Normal file
@ -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 :)
|
||||
|
||||
########################################################
|
||||
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
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
|
||||
You should now see a build directory, that is ready to be made.
|
||||
cd build
|
||||
make -j8
|
||||
|
||||
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)
|
||||
|
||||
To build with cmake:
|
||||
Then when you run cmake, use:
|
||||
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDTOOLCHAIN ..
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
make
|
||||
And direct your cmake cache for OpenCV_Dir to the path that you build opencv for android.
|
||||
something like : opencv/android/build
|
||||
|
||||
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
|
||||
|
||||
########################################################
|
||||
android targets
|
||||
########################################################
|
||||
You may wish to build android for multiple hardware targets.
|
||||
|
||||
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:
|
||||
|
||||
include android-opencv.mk
|
||||
|
||||
this defines OPENCV_INCLUDES and OPENCV_LIBS - which you should add to your
|
||||
makefiles like:
|
||||
|
||||
#define OPENCV_INCLUDES and OPENCV_LIBS
|
||||
include $(PATH_TO_OPENCV_ANDROID_BUILD)/android-opencv.mk
|
||||
|
||||
LOCAL_LDLIBS += $(OPENCV_LIBS)
|
||||
|
||||
LOCAL_C_INCLUDES += $(OPENCV_INCLUDES)
|
||||
|
||||
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.
|
||||
|
||||
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)
|
||||
|
29
android/android-opencv/AndroidManifest.xml
Normal file
29
android/android-opencv/AndroidManifest.xml
Normal file
@ -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>
|
44
android/android-opencv/AndroidOpenCVConfig.cmake.in
Normal file
44
android/android-opencv/AndroidOpenCVConfig.cmake.in
Normal file
@ -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@)
|
5
android/android-opencv/CMakeLists.txt
Normal file
5
android/android-opencv/CMakeLists.txt
Normal file
@ -0,0 +1,5 @@
|
||||
cmake_minimum_required(VERSION 2.8)
|
||||
|
||||
project(android-jni)
|
||||
|
||||
add_subdirectory(jni)
|
13
android/android-opencv/README.txt
Normal file
13
android/android-opencv/README.txt
Normal file
@ -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
|
@ -7,6 +7,7 @@
|
||||
# "build.properties", and override values to adapt the script to your
|
||||
# project structure.
|
||||
|
||||
android.library=true
|
||||
#android.library=true
|
||||
# Project target.
|
||||
target=android-7
|
||||
android.library=true
|
70
android/android-opencv/jni/CMakeLists.txt
Normal file
70
android/android-opencv/jni/CMakeLists.txt
Normal file
@ -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)
|
@ -8,7 +8,6 @@ before loading any lib that depends on this.
|
||||
%{
|
||||
#include "image_pool.h"
|
||||
#include "glcamera.h"
|
||||
|
||||
using namespace cv;
|
||||
%}
|
||||
#ifndef SWIGIMPORTED
|
@ -51,7 +51,7 @@
|
||||
return $jnicall;
|
||||
}
|
||||
%typemap(in) CTYPE* LABEL {
|
||||
$1 = (*jenv)->GetDirectBufferAddress(jenv, $input);
|
||||
$1 = (CTYPE*)(jenv)->GetDirectBufferAddress( $input);
|
||||
if ($1 == NULL) {
|
||||
SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "Unable to get address of direct buffer. Buffer must be allocated direct.");
|
||||
}
|
||||
@ -92,7 +92,7 @@ NIO_BUFFER_TYPEMAP(double, BUFF, java.nio.DoubleBuffer);
|
||||
return $jnicall;
|
||||
}
|
||||
%typemap(in) CTYPE* INBUFF {
|
||||
$1 = (*jenv)->GetDirectBufferAddress(jenv, $input);
|
||||
$1 = (jenv)->GetDirectBufferAddress($input);
|
||||
if ($1 == NULL) {
|
||||
SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "Unable to get address of direct buffer. Buffer must be allocated direct.");
|
||||
}
|
||||
@ -116,7 +116,7 @@ NIO_BUFFER_TYPEMAP(double, BUFF, java.nio.DoubleBuffer);
|
||||
return $jnicall;
|
||||
}
|
||||
%typemap(in) CTYPE* OUTBUFF {
|
||||
$1 = (*jenv)->GetDirectBufferAddress(jenv, $input);
|
||||
$1 = (jenv)->GetDirectBufferAddress( $input);
|
||||
if ($1 == NULL) {
|
||||
SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "Unable to get address of direct buffer. Buffer must be allocated direct.");
|
||||
}
|
||||
@ -147,7 +147,7 @@ UNSIGNED_NIO_BUFFER_TYPEMAP(unsigned long, 4, java.nio.LongBuffer, permafrost.hd
|
||||
return $jnicall;
|
||||
}
|
||||
%typemap(in) unsigned char* BUFF {
|
||||
$1 = (*jenv)->GetDirectBufferAddress(jenv, $input);
|
||||
$1 = (const char*)(jenv)->GetDirectBufferAddress( $input);
|
||||
if ($1 == NULL) {
|
||||
SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "Unable to get address of direct buffer. Buffer must be allocated direct.");
|
||||
}
|
156
android/android-opencv/jni/cv.i
Normal file
156
android/android-opencv/jni/cv.i
Normal file
@ -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);
|
@ -17,13 +17,17 @@
|
||||
// OpenGL ES 2.0 code
|
||||
|
||||
#include <jni.h>
|
||||
|
||||
#include <android/log.h>
|
||||
#include <opencv2/core/core.hpp>
|
||||
#include <opencv2/imgproc/imgproc.hpp>
|
||||
|
||||
#if __ANDROID__
|
||||
#include <GLES2/gl2.h>
|
||||
#include <GLES2/gl2ext.h>
|
||||
#else
|
||||
#include <GL/gl.h>
|
||||
#endif
|
||||
|
||||
#include "android_logger.h"
|
||||
|
||||
#include <opencv2/core/core.hpp>
|
||||
#include <opencv2/imgproc/imgproc.hpp>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -33,9 +37,6 @@
|
||||
#include "glcamera.h"
|
||||
#include "image_pool.h"
|
||||
using namespace cv;
|
||||
#define LOG_TAG "libandroid-opencv"
|
||||
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
|
||||
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
|
||||
|
||||
static void printGLString(const char *name, GLenum s)
|
||||
{
|
||||
@ -68,18 +69,12 @@ static const char gFragmentShader[] = "precision mediump float;
|
||||
" gl_FragColor = texture2D( s_texture, v_texCoord );\n"
|
||||
"} \n";
|
||||
|
||||
const GLfloat gTriangleVertices[] = {0.0f, 0.5f, -0.5f, -0.5f, 0.5f, -0.5f};
|
||||
GLubyte testpixels[4 * 3] = {255, 0, 0, // Red
|
||||
0, 255, 0, // Green
|
||||
0, 0, 255, // Blue
|
||||
255, 255, 0 // Yellow
|
||||
};
|
||||
|
||||
GLuint glcamera::createSimpleTexture2D(GLuint _textureid, GLubyte* pixels, int width, int height, int channels)
|
||||
{
|
||||
|
||||
// Bind the texture
|
||||
glActiveTexture( GL_TEXTURE0);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
checkGlError("glActiveTexture");
|
||||
// Bind the texture object
|
||||
glBindTexture(GL_TEXTURE_2D, _textureid);
|
||||
@ -89,7 +84,11 @@ GLuint glcamera::createSimpleTexture2D(GLuint _textureid, GLubyte* pixels, int w
|
||||
switch (channels)
|
||||
{
|
||||
case 3:
|
||||
#if ANDROID
|
||||
format = GL_RGB;
|
||||
#else
|
||||
format = GL_BGR;
|
||||
#endif
|
||||
break;
|
||||
case 1:
|
||||
format = GL_LUMINANCE;
|
||||
@ -102,9 +101,15 @@ GLuint glcamera::createSimpleTexture2D(GLuint _textureid, GLubyte* pixels, int w
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, pixels);
|
||||
|
||||
checkGlError("glTexImage2D");
|
||||
#if ANDROID
|
||||
// Set the filtering mode
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
#else
|
||||
/* Linear Filtering */
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
#endif
|
||||
|
||||
return _textureid;
|
||||
|
||||
@ -112,7 +117,9 @@ GLuint glcamera::createSimpleTexture2D(GLuint _textureid, GLubyte* pixels, int w
|
||||
|
||||
GLuint glcamera::loadShader(GLenum shaderType, const char* pSource)
|
||||
{
|
||||
GLuint shader = glCreateShader(shaderType);
|
||||
GLuint shader = 0;
|
||||
#if __ANDROID__
|
||||
shader = glCreateShader(shaderType);
|
||||
if (shader)
|
||||
{
|
||||
glShaderSource(shader, 1, &pSource, NULL);
|
||||
@ -138,11 +145,13 @@ GLuint glcamera::loadShader(GLenum shaderType, const char* pSource)
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return shader;
|
||||
}
|
||||
|
||||
GLuint glcamera::createProgram(const char* pVertexSource, const char* pFragmentSource)
|
||||
{
|
||||
#if __ANDROID__
|
||||
GLuint vertexShader = loadShader(GL_VERTEX_SHADER, pVertexSource);
|
||||
if (!vertexShader)
|
||||
{
|
||||
@ -184,27 +193,32 @@ GLuint glcamera::createProgram(const char* pVertexSource, const char* pFragmentS
|
||||
}
|
||||
}
|
||||
return program;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
void glcamera::clear(){
|
||||
nimg = Mat();
|
||||
}
|
||||
|
||||
//GLuint textureID;
|
||||
|
||||
bool glcamera::setupGraphics(int w, int h)
|
||||
{
|
||||
printGLString("Version", GL_VERSION);
|
||||
printGLString("Vendor", GL_VENDOR);
|
||||
printGLString("Renderer", GL_RENDERER);
|
||||
printGLString("Extensions", GL_EXTENSIONS);
|
||||
// printGLString("Version", GL_VERSION);
|
||||
// printGLString("Vendor", GL_VENDOR);
|
||||
// printGLString("Renderer", GL_RENDERER);
|
||||
// printGLString("Extensions", GL_EXTENSIONS);
|
||||
|
||||
LOGI("setupGraphics(%d, %d)", w, h);
|
||||
#if __ANDROID__
|
||||
gProgram = createProgram(gVertexShader, gFragmentShader);
|
||||
if (!gProgram)
|
||||
{
|
||||
LOGE("Could not create program.");
|
||||
return false;
|
||||
}
|
||||
|
||||
gvPositionHandle = glGetAttribLocation(gProgram, "a_position");
|
||||
gvTexCoordHandle = glGetAttribLocation(gProgram, "a_texCoord");
|
||||
|
||||
gvSamplerHandle = glGetAttribLocation(gProgram, "s_texture");
|
||||
|
||||
// Use tightly packed data
|
||||
@ -212,28 +226,24 @@ bool glcamera::setupGraphics(int w, int h)
|
||||
|
||||
// Generate a texture object
|
||||
glGenTextures(1, &textureID);
|
||||
textureID = createSimpleTexture2D(textureID, testpixels, 2, 2, 3);
|
||||
|
||||
checkGlError("glGetAttribLocation");
|
||||
LOGI("glGetAttribLocation(\"vPosition\") = %d\n",
|
||||
gvPositionHandle);
|
||||
|
||||
glViewport(0, 0, w, h);
|
||||
checkGlError("glViewport");
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
void glcamera::renderFrame()
|
||||
{
|
||||
|
||||
#if __ANDROID__
|
||||
GLfloat vVertices[] = {-1.0f, 1.0f, 0.0f, // Position 0
|
||||
0.0f, 0.0f, // TexCoord 0
|
||||
-1.0f, -1.0f, 0.0f, // Position 1
|
||||
0.0f, 1.0f, // TexCoord 1
|
||||
0.0f, img_h, // TexCoord 1
|
||||
1.0f, -1.0f, 0.0f, // Position 2
|
||||
1.0f, 1.0f, // TexCoord 2
|
||||
img_w, img_h, // TexCoord 2
|
||||
1.0f, 1.0f, 0.0f, // Position 3
|
||||
1.0f, 0.0f // TexCoord 3
|
||||
img_w, 0.0f // TexCoord 3
|
||||
};
|
||||
GLushort indices[] = {0, 1, 2, 0, 2, 3};
|
||||
GLsizei stride = 5 * sizeof(GLfloat); // 3 for position, 2 for texture
|
||||
@ -244,6 +254,8 @@ void glcamera::renderFrame()
|
||||
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
|
||||
checkGlError("glClear");
|
||||
|
||||
if(nimg.empty())return;
|
||||
|
||||
glUseProgram(gProgram);
|
||||
checkGlError("glUseProgram");
|
||||
|
||||
@ -256,14 +268,14 @@ void glcamera::renderFrame()
|
||||
glEnableVertexAttribArray(gvTexCoordHandle);
|
||||
|
||||
// Bind the texture
|
||||
glActiveTexture( GL_TEXTURE0);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, textureID);
|
||||
|
||||
// Set the sampler texture unit to 0
|
||||
glUniform1i(gvSamplerHandle, 0);
|
||||
|
||||
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);
|
||||
|
||||
#endif
|
||||
//checkGlError("glVertexAttribPointer");
|
||||
//glEnableVertexAttribArray(gvPositionHandle);
|
||||
//checkGlError("glEnableVertexAttribArray");
|
||||
@ -284,17 +296,35 @@ void glcamera::step()
|
||||
if (newimage && !nimg.empty())
|
||||
{
|
||||
|
||||
textureID = createSimpleTexture2D(textureID, nimg.ptr<unsigned char> (0), nimg.rows, nimg.cols, nimg.channels());
|
||||
textureID = createSimpleTexture2D(textureID, nimg.ptr<unsigned char> (0), nimg.cols, nimg.rows, nimg.channels());
|
||||
newimage = false;
|
||||
}
|
||||
renderFrame();
|
||||
|
||||
}
|
||||
#define NEAREST_POW2(x)((int)(0.5 + std::log(x)/0.69315) )
|
||||
#define NEAREST_POW2(x)( std::ceil(std::log(x)/0.69315) )
|
||||
void glcamera::setTextureImage(const Mat& img)
|
||||
{
|
||||
int p = NEAREST_POW2(img.cols/2); //subsample by 2
|
||||
//int sz = std::pow(2, p);
|
||||
|
||||
// Size size(sz, sz);
|
||||
Size size(256, 256);
|
||||
resize(img, nimg, size, cv::INTER_NEAREST);
|
||||
img_w = 1;
|
||||
img_h = 1;
|
||||
if (nimg.cols != size.width)
|
||||
LOGI_STREAM( "using texture of size: (" << size.width << " , " << size.height << ") image size is: (" << img.cols << " , " << img.rows << ")");
|
||||
nimg.create(size, img.type());
|
||||
#if SUBREGION_NPO2
|
||||
cv::Rect roi(0, 0, img.cols/2, img.rows/2);
|
||||
cv::Mat nimg_sub = nimg(roi);
|
||||
//img.copyTo(nimg_sub);
|
||||
img_w = (img.cols/2)/float(sz);
|
||||
img_h = (img.rows/2)/float(sz);
|
||||
cv::resize(img,nimg_sub,nimg_sub.size(),0,0,CV_INTER_NN);
|
||||
#else
|
||||
cv::resize(img, nimg, nimg.size(), 0, 0, CV_INTER_NN);
|
||||
#endif
|
||||
newimage = true;
|
||||
}
|
||||
|
@ -39,5 +39,6 @@ public:
|
||||
void init(int width, int height);
|
||||
void step();
|
||||
void drawMatToGL(int idx, image_pool* pool);
|
||||
void clear();
|
||||
};
|
||||
|
@ -2,14 +2,31 @@
|
||||
|
||||
#include "yuv420sp2rgb.h"
|
||||
|
||||
#include <android/log.h>
|
||||
#include <opencv2/imgproc/imgproc.hpp>
|
||||
#include <jni.h>
|
||||
using namespace cv;
|
||||
#include "android_logger.h"
|
||||
|
||||
#define LOG_TAG "libandroid-opencv"
|
||||
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
|
||||
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
|
||||
#include <opencv2/imgproc/imgproc.hpp>
|
||||
|
||||
#include <cstdlib>
|
||||
#include <jni.h>
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved);
|
||||
//
|
||||
//JNIEXPORT jobject JNICALL Java_com_opencv_jni_opencvJNI_getBitmapBuffer(
|
||||
// JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_);
|
||||
|
||||
|
||||
JNIEXPORT void JNICALL Java_com_opencv_jni_opencvJNI_addYUVtoPool(JNIEnv *, jclass, jlong, jobject, jbyteArray, jint,
|
||||
jint, jint, jboolean);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
using namespace cv;
|
||||
|
||||
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
|
||||
{
|
||||
@ -19,49 +36,36 @@ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_com_opencv_jni_opencvJNI_addYUVtoPool(JNIEnv * env, jclass thiz, jlong ppool,
|
||||
jobject _jpool, jbyteArray jbuffer, jint jidx,
|
||||
jint jwidth, jint jheight, jboolean jgrey)
|
||||
jobject _jpool, jbyteArray jbuffer, jint jidx,
|
||||
jint jwidth, jint jheight, jboolean jgrey)
|
||||
{
|
||||
int buff_height = jheight + (jheight / 2);
|
||||
Size buff_size(jwidth, buff_height);
|
||||
image_pool *pool = (image_pool *)ppool;
|
||||
|
||||
Mat mat = pool->getYUV(jidx);
|
||||
|
||||
if (mat.empty() || mat.size() != buff_size)
|
||||
//create is smart and only copies if the buffer size is different
|
||||
mat.create(buff_size, CV_8UC1);
|
||||
{
|
||||
mat.create(buff_size, CV_8UC1);
|
||||
uchar* buff = mat.ptr<uchar> (0);
|
||||
jsize sz = env->GetArrayLength(jbuffer);
|
||||
//http://elliotth.blogspot.com/2007/03/optimizing-jni-array-access.html
|
||||
env->GetByteArrayRegion(jbuffer, 0, sz, (jbyte*)buff);
|
||||
}
|
||||
|
||||
jsize sz = env->GetArrayLength(jbuffer);
|
||||
uchar* buff = mat.ptr<uchar> (0);
|
||||
|
||||
env->GetByteArrayRegion(jbuffer, 0, sz, (jbyte*)buff);
|
||||
|
||||
pool->addYUVMat(jidx, mat);
|
||||
|
||||
Mat color = pool->getImage(jidx);
|
||||
|
||||
if (!jgrey)
|
||||
{
|
||||
|
||||
if (color.cols != jwidth || color.rows != jheight || color.channels() != 3)
|
||||
{
|
||||
color.create(jheight, jwidth, CV_8UC3);
|
||||
}
|
||||
//doesn't work unfortunately..
|
||||
//TODO cvtColor(mat,color, CV_YCrCb2RGB);
|
||||
color_convert_common(buff, buff + jwidth * jheight, jwidth, jheight, color.ptr<uchar> (0), false);
|
||||
}
|
||||
|
||||
Mat color;
|
||||
if (jgrey)
|
||||
{
|
||||
Mat grey = pool->getGrey(jidx);
|
||||
color = grey;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
color = pool->getImage(jidx);
|
||||
pool->convertYUVtoColor(jidx, color);
|
||||
}
|
||||
pool->addImage(jidx, color);
|
||||
|
||||
}
|
||||
|
||||
image_pool::image_pool()
|
||||
@ -71,7 +75,7 @@ image_pool::image_pool()
|
||||
|
||||
image_pool::~image_pool()
|
||||
{
|
||||
__android_log_print(ANDROID_LOG_INFO, "image_pool", "destructor called");
|
||||
|
||||
}
|
||||
|
||||
Mat image_pool::getImage(int i)
|
||||
@ -100,9 +104,7 @@ void image_pool::addImage(int i, Mat mat)
|
||||
|
||||
void image_pool::convertYUVtoColor(int i, cv::Mat& out)
|
||||
{
|
||||
|
||||
Mat yuv = getYUV(i);
|
||||
|
||||
if (yuv.empty())
|
||||
return;
|
||||
int width = yuv.cols;
|
||||
@ -110,7 +112,19 @@ void image_pool::convertYUVtoColor(int i, cv::Mat& out)
|
||||
out.create(height, width, CV_8UC3);
|
||||
const unsigned char* buff = yuv.ptr<unsigned char> (0);
|
||||
unsigned char* out_buff = out.ptr<unsigned char> (0);
|
||||
//doesn't work unfortunately..
|
||||
//TODO cvtColor(mat,color, CV_YCrCb2RGB);
|
||||
color_convert_common(buff, buff + width * height, width, height, out_buff, false);
|
||||
}
|
||||
|
||||
void copyMatToBuffer(char* buffer, const cv::Mat& mat)
|
||||
{
|
||||
memcpy(buffer, mat.data, mat.rows * mat.cols * mat.step1());
|
||||
}
|
||||
void copyBufferToMat(cv::Mat& mat, const char* buffer)
|
||||
{
|
||||
memcpy(mat.data, buffer, mat.rows * mat.cols * mat.step1());
|
||||
}
|
||||
|
||||
void RGB2BGR(const Mat& in, Mat& out)
|
||||
{
|
||||
cvtColor(in, out, CV_RGB2BGR);
|
||||
}
|
@ -40,17 +40,12 @@ references them by an index. It allows one to get a pointer to an underlying ma
|
||||
|
||||
%feature("director") image_pool;
|
||||
class image_pool {
|
||||
|
||||
public:
|
||||
image_pool();
|
||||
~image_pool();
|
||||
|
||||
|
||||
Mat getGrey(int i);
|
||||
Mat getImage(int i);
|
||||
void addImage(int i, Mat mat);
|
||||
|
||||
|
||||
|
||||
|
||||
void convertYUVtoColor(int i, Mat& out);
|
||||
};
|
||||
|
||||
void RGB2BGR(const Mat& in, Mat& out);
|
||||
|
19
android/android-opencv/jni/include/android_logger.h
Normal file
19
android/android-opencv/jni/include/android_logger.h
Normal file
@ -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());}
|
@ -2,8 +2,13 @@
|
||||
#define GLCAMERA_H_
|
||||
#include <opencv2/core/core.hpp>
|
||||
|
||||
#ifdef __ANDROID__
|
||||
#include <GLES2/gl2.h>
|
||||
#include <GLES2/gl2ext.h>
|
||||
#else
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glu.h>
|
||||
#endif
|
||||
|
||||
#include "image_pool.h"
|
||||
|
||||
@ -17,8 +22,11 @@ public:
|
||||
void step();
|
||||
|
||||
void drawMatToGL(int idx, image_pool* pool);
|
||||
void drawMatToGL(const cv::Mat& img);
|
||||
void setTextureImage(const cv::Mat& img);
|
||||
|
||||
void clear();
|
||||
|
||||
private:
|
||||
GLuint createSimpleTexture2D(GLuint _textureid, GLubyte* pixels, int width, int height, int channels);
|
||||
GLuint loadShader(GLenum shaderType, const char* pSource);
|
||||
@ -35,5 +43,6 @@ private:
|
||||
|
||||
GLuint gvTexCoordHandle;
|
||||
GLuint gvSamplerHandle;
|
||||
float img_w, img_h;
|
||||
};
|
||||
#endif
|
@ -3,27 +3,8 @@
|
||||
#include <opencv2/core/core.hpp>
|
||||
#include <map>
|
||||
|
||||
#if ANDROID
|
||||
#include <jni.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved);
|
||||
//
|
||||
//JNIEXPORT jobject JNICALL Java_com_opencv_jni_opencvJNI_getBitmapBuffer(
|
||||
// JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_);
|
||||
|
||||
|
||||
JNIEXPORT void JNICALL Java_com_opencv_jni_opencvJNI_addYUVtoPool(JNIEnv *, jclass, jlong, jobject, jbyteArray, jint,
|
||||
jint, jint, jboolean);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
class image_pool
|
||||
{
|
||||
|
||||
@ -63,4 +44,8 @@ private:
|
||||
std::map<int, cv::Mat> yuvImagesMap;
|
||||
|
||||
};
|
||||
|
||||
void copyMatToBuffer(char* buffer, const cv::Mat& mat);
|
||||
void copyBufferToMat(cv::Mat& mat, const char* buffer);
|
||||
void RGB2BGR(const cv::Mat& in, cv::Mat& out);
|
||||
#endif
|
147
android/android-opencv/jni/include/yuv2rgb.h
Normal file
147
android/android-opencv/jni/include/yuv2rgb.h
Normal file
@ -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
|
||||
|
802
android/android-opencv/jni/yuv2rgb16tab.c
Normal file
802
android/android-opencv/jni/yuv2rgb16tab.c
Normal file
@ -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
|
||||
};
|
379
android/android-opencv/jni/yuv420rgb888.s
Normal file
379
android/android-opencv/jni/yuv420rgb888.s
Normal file
@ -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
|
208
android/android-opencv/jni/yuv420rgb888c.c
Normal file
208
android/android-opencv/jni/yuv420rgb888c.c
Normal file
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
156
android/android-opencv/jni/yuv420sp2rgb.c
Normal file
156
android/android-opencv/jni/yuv420sp2rgb.c
Normal file
@ -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
|
||||
}
|
||||
|
||||
|
||||
}
|
BIN
android/android-opencv/res/drawable-mdpi/cameraback.jpg
Normal file
BIN
android/android-opencv/res/drawable-mdpi/cameraback.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 161 KiB |
28
android/android-opencv/res/layout/camera.xml
Normal file
28
android/android-opencv/res/layout/camera.xml
Normal file
@ -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>
|
@ -27,7 +27,7 @@
|
||||
android:prompt="@string/camera_mode_prompt" android:entries="@array/camera_mode">
|
||||
</Spinner>
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
<LinearLayout android:id="@+id/LinearLayout01"
|
||||
android:layout_width="wrap_content" android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical">
|
||||
@ -37,7 +37,7 @@
|
||||
android:layout_height="wrap_content" android:saveEnabled="true"
|
||||
android:prompt="@string/whitebalance_prompt" android:entries="@array/whitebalance">
|
||||
</Spinner>
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
</LinearLayout>
|
@ -107,7 +107,7 @@ public class OpenCV extends Activity {
|
||||
FrameLayout frame = new FrameLayout(getApplication());
|
||||
|
||||
// Create our Preview view and set it as the content of our activity.
|
||||
mPreview = new NativePreviewer(getApplication(), 400, 300);
|
||||
mPreview = new NativePreviewer(getApplication(), 640, 480);
|
||||
|
||||
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
|
||||
LayoutParams.WRAP_CONTENT);
|
||||
@ -154,4 +154,4 @@ public class OpenCV extends Activity {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
128
android/android-opencv/src/com/opencv/camera/CameraActivity.java
Normal file
128
android/android-opencv/src/com/opencv/camera/CameraActivity.java
Normal file
@ -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;
|
||||
}
|
@ -171,7 +171,7 @@ public class CameraConfig extends Activity {
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
whitebalance_spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
|
||||
|
||||
@Override
|
@ -29,7 +29,7 @@ public class NativePreviewer extends SurfaceView implements
|
||||
* Constructor useful for defining a NativePreviewer in android layout xml
|
||||
*
|
||||
* @param context
|
||||
* @param attributes
|
||||
* @param attributes
|
||||
*/
|
||||
public NativePreviewer(Context context, AttributeSet attributes) {
|
||||
super(context, attributes);
|
||||
@ -47,7 +47,7 @@ public class NativePreviewer extends SurfaceView implements
|
||||
"preview_width", 600);
|
||||
preview_height = attributes.getAttributeIntValue("opencv",
|
||||
"preview_height", 600);
|
||||
|
||||
|
||||
Log.d("NativePreviewer", "Trying to use preview size of "
|
||||
+ preview_width + " " + preview_height);
|
||||
|
||||
@ -92,17 +92,17 @@ public class NativePreviewer extends SurfaceView implements
|
||||
* @param height
|
||||
* desired height
|
||||
*/
|
||||
public void setPreviewSize(int width, int height) {
|
||||
public void setPreviewSize(int width, int height){
|
||||
preview_width = width;
|
||||
preview_height = height;
|
||||
|
||||
|
||||
Log.d("NativePreviewer", "Trying to use preview size of "
|
||||
+ preview_width + " " + preview_height);
|
||||
|
||||
}
|
||||
|
||||
public void setParamsFromPrefs(Context ctx) {
|
||||
int size[] = { 0, 0 };
|
||||
|
||||
public void setParamsFromPrefs(Context ctx){
|
||||
int size[] ={0,0};
|
||||
CameraConfig.readImageSize(ctx, size);
|
||||
int mode = CameraConfig.readCameraMode(ctx);
|
||||
setPreviewSize(size[0], size[1]);
|
||||
@ -146,7 +146,7 @@ public class NativePreviewer extends SurfaceView implements
|
||||
}
|
||||
preview_width = best_width;
|
||||
preview_height = best_height;
|
||||
|
||||
|
||||
Log.d("NativePreviewer", "Determined compatible preview size is: ("
|
||||
+ preview_width + "," + preview_height + ")");
|
||||
|
||||
@ -159,10 +159,10 @@ public class NativePreviewer extends SurfaceView implements
|
||||
if (parameters.getSupportedWhiteBalance().contains(whitebalance_mode)) {
|
||||
parameters.setWhiteBalance(whitebalance_mode);
|
||||
}
|
||||
if (parameters.getSupportedAntibanding().contains(
|
||||
Camera.Parameters.ANTIBANDING_OFF)) {
|
||||
parameters.setAntibanding(Camera.Parameters.ANTIBANDING_OFF);
|
||||
}
|
||||
// if (parameters.getSupportedAntibanding().contains(
|
||||
// Camera.Parameters.ANTIBANDING_OFF)) {
|
||||
// parameters.setAntibanding(Camera.Parameters.ANTIBANDING_OFF);
|
||||
// }
|
||||
|
||||
List<String> fmodes = mCamera.getParameters().getSupportedFocusModes();
|
||||
// for(String x: fmodes){
|
||||
@ -476,7 +476,7 @@ public class NativePreviewer extends SurfaceView implements
|
||||
|
||||
public void setGrayscale(boolean b) {
|
||||
processor.setGrayscale(b);
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -361,6 +361,12 @@ public class GL2CameraViewer extends GLSurfaceView{
|
||||
else
|
||||
Log.e("android-opencv", "null glcamera!!!!");
|
||||
}
|
||||
public void clear(){
|
||||
if(mglcamera != null)
|
||||
mglcamera.clear();
|
||||
else
|
||||
Log.e("android-opencv", "null glcamera!!!!");
|
||||
}
|
||||
|
||||
private class Renderer implements GLSurfaceView.Renderer {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
5
android/apps/CVCamera/CMakeLists.txt
Normal file
5
android/apps/CVCamera/CMakeLists.txt
Normal file
@ -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
|
@ -7,6 +7,6 @@
|
||||
# "build.properties", and override values to adapt the script to your
|
||||
# project structure.
|
||||
|
||||
android.library.reference.1=../../android-jni
|
||||
android.library.reference.1=../../android-opencv
|
||||
# Project target.
|
||||
target=android-7
|
||||
|
@ -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)
|
62
android/apps/CVCamera/jni/CMakeLists.txt
Normal file
62
android/apps/CVCamera/jni/CMakeLists.txt
Normal file
@ -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"
|
@ -7,6 +7,6 @@
|
||||
# "build.properties", and override values to adapt the script to your
|
||||
# project structure.
|
||||
|
||||
android.library.reference.1=../../android-jni
|
||||
android.library.reference.1=../../android-opencv/
|
||||
# Project target.
|
||||
target=android-7
|
||||
|
@ -204,9 +204,9 @@ public class Calibration extends Activity implements CalibrationCallback {
|
||||
|
||||
setFullscreen();
|
||||
disableScreenTurnOff();
|
||||
setContentView(R.layout.camera);
|
||||
setContentView(R.layout.calib_camera);
|
||||
mPreview = (NativePreviewer) findViewById(R.id.nativepreviewer);
|
||||
mPreview.setPreviewSize(1000, 500);
|
||||
mPreview.setPreviewSize(800, 400);
|
||||
mPreview.setGrayscale(true);
|
||||
LinearLayout glview_layout = (LinearLayout) findViewById(R.id.glview_layout);
|
||||
glview = new GL2CameraViewer(getApplication(), false, 0, 0);
|
||||
|
29
android/apps/OpenCV_SAMPLE/AndroidManifest.xml
Normal file
29
android/apps/OpenCV_SAMPLE/AndroidManifest.xml
Normal file
@ -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>
|
5
android/apps/OpenCV_SAMPLE/CMakeLists.txt
Normal file
5
android/apps/OpenCV_SAMPLE/CMakeLists.txt
Normal file
@ -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/
|
68
android/apps/OpenCV_SAMPLE/jni/CMakeLists.txt
Normal file
68
android/apps/OpenCV_SAMPLE/jni/CMakeLists.txt
Normal file
@ -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} )
|
48
android/apps/OpenCV_SAMPLE/jni/OpenCV_SAMPLE.i
Normal file
48
android/apps/OpenCV_SAMPLE/jni/OpenCV_SAMPLE.i
Normal file
@ -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);
|
||||
};
|
27
android/apps/OpenCV_SAMPLE/jni/cvsample.cpp
Normal file
27
android/apps/OpenCV_SAMPLE/jni/cvsample.cpp
Normal file
@ -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);
|
||||
}
|
11
android/apps/OpenCV_SAMPLE/jni/cvsample.h
Normal file
11
android/apps/OpenCV_SAMPLE/jni/cvsample.h
Normal file
@ -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);
|
||||
};
|
3
android/apps/OpenCV_SAMPLE/project_create.sh
Executable file
3
android/apps/OpenCV_SAMPLE/project_create.sh
Executable file
@ -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
Block a user