Merge branch 'master' of code.opencv.org:opencv
Conflicts: samples/python2/common.py samples/python2/feature_homography.py samples/python2/plane_ar.py samples/python2/plane_tracker.py
This commit is contained in:
commit
7db1f711f6
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
|||||||
*.pyc
|
*.pyc
|
||||||
.DS_Store
|
.DS_Store
|
||||||
refman.rst
|
refman.rst
|
||||||
|
OpenCV4Tegra/
|
||||||
|
1
3rdparty/tbb/.gitignore
vendored
Normal file
1
3rdparty/tbb/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
tbb*.tgz
|
@ -140,6 +140,9 @@ OCV_OPTION(WITH_XIMEA "Include XIMEA cameras support" OFF
|
|||||||
OCV_OPTION(WITH_XINE "Include Xine support (GPL)" OFF IF (UNIX AND NOT APPLE AND NOT ANDROID) )
|
OCV_OPTION(WITH_XINE "Include Xine support (GPL)" OFF IF (UNIX AND NOT APPLE AND NOT ANDROID) )
|
||||||
OCV_OPTION(WITH_CLP "Include Clp support (EPL)" OFF)
|
OCV_OPTION(WITH_CLP "Include Clp support (EPL)" OFF)
|
||||||
OCV_OPTION(WITH_OPENCL "Include OpenCL Runtime support" OFF IF (NOT ANDROID AND NOT IOS) )
|
OCV_OPTION(WITH_OPENCL "Include OpenCL Runtime support" OFF IF (NOT ANDROID AND NOT IOS) )
|
||||||
|
OCV_OPTION(WITH_OPENCLAMDFFT "Include AMD OpenCL FFT library support" OFF IF (NOT ANDROID AND NOT IOS) )
|
||||||
|
OCV_OPTION(WITH_OPENCLAMDBLAS "Include AMD OpenCL BLAS library support" OFF IF (NOT ANDROID AND NOT IOS) )
|
||||||
|
|
||||||
|
|
||||||
# OpenCV build components
|
# OpenCV build components
|
||||||
# ===================================================
|
# ===================================================
|
||||||
@ -282,25 +285,37 @@ ocv_include_directories(${OPENCV_CONFIG_FILE_INCLUDE_DIR})
|
|||||||
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
# Autodetect if we are in a SVN repository
|
# Autodetect if we are in a GIT repository
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
find_host_program(SVNVERSION_PATH svnversion)
|
|
||||||
mark_as_advanced(force SVNVERSION_PATH)
|
|
||||||
if(SVNVERSION_PATH)
|
|
||||||
message(STATUS "Extracting svn version, please wait...")
|
|
||||||
execute_process(COMMAND ${SVNVERSION_PATH} -n ${OpenCV_SOURCE_DIR} OUTPUT_VARIABLE SVNVERSION_RESULT)
|
|
||||||
|
|
||||||
if(SVNVERSION_RESULT MATCHES "exported")
|
# don't use FindGit because it requires CMake 2.8.2
|
||||||
# This is NOT a svn repository:
|
set(git_names git eg) # eg = easy git
|
||||||
set(OPENCV_SVNVERSION "")
|
# Prefer .cmd variants on Windows unless running in a Makefile in the MSYS shell
|
||||||
message(STATUS "SVNVERSION: exported")
|
if(WIN32)
|
||||||
|
if(NOT CMAKE_GENERATOR MATCHES "MSYS")
|
||||||
|
set(git_names git.cmd git eg.cmd eg)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_host_program(GIT_EXECUTABLE NAMES ${git_names} PATH_SUFFIXES Git/cmd Git/bin DOC "git command line client")
|
||||||
|
mark_as_advanced(GIT_EXECUTABLE)
|
||||||
|
|
||||||
|
if(GIT_EXECUTABLE)
|
||||||
|
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
|
||||||
|
WORKING_DIRECTORY "${OpenCV_SOURCE_DIR}"
|
||||||
|
OUTPUT_VARIABLE OPENCV_GIT_HASH_SORT
|
||||||
|
RESULT_VARIABLE GIT_RESULT
|
||||||
|
ERROR_QUIET
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
if(GIT_RESULT EQUAL 0)
|
||||||
|
set(OPENCV_VCSVERSION "commit:${OPENCV_GIT_HASH_SORT}")
|
||||||
else()
|
else()
|
||||||
set(OPENCV_SVNVERSION " svn:${SVNVERSION_RESULT}")
|
set(OPENCV_VCSVERSION "exported")
|
||||||
message(STATUS "SVNVERSION: ${OPENCV_SVNVERSION}")
|
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
# We don't have svnversion:
|
# We don't have git:
|
||||||
set(OPENCV_SVNVERSION "")
|
set(OPENCV_VCSVERSION "")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
@ -396,6 +411,12 @@ if(WITH_OPENCL)
|
|||||||
if(OPENCL_FOUND)
|
if(OPENCL_FOUND)
|
||||||
set(HAVE_OPENCL 1)
|
set(HAVE_OPENCL 1)
|
||||||
endif()
|
endif()
|
||||||
|
if(WITH_OPENCLAMDFFT)
|
||||||
|
set(HAVE_CLAMDFFT 1)
|
||||||
|
endif()
|
||||||
|
if(WITH_OPENCLAMDBLAS)
|
||||||
|
set(HAVE_CLAMDBLAS 1)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
@ -465,8 +486,8 @@ include(cmake/OpenCVGenConfig.cmake REQUIRED)
|
|||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
status("")
|
status("")
|
||||||
status("General configuration for OpenCV ${OPENCV_VERSION} =====================================")
|
status("General configuration for OpenCV ${OPENCV_VERSION} =====================================")
|
||||||
if(OPENCV_SVNVERSION)
|
if(OPENCV_VCSVERSION)
|
||||||
status("Version control:" ${OPENCV_SVNVERSION})
|
status(" Version control:" ${OPENCV_VCSVERSION})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ========================== build platform ==========================
|
# ========================== build platform ==========================
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
# See home page: http://code.google.com/p/android-cmake/
|
# See home page: http://code.google.com/p/android-cmake/
|
||||||
#
|
#
|
||||||
# The file is mantained by the OpenCV project. And also can be found at
|
# The file is mantained by the OpenCV project. And also can be found at
|
||||||
# http://code.opencv.org/svn/opencv/trunk/opencv/android/android.toolchain.cmake
|
# http://code.opencv.org/projects/opencv/repository/revisions/master/changes/android/android.toolchain.cmake
|
||||||
#
|
#
|
||||||
# Usage Linux:
|
# Usage Linux:
|
||||||
# $ export ANDROID_NDK=/absolute/path/to/the/android-ndk
|
# $ export ANDROID_NDK=/absolute/path/to/the/android-ndk
|
||||||
@ -182,6 +182,7 @@
|
|||||||
# [+] added mips architecture support
|
# [+] added mips architecture support
|
||||||
# - modified August 2012
|
# - modified August 2012
|
||||||
# [+] updated for NDK r8b
|
# [+] updated for NDK r8b
|
||||||
|
# [~] all intermediate files generated by toolchain are moved into CMakeFiles
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
cmake_minimum_required( VERSION 2.6.3 )
|
cmake_minimum_required( VERSION 2.6.3 )
|
||||||
@ -854,45 +855,48 @@ elseif( X86 )
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
#linker flags
|
#linker flags
|
||||||
list( APPEND ANDROID_SYSTEM_LIB_DIRS "${CMAKE_BINARY_DIR}/systemlibs/${ANDROID_NDK_ABI_NAME}" "${CMAKE_INSTALL_PREFIX}/libs/${ANDROID_NDK_ABI_NAME}" )
|
if( NOT DEFINED __ndklibspath )
|
||||||
|
set( __ndklibspath "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/ndklibs/${ANDROID_NDK_ABI_NAME}" )
|
||||||
|
endif()
|
||||||
|
list( APPEND ANDROID_SYSTEM_LIB_DIRS "${__ndklibspath}" "${CMAKE_INSTALL_PREFIX}/libs/${ANDROID_NDK_ABI_NAME}" )
|
||||||
set( ANDROID_LINKER_FLAGS "" )
|
set( ANDROID_LINKER_FLAGS "" )
|
||||||
#STL
|
#STL
|
||||||
if( ANDROID_USE_STLPORT )
|
if( ANDROID_USE_STLPORT )
|
||||||
if( EXISTS "${__stlLibPath}/libstlport_static.a" )
|
if( EXISTS "${__stlLibPath}/libstlport_static.a" )
|
||||||
__COPY_IF_DIFFERENT( "${__stlLibPath}/libstlport_static.a" "${CMAKE_BINARY_DIR}/systemlibs/${ANDROID_NDK_ABI_NAME}/libstlport_static.a" )
|
__COPY_IF_DIFFERENT( "${__stlLibPath}/libstlport_static.a" "${__ndklibspath}/libstlport_static.a" )
|
||||||
endif()
|
endif()
|
||||||
if( EXISTS "${CMAKE_BINARY_DIR}/systemlibs/${ANDROID_NDK_ABI_NAME}/libstlport_static.a" )
|
if( EXISTS "${__ndklibspath}/libstlport_static.a" )
|
||||||
set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--start-group -lstlport_static" )
|
set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--start-group -lstlport_static" )
|
||||||
endif()
|
endif()
|
||||||
else( ANDROID_USE_STLPORT )
|
else( ANDROID_USE_STLPORT )
|
||||||
if( EXISTS "${__stlLibPath}/libgnustl_static.a" )
|
if( EXISTS "${__stlLibPath}/libgnustl_static.a" )
|
||||||
__COPY_IF_DIFFERENT( "${__stlLibPath}/libgnustl_static.a" "${CMAKE_BINARY_DIR}/systemlibs/${ANDROID_NDK_ABI_NAME}/libstdc++.a" )
|
__COPY_IF_DIFFERENT( "${__stlLibPath}/libgnustl_static.a" "${__ndklibspath}/libstdc++.a" )
|
||||||
elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${__stlLibPath}/${CMAKE_SYSTEM_PROCESSOR}/thumb/libstdc++.a" )
|
elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${__stlLibPath}/${CMAKE_SYSTEM_PROCESSOR}/thumb/libstdc++.a" )
|
||||||
__COPY_IF_DIFFERENT( "${__stlLibPath}/${CMAKE_SYSTEM_PROCESSOR}/thumb/libstdc++.a" "${CMAKE_BINARY_DIR}/systemlibs/${ANDROID_NDK_ABI_NAME}/libstdc++.a" )
|
__COPY_IF_DIFFERENT( "${__stlLibPath}/${CMAKE_SYSTEM_PROCESSOR}/thumb/libstdc++.a" "${__ndklibspath}/libstdc++.a" )
|
||||||
elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${__stlLibPath}/${CMAKE_SYSTEM_PROCESSOR}/libstdc++.a" )
|
elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${__stlLibPath}/${CMAKE_SYSTEM_PROCESSOR}/libstdc++.a" )
|
||||||
__COPY_IF_DIFFERENT( "${__stlLibPath}/${CMAKE_SYSTEM_PROCESSOR}/libstdc++.a" "${CMAKE_BINARY_DIR}/systemlibs/${ANDROID_NDK_ABI_NAME}/libstdc++.a" )
|
__COPY_IF_DIFFERENT( "${__stlLibPath}/${CMAKE_SYSTEM_PROCESSOR}/libstdc++.a" "${__ndklibspath}/libstdc++.a" )
|
||||||
elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${__stlLibPath}/thumb/libstdc++.a" )
|
elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${__stlLibPath}/thumb/libstdc++.a" )
|
||||||
__COPY_IF_DIFFERENT( "${__stlLibPath}/thumb/libstdc++.a" "${CMAKE_BINARY_DIR}/systemlibs/${ANDROID_NDK_ABI_NAME}/libstdc++.a" )
|
__COPY_IF_DIFFERENT( "${__stlLibPath}/thumb/libstdc++.a" "${__ndklibspath}/libstdc++.a" )
|
||||||
elseif( EXISTS "${__stlLibPath}/libstdc++.a" )
|
elseif( EXISTS "${__stlLibPath}/libstdc++.a" )
|
||||||
__COPY_IF_DIFFERENT( "${__stlLibPath}/libstdc++.a" "${CMAKE_BINARY_DIR}/systemlibs/${ANDROID_NDK_ABI_NAME}/libstdc++.a" )
|
__COPY_IF_DIFFERENT( "${__stlLibPath}/libstdc++.a" "${__ndklibspath}/libstdc++.a" )
|
||||||
endif()
|
endif()
|
||||||
if( EXISTS "${CMAKE_BINARY_DIR}/systemlibs/${ANDROID_NDK_ABI_NAME}/libstdc++.a" )
|
if( EXISTS "${__ndklibspath}/libstdc++.a" )
|
||||||
set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -lstdc++" )
|
set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -lstdc++" )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
#gcc exception & rtti support
|
#gcc exception & rtti support
|
||||||
if( EXISTS "${__stlLibPath}/libsupc++.a" )
|
if( EXISTS "${__stlLibPath}/libsupc++.a" )
|
||||||
__COPY_IF_DIFFERENT( "${__stlLibPath}/libsupc++.a" "${CMAKE_BINARY_DIR}/systemlibs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" )
|
__COPY_IF_DIFFERENT( "${__stlLibPath}/libsupc++.a" "${__ndklibspath}/libsupc++.a" )
|
||||||
elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libsupc++.a" )
|
elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libsupc++.a" )
|
||||||
__COPY_IF_DIFFERENT( "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libsupc++.a" "${CMAKE_BINARY_DIR}/systemlibs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" )
|
__COPY_IF_DIFFERENT( "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libsupc++.a" "${__ndklibspath}/libsupc++.a" )
|
||||||
elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libsupc++.a" )
|
elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libsupc++.a" )
|
||||||
__COPY_IF_DIFFERENT( "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libsupc++.a" "${CMAKE_BINARY_DIR}/systemlibs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" )
|
__COPY_IF_DIFFERENT( "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libsupc++.a" "${__ndklibspath}/libsupc++.a" )
|
||||||
elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libsupc++.a" )
|
elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libsupc++.a" )
|
||||||
__COPY_IF_DIFFERENT( "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libsupc++.a" "${CMAKE_BINARY_DIR}/systemlibs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" )
|
__COPY_IF_DIFFERENT( "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libsupc++.a" "${__ndklibspath}/libsupc++.a" )
|
||||||
elseif( EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libsupc++.a" )
|
elseif( EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libsupc++.a" )
|
||||||
__COPY_IF_DIFFERENT( "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libsupc++.a" "${CMAKE_BINARY_DIR}/systemlibs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" )
|
__COPY_IF_DIFFERENT( "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libsupc++.a" "${__ndklibspath}/libsupc++.a" )
|
||||||
endif()
|
endif()
|
||||||
if( EXISTS "${CMAKE_BINARY_DIR}/systemlibs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" )
|
if( EXISTS "${__ndklibspath}/libsupc++.a" )
|
||||||
set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -lsupc++" )
|
set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -lsupc++" )
|
||||||
endif()
|
endif()
|
||||||
endif( ANDROID_USE_STLPORT )
|
endif( ANDROID_USE_STLPORT )
|
||||||
@ -1038,13 +1042,14 @@ endmacro()
|
|||||||
# export toolchain settings for the try_compile() command
|
# export toolchain settings for the try_compile() command
|
||||||
if( NOT PROJECT_NAME STREQUAL "CMAKE_TRY_COMPILE" )
|
if( NOT PROJECT_NAME STREQUAL "CMAKE_TRY_COMPILE" )
|
||||||
set( __toolchain_config "")
|
set( __toolchain_config "")
|
||||||
foreach( __var ANDROID_ABI ANDROID_FORCE_ARM_BUILD ANDROID_NATIVE_API_LEVEL ANDROID_NO_UNDEFINED ANDROID_SO_UNDEFINED ANDROID_SET_OBSOLETE_VARIABLES LIBRARY_OUTPUT_PATH_ROOT ANDROID_USE_STLPORT ANDROID_FORBID_SYGWIN ANDROID_NDK ANDROID_STANDALONE_TOOLCHAIN ANDROID_FUNCTION_LEVEL_LINKING )
|
foreach( __var ANDROID_ABI ANDROID_FORCE_ARM_BUILD ANDROID_NATIVE_API_LEVEL ANDROID_NO_UNDEFINED ANDROID_SO_UNDEFINED ANDROID_SET_OBSOLETE_VARIABLES LIBRARY_OUTPUT_PATH_ROOT ANDROID_USE_STLPORT ANDROID_FORBID_SYGWIN ANDROID_NDK ANDROID_STANDALONE_TOOLCHAIN ANDROID_FUNCTION_LEVEL_LINKING __ndklibspath )
|
||||||
if( DEFINED ${__var} )
|
if( DEFINED ${__var} )
|
||||||
set( __toolchain_config "${__toolchain_config}set( ${__var} \"${${__var}}\" )\n" )
|
set( __toolchain_config "${__toolchain_config}set( ${__var} \"${${__var}}\" )\n" )
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
file( WRITE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/android.toolchain.config.cmake" "${__toolchain_config}" )
|
file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/android.toolchain.config.cmake" "${__toolchain_config}" )
|
||||||
unset( __toolchain_config )
|
unset( __toolchain_config )
|
||||||
|
unset( __ndklibspath )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
@ -1073,6 +1078,7 @@ endif()
|
|||||||
# Can be set only at the first run:
|
# Can be set only at the first run:
|
||||||
# ANDROID_NDK
|
# ANDROID_NDK
|
||||||
# ANDROID_STANDALONE_TOOLCHAIN
|
# ANDROID_STANDALONE_TOOLCHAIN
|
||||||
|
# ANDROID_TOOLCHAIN_NAME : "arm-linux-androideabi-4.4.3" or "arm-linux-androideabi-4.6" or "mipsel-linux-android-4.4.3" or "mipsel-linux-android-4.6" or "x86-4.4.3" or "x86-4.6"
|
||||||
# Obsolete:
|
# Obsolete:
|
||||||
# ANDROID_API_LEVEL : superseded by ANDROID_NATIVE_API_LEVEL
|
# ANDROID_API_LEVEL : superseded by ANDROID_NATIVE_API_LEVEL
|
||||||
# ARM_TARGET : superseded by ANDROID_ABI
|
# ARM_TARGET : superseded by ANDROID_ABI
|
||||||
@ -1105,7 +1111,6 @@ endif()
|
|||||||
# ANDROID_COMPILER_VERSION : GCC version used
|
# ANDROID_COMPILER_VERSION : GCC version used
|
||||||
# ANDROID_CXX_FLAGS : C/C++ compiler flags required by Android platform
|
# ANDROID_CXX_FLAGS : C/C++ compiler flags required by Android platform
|
||||||
# ANDROID_SUPPORTED_ABIS : list of currently allowed values for ANDROID_ABI
|
# ANDROID_SUPPORTED_ABIS : list of currently allowed values for ANDROID_ABI
|
||||||
# ANDROID_TOOLCHAIN_NAME : "standalone", "arm-linux-androideabi-4.4.3" or "x86-4.4.3" or something similar.
|
|
||||||
# ANDROID_TOOLCHAIN_MACHINE_NAME : "arm-linux-androideabi", "arm-eabi" or "i686-android-linux"
|
# ANDROID_TOOLCHAIN_MACHINE_NAME : "arm-linux-androideabi", "arm-eabi" or "i686-android-linux"
|
||||||
# ANDROID_TOOLCHAIN_ROOT : path to the top level of toolchain (standalone or placed inside NDK)
|
# ANDROID_TOOLCHAIN_ROOT : path to the top level of toolchain (standalone or placed inside NDK)
|
||||||
# ANDROID_SUPPORTED_NATIVE_API_LEVELS : list of native API levels found inside NDK
|
# ANDROID_SUPPORTED_NATIVE_API_LEVELS : list of native API levels found inside NDK
|
||||||
|
@ -1,125 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
cd `dirname $0`/..
|
|
||||||
|
|
||||||
ANDROID_DIR=`pwd`
|
|
||||||
|
|
||||||
rm -rf package
|
|
||||||
mkdir -p package
|
|
||||||
cd package
|
|
||||||
|
|
||||||
PRG_DIR=`pwd`
|
|
||||||
mkdir opencv
|
|
||||||
|
|
||||||
# neon-enabled build
|
|
||||||
#cd $PRG_DIR
|
|
||||||
#mkdir build-neon
|
|
||||||
#cd build-neon
|
|
||||||
|
|
||||||
#cmake -DANDROID_ABI="armeabi-v7a with NEON" -DBUILD_DOCS=OFF -DBUILD_TESTS=OFF -DBUILD_EXAMPLES=OFF -DBUILD_ANDROID_EXAMPLES=OFF -DCMAKE_TOOLCHAIN_FILE="$ANDROID_DIR/android.toolchain.cmake" -DCMAKE_INSTALL_PREFIX="$PRG_DIR/opencv" "$ANDROID_DIR/.." || exit 1
|
|
||||||
#make -j8 install/strip || exit 1
|
|
||||||
|
|
||||||
#cd "$PRG_DIR/opencv"
|
|
||||||
#rm -rf doc include src .classpath .project AndroidManifest.xml default.properties share/OpenCV/haarcascades share/OpenCV/lbpcascades share/OpenCV/*.cmake share/OpenCV/OpenCV.mk
|
|
||||||
#mv libs/armeabi-v7a libs/armeabi-v7a-neon
|
|
||||||
#mv share/OpenCV/3rdparty/libs/armeabi-v7a share/OpenCV/3rdparty/libs/armeabi-v7a-neon
|
|
||||||
|
|
||||||
|
|
||||||
# armeabi-v7a build
|
|
||||||
cd "$PRG_DIR"
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
|
|
||||||
cmake -DANDROID_ABI="armeabi-v7a" -DBUILD_DOCS=OFF -DBUILD_TESTS=ON -DBUILD_EXAMPLES=OFF -DBUILD_ANDROID_EXAMPLES=ON -DCMAKE_TOOLCHAIN_FILE="$ANDROID_DIR/android.toolchain.cmake" -DCMAKE_INSTALL_PREFIX="$PRG_DIR/opencv" "$ANDROID_DIR/.." || exit 1
|
|
||||||
make -j8 install/strip || exit 1
|
|
||||||
|
|
||||||
cd "$PRG_DIR/opencv"
|
|
||||||
rm -rf doc include src .classpath .project AndroidManifest.xml default.properties project.properties share/OpenCV/haarcascades share/OpenCV/lbpcascades share/OpenCV/*.cmake share/OpenCV/OpenCV.mk
|
|
||||||
|
|
||||||
|
|
||||||
# armeabi build
|
|
||||||
cd "$PRG_DIR/build"
|
|
||||||
rm -rf CMakeCache.txt
|
|
||||||
|
|
||||||
cmake -DANDROID_ABI="armeabi" -DBUILD_DOCS=ON -DBUILD_TESTS=ON -DBUILD_EXAMPLES=OFF -DBUILD_ANDROID_EXAMPLES=ON -DINSTALL_ANDROID_EXAMPLES=ON -DCMAKE_TOOLCHAIN_FILE="$ANDROID_DIR/android.toolchain.cmake" -DCMAKE_INSTALL_PREFIX="$PRG_DIR/opencv" "$ANDROID_DIR/.." || exit 1
|
|
||||||
make -j8 install/strip docs || exit 1
|
|
||||||
|
|
||||||
find doc -name "*.pdf" -exec cp {} $PRG_DIR/opencv/doc \;
|
|
||||||
|
|
||||||
cd $PRG_DIR
|
|
||||||
rm -rf opencv/doc/CMakeLists.txt
|
|
||||||
cp "$ANDROID_DIR/README.android" opencv/
|
|
||||||
cp "$ANDROID_DIR/../README" opencv/
|
|
||||||
|
|
||||||
|
|
||||||
# get opencv version
|
|
||||||
CV_VERSION=`grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+" opencv/share/OpenCV/OpenCVConfig-version.cmake`
|
|
||||||
OPENCV_NAME=OpenCV-$CV_VERSION
|
|
||||||
mv opencv $OPENCV_NAME
|
|
||||||
|
|
||||||
#samples
|
|
||||||
cp -r "$ANDROID_DIR/../samples/android" "$PRG_DIR/samples"
|
|
||||||
cd "$PRG_DIR/samples"
|
|
||||||
|
|
||||||
#enable for loops over items with spaces in their name
|
|
||||||
IFS="
|
|
||||||
"
|
|
||||||
for dir in `ls -1`
|
|
||||||
do
|
|
||||||
if [ -f "$dir/default.properties" ]
|
|
||||||
then
|
|
||||||
HAS_REFERENCE=`cat "$dir/project.properties" | grep -c android.library.reference.1`
|
|
||||||
if [ $HAS_REFERENCE = 1 ]
|
|
||||||
then
|
|
||||||
echo -n > "$dir/project.properties"
|
|
||||||
android update project --name "$dir" --target "android-8" --library "../../$OPENCV_NAME" --path "$dir"
|
|
||||||
#echo 'android update project --name "$dir" --target "android-8" --library "../opencv$CV_VERSION" --path "$dir"'
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if [ -f "$dir/default.properties" ]
|
|
||||||
then
|
|
||||||
HAS_REFERENCE=`cat "$dir/default.properties" | grep -c android.library.reference.1`
|
|
||||||
if [ $HAS_REFERENCE = 1 ]
|
|
||||||
then
|
|
||||||
echo -n > "$dir/default.properties"
|
|
||||||
android update project --name "$dir" --target "android-8" --library "../../$OPENCV_NAME" --path "$dir"
|
|
||||||
#echo 'android update project --name "$dir" --target "android-8" --library "../opencv$CV_VERSION" --path "$dir"'
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
rm -rf "$dir"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "OPENCV_MK_PATH:=../../$OPENCV_NAME/share/OpenCV/OpenCV.mk" > includeOpenCV.mk
|
|
||||||
|
|
||||||
|
|
||||||
#clean samples
|
|
||||||
cd "$PRG_DIR/samples"
|
|
||||||
#remove ignored files/folders
|
|
||||||
svn status --no-ignore | grep ^I | cut -c9- | xargs -d \\n rm -rf
|
|
||||||
#remove unversioned files/folders
|
|
||||||
svn status | grep ^\? | cut -c9- | xargs -d \\n rm -rf
|
|
||||||
|
|
||||||
|
|
||||||
#generate "gen" folders to eliminate eclipse warnings
|
|
||||||
cd "$PRG_DIR/samples"
|
|
||||||
for dir in `ls -1`
|
|
||||||
do
|
|
||||||
if [ -d "$dir" ]
|
|
||||||
then
|
|
||||||
mkdir "$dir/gen"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
#generate folders "gen" and "res" for opencv (dummy eclipse stiff)
|
|
||||||
cd $PRG_DIR
|
|
||||||
mkdir "$OPENCV_NAME/gen"
|
|
||||||
mkdir "$OPENCV_NAME/res"
|
|
||||||
|
|
||||||
# pack all files
|
|
||||||
cd $PRG_DIR
|
|
||||||
PRG_NAME=OpenCV-$CV_VERSION-tp-android-bin.tar.bz2
|
|
||||||
tar cjpf $PRG_NAME --exclude-vcs $OPENCV_NAME samples || exit -1
|
|
||||||
echo
|
|
||||||
echo "Package $PRG_NAME is successfully created"
|
|
@ -8,7 +8,7 @@ Loader Callback Interface
|
|||||||
Interface for callback object in case of asynchronous initialization of OpenCV
|
Interface for callback object in case of asynchronous initialization of OpenCV
|
||||||
|
|
||||||
void onManagerConnected()
|
void onManagerConnected()
|
||||||
------------------------
|
-------------------------
|
||||||
|
|
||||||
.. method:: void onManagerConnected(int status)
|
.. method:: void onManagerConnected(int status)
|
||||||
|
|
||||||
|
@ -2,8 +2,19 @@ if(APPLE)
|
|||||||
set(OPENCL_FOUND YES)
|
set(OPENCL_FOUND YES)
|
||||||
set(OPENCL_LIBRARIES "-framework OpenCL")
|
set(OPENCL_LIBRARIES "-framework OpenCL")
|
||||||
else()
|
else()
|
||||||
find_package(OpenCL QUIET)
|
#find_package(OpenCL QUIET)
|
||||||
|
if(WITH_OPENCLAMDFFT)
|
||||||
|
find_path(CLAMDFFT_INCLUDE_DIR
|
||||||
|
NAMES clAmdFft.h)
|
||||||
|
find_library(CLAMDFFT_LIBRARIES
|
||||||
|
NAMES clAmdFft.Runtime)
|
||||||
|
endif()
|
||||||
|
if(WITH_OPENCLAMDBLAS)
|
||||||
|
find_path(CLAMDBLAS_INCLUDE_DIR
|
||||||
|
NAMES clAmdBlas.h)
|
||||||
|
find_library(CLAMDBLAS_LIBRARIES
|
||||||
|
NAMES clAmdBlas)
|
||||||
|
endif()
|
||||||
# Try AMD/ATI Stream SDK
|
# Try AMD/ATI Stream SDK
|
||||||
if (NOT OPENCL_FOUND)
|
if (NOT OPENCL_FOUND)
|
||||||
set(ENV_AMDSTREAMSDKROOT $ENV{AMDAPPSDKROOT})
|
set(ENV_AMDSTREAMSDKROOT $ENV{AMDAPPSDKROOT})
|
||||||
|
@ -26,11 +26,11 @@ if(BUILD_PACKAGE)
|
|||||||
set(TAR_TRANSFORM "\"s,^,${TARBALL_NAME}/,\"")
|
set(TAR_TRANSFORM "\"s,^,${TARBALL_NAME}/,\"")
|
||||||
add_custom_target(package_source
|
add_custom_target(package_source
|
||||||
#TODO: maybe we should not remove dll's
|
#TODO: maybe we should not remove dll's
|
||||||
COMMAND ${TAR_CMD} --transform ${TAR_TRANSFORM} -cjpf ${CMAKE_CURRENT_BINARY_DIR}/${TARBALL_NAME}.tar.bz2 --exclude=".svn" --exclude="*.pyc" --exclude="*.vcproj" --exclude="*/lib/*" --exclude="*.dll" ./
|
COMMAND ${TAR_CMD} --transform ${TAR_TRANSFORM} -cjpf ${CMAKE_CURRENT_BINARY_DIR}/${TARBALL_NAME}.tar.bz2 --exclude=".svn" --exclude=".git" --exclude="*.pyc" --exclude="*.vcproj" --exclude="*/lib/*" --exclude="*.dll" ./
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
else()
|
else()
|
||||||
add_custom_target(package_source
|
add_custom_target(package_source
|
||||||
COMMAND zip -9 -r ${CMAKE_CURRENT_BINARY_DIR}/${TARBALL_NAME}.zip . -x '*/.svn/*' '*.vcproj' '*.pyc'
|
COMMAND zip -9 -r ${CMAKE_CURRENT_BINARY_DIR}/${TARBALL_NAME}.zip . -x '*/.svn/*' '*/.git/*' '*.vcproj' '*.pyc'
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
endif()
|
endif()
|
||||||
if(ENABLE_SOLUTION_FOLDERS)
|
if(ENABLE_SOLUTION_FOLDERS)
|
||||||
|
@ -175,6 +175,12 @@
|
|||||||
/* OpenCL Support */
|
/* OpenCL Support */
|
||||||
#cmakedefine HAVE_OPENCL
|
#cmakedefine HAVE_OPENCL
|
||||||
|
|
||||||
|
/* AMD's OpenCL Fast Fourier Transform Library*/
|
||||||
|
#cmakedefine HAVE_CLAMDFFT
|
||||||
|
|
||||||
|
/* AMD's Basic Linear Algebra Subprograms Library*/
|
||||||
|
#cmakedefine HAVE_CLAMDBLAS
|
||||||
|
|
||||||
/* NVidia Cuda Fast Fourier Transform (FFT) API*/
|
/* NVidia Cuda Fast Fourier Transform (FFT) API*/
|
||||||
#cmakedefine HAVE_CUFFT
|
#cmakedefine HAVE_CUFFT
|
||||||
|
|
||||||
|
@ -148,22 +148,22 @@
|
|||||||
%\texttt{\href{http://www.ros.org/wiki/Stack Manifest}{stack manifest}} & Description of a ROS stack.
|
%\texttt{\href{http://www.ros.org/wiki/Stack Manifest}{stack manifest}} & Description of a ROS stack.
|
||||||
%\end{tabular}
|
%\end{tabular}
|
||||||
|
|
||||||
\emph{The OpenCV C++ reference manual is here: \url{http://opencv.itseez.com}. Use \textbf{Quick Search} to find descriptions of the particular functions and classes}
|
\emph{The OpenCV C++ reference manual is here: \url{http://docs.opencv.org}. Use \textbf{Quick Search} to find descriptions of the particular functions and classes}
|
||||||
|
|
||||||
\section{Key OpenCV Classes}
|
\section{Key OpenCV Classes}
|
||||||
\begin{tabular}{@{}p{\the\MyLen}%
|
\begin{tabular}{@{}p{\the\MyLen}%
|
||||||
@{}p{\linewidth-\the\MyLen}@{}}
|
@{}p{\linewidth-\the\MyLen}@{}}
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#Point_}{Point\_}} & Template 2D point class \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Point_}{Point\_}} & Template 2D point class \\
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#Point3_}{Point3\_}} & Template 3D point class \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Point3_}{Point3\_}} & Template 3D point class \\
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#Size_}{Size\_}} & Template size (width, height) class \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Size_}{Size\_}} & Template size (width, height) class \\
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#Vec}{Vec}} & Template short vector class \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Vec}{Vec}} & Template short vector class \\
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#Matx}{Matx}} & Template small matrix class \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Matx}{Matx}} & Template small matrix class \\
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#Scalar_}{Scalar}} & 4-element vector \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Scalar_}{Scalar}} & 4-element vector \\
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#Rect_}{Rect}} & Rectangle \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Rect_}{Rect}} & Rectangle \\
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#Range}{Range}} & Integer value range \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Range}{Range}} & Integer value range \\
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#Mat}{Mat}} & 2D or multi-dimensional dense array (can be used to store matrices, images, histograms, feature descriptors, voxel volumes etc.)\\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Mat}{Mat}} & 2D or multi-dimensional dense array (can be used to store matrices, images, histograms, feature descriptors, voxel volumes etc.)\\
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#sparsemat}{SparseMat}} & Multi-dimensional sparse array \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#sparsemat}{SparseMat}} & Multi-dimensional sparse array \\
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#Ptr}{Ptr}} & Template smart pointer class
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Ptr}{Ptr}} & Template smart pointer class
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
|
|
||||||
\section{Matrix Basics}
|
\section{Matrix Basics}
|
||||||
@ -173,7 +173,7 @@
|
|||||||
\> \texttt{Mat image(240, 320, CV\_8UC3);} \\
|
\> \texttt{Mat image(240, 320, CV\_8UC3);} \\
|
||||||
|
|
||||||
\textbf{[Re]allocate a pre-declared matrix}\\
|
\textbf{[Re]allocate a pre-declared matrix}\\
|
||||||
\> \texttt{image.\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#mat-create}{create}(480, 640, CV\_8UC3);}\\
|
\> \texttt{image.\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-create}{create}(480, 640, CV\_8UC3);}\\
|
||||||
|
|
||||||
\textbf{Create a matrix initialized with a constant}\\
|
\textbf{Create a matrix initialized with a constant}\\
|
||||||
\> \texttt{Mat A33(3, 3, CV\_32F, Scalar(5));} \\
|
\> \texttt{Mat A33(3, 3, CV\_32F, Scalar(5));} \\
|
||||||
@ -189,8 +189,8 @@
|
|||||||
\> \texttt{Mat B22 = Mat(2, 2, CV\_32F, B22data).clone();}\\
|
\> \texttt{Mat B22 = Mat(2, 2, CV\_32F, B22data).clone();}\\
|
||||||
|
|
||||||
\textbf{Initialize a random matrix}\\
|
\textbf{Initialize a random matrix}\\
|
||||||
\> \texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#randu}{randu}(image, Scalar(0), Scalar(256)); }\textit{// uniform dist}\\
|
\> \texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#randu}{randu}(image, Scalar(0), Scalar(256)); }\textit{// uniform dist}\\
|
||||||
\> \texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#randn}{randn}(image, Scalar(128), Scalar(10)); }\textit{// Gaussian dist}\\
|
\> \texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#randn}{randn}(image, Scalar(128), Scalar(10)); }\textit{// Gaussian dist}\\
|
||||||
|
|
||||||
\textbf{Convert matrix to/from other structures}\\
|
\textbf{Convert matrix to/from other structures}\\
|
||||||
\>\textbf{(without copying the data)}\\
|
\>\textbf{(without copying the data)}\\
|
||||||
@ -230,32 +230,32 @@
|
|||||||
\section{Matrix Manipulations: Copying, Shuffling, Part Access}
|
\section{Matrix Manipulations: Copying, Shuffling, Part Access}
|
||||||
\begin{tabular}{@{}p{\the\MyLen}%
|
\begin{tabular}{@{}p{\the\MyLen}%
|
||||||
@{}p{\linewidth-\the\MyLen}@{}}
|
@{}p{\linewidth-\the\MyLen}@{}}
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#mat-copyto}{src.copyTo(dst)}} & Copy matrix to another one \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-copyto}{src.copyTo(dst)}} & Copy matrix to another one \\
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#mat-convertto}{src.convertTo(dst,type,scale,shift)}} & \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Scale and convert to another datatype \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-convertto}{src.convertTo(dst,type,scale,shift)}} & \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Scale and convert to another datatype \\
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#mat-clone}{m.clone()}} & Make deep copy of a matrix \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-clone}{m.clone()}} & Make deep copy of a matrix \\
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#mat-reshape}{m.reshape(nch,nrows)}} & Change matrix dimensions and/or number of channels without copying data \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-reshape}{m.reshape(nch,nrows)}} & Change matrix dimensions and/or number of channels without copying data \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#mat-row}{m.row(i)}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-row}{m.row(i)}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#mat-col}{m.col(i)}} & Take a matrix row/column \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-col}{m.col(i)}} & Take a matrix row/column \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#mat-rowrange}{m.rowRange(Range(i1,i2))}}
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-rowrange}{m.rowRange(Range(i1,i2))}}
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#mat-colrange}{m.colRange(Range(j1,j2))}} & \ \ \ \ \ \ \ Take a matrix row/column span \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-colrange}{m.colRange(Range(j1,j2))}} & \ \ \ \ \ \ \ Take a matrix row/column span \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#mat-diag}{m.diag(i)}} & Take a matrix diagonal \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#mat-diag}{m.diag(i)}} & Take a matrix diagonal \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#Mat}{m(Range(i1,i2),Range(j1,j2)), m(roi)}} & \ \ \ \ \ \ \ \ \ \ \ \ \ Take a submatrix \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#Mat}{m(Range(i1,i2),Range(j1,j2)), m(roi)}} & \ \ \ \ \ \ \ \ \ \ \ \ \ Take a submatrix \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#repeat}{m.repeat(ny,nx)}} & Make a bigger matrix from a smaller one \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#repeat}{m.repeat(ny,nx)}} & Make a bigger matrix from a smaller one \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#flip}{flip(src,dst,dir)}} & Reverse the order of matrix rows and/or columns \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#flip}{flip(src,dst,dir)}} & Reverse the order of matrix rows and/or columns \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#split}{split(...)}} & Split multi-channel matrix into separate channels \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#split}{split(...)}} & Split multi-channel matrix into separate channels \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#merge}{merge(...)}} & Make a multi-channel matrix out of the separate channels \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#merge}{merge(...)}} & Make a multi-channel matrix out of the separate channels \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#mixchannels}{mixChannels(...)}} & Generalized form of split() and merge() \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#mixchannels}{mixChannels(...)}} & Generalized form of split() and merge() \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#randshuffle}{randShuffle(...)}} & Randomly shuffle matrix elements \\
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#randshuffle}{randShuffle(...)}} & Randomly shuffle matrix elements \\
|
||||||
|
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
|
|
||||||
@ -278,17 +278,17 @@ other matrix operations, such as
|
|||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item
|
\item
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#add}{add()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#add}{add()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#subtract}{subtract()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#subtract}{subtract()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#multiply}{multiply()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#multiply}{multiply()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#divide}{divide()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#divide}{divide()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#absdiff}{absdiff()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#absdiff}{absdiff()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#bitwise-and}{bitwise\_and()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#bitwise-and}{bitwise\_and()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#bitwise-or}{bitwise\_or()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#bitwise-or}{bitwise\_or()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#bitwise-xor}{bitwise\_xor()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#bitwise-xor}{bitwise\_xor()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#max}{max()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#max}{max()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#min}{min()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#min}{min()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#compare}{compare()}}
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#compare}{compare()}}
|
||||||
|
|
||||||
-- correspondingly, addition, subtraction, element-wise multiplication ... comparison of two matrices or a matrix and a scalar.
|
-- correspondingly, addition, subtraction, element-wise multiplication ... comparison of two matrices or a matrix and a scalar.
|
||||||
|
|
||||||
@ -314,49 +314,49 @@ Exa\=mple. \href{http://en.wikipedia.org/wiki/Alpha_compositing}{Alpha compositi
|
|||||||
|
|
||||||
\item
|
\item
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#sum}{sum()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#sum}{sum()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#mean}{mean()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#mean}{mean()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#meanstddev}{meanStdDev()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#meanstddev}{meanStdDev()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#norm}{norm()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#norm}{norm()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#countnonzero}{countNonZero()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#countnonzero}{countNonZero()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#minmaxloc}{minMaxLoc()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#minmaxloc}{minMaxLoc()}},
|
||||||
|
|
||||||
-- various statistics of matrix elements.
|
-- various statistics of matrix elements.
|
||||||
|
|
||||||
\item
|
\item
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#exp}{exp()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#exp}{exp()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#log}{log()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#log}{log()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#pow}{pow()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#pow}{pow()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#sqrt}{sqrt()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#sqrt}{sqrt()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#carttopolar}{cartToPolar()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#carttopolar}{cartToPolar()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#polartocart}{polarToCart()}}
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#polartocart}{polarToCart()}}
|
||||||
|
|
||||||
-- the classical math functions.
|
-- the classical math functions.
|
||||||
|
|
||||||
\item
|
\item
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#scaleadd}{scaleAdd()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#scaleadd}{scaleAdd()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#transpose}{transpose()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#transpose}{transpose()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#gemm}{gemm()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#gemm}{gemm()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#invert}{invert()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#invert}{invert()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#solve}{solve()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#solve}{solve()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#determinant}{determinant()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#determinant}{determinant()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#trace}{trace()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#trace}{trace()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#eigen}{eigen()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#eigen}{eigen()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#SVD}{SVD}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#SVD}{SVD}},
|
||||||
|
|
||||||
-- the algebraic functions + SVD class.
|
-- the algebraic functions + SVD class.
|
||||||
|
|
||||||
\item
|
\item
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#dft}{dft()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#dft}{dft()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#idft}{idft()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#idft}{idft()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#dct}{dct()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#dct}{dct()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html\#idct}{idct()}},
|
\texttt{\href{http://docs.opencv.org/modules/core/doc/operations_on_arrays.html\#idct}{idct()}},
|
||||||
|
|
||||||
-- discrete Fourier and cosine transformations
|
-- discrete Fourier and cosine transformations
|
||||||
|
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
For some operations a more convenient \href{http://opencv.itseez.com/modules/core/doc/basic_structures.html\#matrix-expressions}{algebraic notation} can be used, for example:
|
For some operations a more convenient \href{http://docs.opencv.org/modules/core/doc/basic_structures.html\#matrix-expressions}{algebraic notation} can be used, for example:
|
||||||
\begin{tabbing}
|
\begin{tabbing}
|
||||||
\texttt{Mat}\={} \texttt{delta = (J.t()*J + lambda*}\\
|
\texttt{Mat}\={} \texttt{delta = (J.t()*J + lambda*}\\
|
||||||
\>\texttt{Mat::eye(J.cols, J.cols, J.type()))}\\
|
\>\texttt{Mat::eye(J.cols, J.cols, J.type()))}\\
|
||||||
@ -370,20 +370,20 @@ implements the core of Levenberg-Marquardt optimization algorithm.
|
|||||||
|
|
||||||
\begin{tabular}{@{}p{\the\MyLen}%
|
\begin{tabular}{@{}p{\the\MyLen}%
|
||||||
@{}p{\linewidth-\the\MyLen}@{}}
|
@{}p{\linewidth-\the\MyLen}@{}}
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/filtering.html\#filter2d}{filter2D()}} & Non-separable linear filter \\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#filter2d}{filter2D()}} & Non-separable linear filter \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/filtering.html\#sepfilter2d}{sepFilter2D()}} & Separable linear filter \\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#sepfilter2d}{sepFilter2D()}} & Separable linear filter \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/filtering.html\#blur}{boxFilter()}}, \texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/filtering.html\#gaussianblur}{GaussianBlur()}},
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#blur}{boxFilter()}}, \texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#gaussianblur}{GaussianBlur()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/filtering.html\#medianblur}{medianBlur()}},
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#medianblur}{medianBlur()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/filtering.html\#bilateralfilter}{bilateralFilter()}}
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#bilateralfilter}{bilateralFilter()}}
|
||||||
& Smooth the image with one of the linear or non-linear filters \\
|
& Smooth the image with one of the linear or non-linear filters \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/filtering.html\#sobel}{Sobel()}}, \texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/filtering.html\#scharr}{Scharr()}}
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#sobel}{Sobel()}}, \texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#scharr}{Scharr()}}
|
||||||
& Compute the spatial image derivatives \\
|
& Compute the spatial image derivatives \\
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/filtering.html\#laplacian}{Laplacian()}} & compute Laplacian: $\Delta I = \frac{\partial ^ 2 I}{\partial x^2} + \frac{\partial ^ 2 I}{\partial y^2}$ \\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#laplacian}{Laplacian()}} & compute Laplacian: $\Delta I = \frac{\partial ^ 2 I}{\partial x^2} + \frac{\partial ^ 2 I}{\partial y^2}$ \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/filtering.html\#erode}{erode()}}, \texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/filtering.html\#dilate}{dilate()}} & Morphological operations \\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#erode}{erode()}}, \texttt{\href{http://docs.opencv.org/modules/imgproc/doc/filtering.html\#dilate}{dilate()}} & Morphological operations \\
|
||||||
|
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
|
|
||||||
@ -398,17 +398,17 @@ Exa\=mple. Filter image in-place with a 3x3 high-pass kernel\\
|
|||||||
|
|
||||||
\begin{tabular}{@{}p{\the\MyLen}%
|
\begin{tabular}{@{}p{\the\MyLen}%
|
||||||
@{}p{\linewidth-\the\MyLen}@{}}
|
@{}p{\linewidth-\the\MyLen}@{}}
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/geometric_transformations.html\#resize}{resize()}} & Resize image \\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html\#resize}{resize()}} & Resize image \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/geometric_transformations.html\#getrectsubpix}{getRectSubPix()}} & Extract an image patch \\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html\#getrectsubpix}{getRectSubPix()}} & Extract an image patch \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/geometric_transformations.html\#warpaffine}{warpAffine()}} & Warp image affinely\\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html\#warpaffine}{warpAffine()}} & Warp image affinely\\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/geometric_transformations.html\#warpperspective}{warpPerspective()}} & Warp image perspectively\\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html\#warpperspective}{warpPerspective()}} & Warp image perspectively\\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/geometric_transformations.html\#remap}{remap()}} & Generic image warping\\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html\#remap}{remap()}} & Generic image warping\\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/geometric_transformations.html\#convertmaps}{convertMaps()}} & Optimize maps for a faster remap() execution\\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html\#convertmaps}{convertMaps()}} & Optimize maps for a faster remap() execution\\
|
||||||
|
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
|
|
||||||
@ -422,21 +422,21 @@ Example. Decimate image by factor of $\sqrt{2}$:\\
|
|||||||
\begin{tabular}{@{}p{\the\MyLen}%
|
\begin{tabular}{@{}p{\the\MyLen}%
|
||||||
@{}p{\linewidth-\the\MyLen}@{}}
|
@{}p{\linewidth-\the\MyLen}@{}}
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/miscellaneous_transformations.html\#cvtcolor}{cvtColor()}} & Convert image from one color space to another \\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#cvtcolor}{cvtColor()}} & Convert image from one color space to another \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/miscellaneous_transformations.html\#threshold}{threshold()}}, \texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/miscellaneous_transformations.html\#adaptivethreshold}{adaptivethreshold()}} & Convert grayscale image to binary image using a fixed or a variable threshold \\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#threshold}{threshold()}}, \texttt{\href{http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#adaptivethreshold}{adaptivethreshold()}} & Convert grayscale image to binary image using a fixed or a variable threshold \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/miscellaneous_transformations.html\#floodfill}{floodFill()}} & Find a connected component using region growing algorithm\\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#floodfill}{floodFill()}} & Find a connected component using region growing algorithm\\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/miscellaneous_transformations.html\#integral}{integral()}} & Compute integral image \\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#integral}{integral()}} & Compute integral image \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/miscellaneous_transformations.html\#distancetransform}{distanceTransform()}}
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#distancetransform}{distanceTransform()}}
|
||||||
& build distance map or discrete Voronoi diagram for a binary image. \\
|
& build distance map or discrete Voronoi diagram for a binary image. \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/miscellaneous_transformations.html\#watershed}{watershed()}},
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#watershed}{watershed()}},
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/miscellaneous_transformations.html\#grabcut}{grabCut()}}
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#grabcut}{grabCut()}}
|
||||||
& marker-based image segmentation algorithms.
|
& marker-based image segmentation algorithms.
|
||||||
See the samples \texttt{\href{http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/watershed.cpp}{watershed.cpp}} and \texttt{\href{http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/grabcut.cpp}{grabcut.cpp}}.
|
See the samples \texttt{\href{http://code.opencv.org/projects/opencv/repository/revisions/master/entry/samples/cpp/watershed.cpp}{watershed.cpp}} and \texttt{\href{http://code.opencv.org/projects/opencv/repository/revisions/master/entry/samples/cpp/grabcut.cpp}{grabcut.cpp}}.
|
||||||
|
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
|
|
||||||
@ -445,13 +445,13 @@ Example. Decimate image by factor of $\sqrt{2}$:\\
|
|||||||
\begin{tabular}{@{}p{\the\MyLen}%
|
\begin{tabular}{@{}p{\the\MyLen}%
|
||||||
@{}p{\linewidth-\the\MyLen}@{}}
|
@{}p{\linewidth-\the\MyLen}@{}}
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/histograms.html\#calchist}{calcHist()}} & Compute image(s) histogram \\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/histograms.html\#calchist}{calcHist()}} & Compute image(s) histogram \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/histograms.html\#calcbackproject}{calcBackProject()}} & Back-project the histogram \\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/histograms.html\#calcbackproject}{calcBackProject()}} & Back-project the histogram \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/histograms.html\#equalizehist}{equalizeHist()}} & Normalize image brightness and contrast\\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/histograms.html\#equalizehist}{equalizeHist()}} & Normalize image brightness and contrast\\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/histograms.html\#comparehist}{compareHist()}} & Compare two histograms\\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/histograms.html\#comparehist}{compareHist()}} & Compare two histograms\\
|
||||||
|
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
|
|
||||||
@ -464,12 +464,12 @@ Example. Compute Hue-Saturation histogram of an image:\\
|
|||||||
\end{tabbing}
|
\end{tabbing}
|
||||||
|
|
||||||
\subsection{Contours}
|
\subsection{Contours}
|
||||||
See \texttt{\href{http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/contours2.cpp}{contours2.cpp}} and \texttt{\href{http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/squares.cpp}{squares.cpp}}
|
See \texttt{\href{http://code.opencv.org/projects/opencv/repository/revisions/master/entry/samples/cpp/contours2.cpp}{contours2.cpp}} and \texttt{\href{http://code.opencv.org/projects/opencv/repository/revisions/master/entry/samples/cpp/squares.cpp}{squares.cpp}}
|
||||||
samples on what are the contours and how to use them.
|
samples on what are the contours and how to use them.
|
||||||
|
|
||||||
\section{Data I/O}
|
\section{Data I/O}
|
||||||
|
|
||||||
\href{http://opencv.itseez.com/modules/core/doc/xml_yaml_persistence.html\#xml-yaml-file-storages-writing-to-a-file-storage}{XML/YAML storages} are collections (possibly nested) of scalar values, structures and heterogeneous lists.
|
\href{http://docs.opencv.org/modules/core/doc/xml_yaml_persistence.html\#xml-yaml-file-storages-writing-to-a-file-storage}{XML/YAML storages} are collections (possibly nested) of scalar values, structures and heterogeneous lists.
|
||||||
|
|
||||||
\begin{tabbing}
|
\begin{tabbing}
|
||||||
\textbf{Wr}\=\textbf{iting data to YAML (or XML)}\\
|
\textbf{Wr}\=\textbf{iting data to YAML (or XML)}\\
|
||||||
@ -521,9 +521,9 @@ samples on what are the contours and how to use them.
|
|||||||
|
|
||||||
\begin{tabbing}
|
\begin{tabbing}
|
||||||
\textbf{Wr}\=\textbf{iting and reading raster images}\\
|
\textbf{Wr}\=\textbf{iting and reading raster images}\\
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/highgui/doc/reading_and_writing_images_and_video.html\#imwrite}{imwrite}("myimage.jpg", image);}\\
|
\texttt{\href{http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html\#imwrite}{imwrite}("myimage.jpg", image);}\\
|
||||||
\texttt{Mat image\_color\_copy = \href{http://opencv.itseez.com/modules/highgui/doc/reading_and_writing_images_and_video.html\#imread}{imread}("myimage.jpg", 1);}\\
|
\texttt{Mat image\_color\_copy = \href{http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html\#imread}{imread}("myimage.jpg", 1);}\\
|
||||||
\texttt{Mat image\_grayscale\_copy = \href{http://opencv.itseez.com/modules/highgui/doc/reading_and_writing_images_and_video.html\#imread}{imread}("myimage.jpg", 0);}\\
|
\texttt{Mat image\_grayscale\_copy = \href{http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html\#imread}{imread}("myimage.jpg", 0);}\\
|
||||||
\end{tabbing}
|
\end{tabbing}
|
||||||
|
|
||||||
\emph{The functions can read/write images in the following formats: \textbf{BMP (.bmp), JPEG (.jpg, .jpeg), TIFF (.tif, .tiff), PNG (.png), PBM/PGM/PPM (.p?m), Sun Raster (.sr), JPEG 2000 (.jp2)}. Every format supports 8-bit, 1- or 3-channel images. Some formats (PNG, JPEG 2000) support 16 bits per channel.}
|
\emph{The functions can read/write images in the following formats: \textbf{BMP (.bmp), JPEG (.jpg, .jpeg), TIFF (.tif, .tiff), PNG (.png), PBM/PGM/PPM (.p?m), Sun Raster (.sr), JPEG 2000 (.jp2)}. Every format supports 8-bit, 1- or 3-channel images. Some formats (PNG, JPEG 2000) support 16 bits per channel.}
|
||||||
@ -544,61 +544,61 @@ samples on what are the contours and how to use them.
|
|||||||
\begin{tabular}{@{}p{\the\MyLen}%
|
\begin{tabular}{@{}p{\the\MyLen}%
|
||||||
@{}p{\linewidth-\the\MyLen}@{}}
|
@{}p{\linewidth-\the\MyLen}@{}}
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/highgui/doc/user_interface.html\#namedwindow}{namedWindow(winname,flags)}} & \ \ \ \ \ \ \ \ \ \ Create named highgui window \\
|
\texttt{\href{http://docs.opencv.org/modules/highgui/doc/user_interface.html\#namedwindow}{namedWindow(winname,flags)}} & \ \ \ \ \ \ \ \ \ \ Create named highgui window \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/highgui/doc/user_interface.html\#destroywindow}{destroyWindow(winname)}} & \ \ \ Destroy the specified window \\
|
\texttt{\href{http://docs.opencv.org/modules/highgui/doc/user_interface.html\#destroywindow}{destroyWindow(winname)}} & \ \ \ Destroy the specified window \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/highgui/doc/user_interface.html\#imshow}{imshow(winname, mtx)}} & Show image in the window \\
|
\texttt{\href{http://docs.opencv.org/modules/highgui/doc/user_interface.html\#imshow}{imshow(winname, mtx)}} & Show image in the window \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/highgui/doc/user_interface.html\#waitkey}{waitKey(delay)}} & Wait for a key press during the specified time interval (or forever). Process events while waiting. \emph{Do not forget to call this function several times a second in your code.} \\
|
\texttt{\href{http://docs.opencv.org/modules/highgui/doc/user_interface.html\#waitkey}{waitKey(delay)}} & Wait for a key press during the specified time interval (or forever). Process events while waiting. \emph{Do not forget to call this function several times a second in your code.} \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/highgui/doc/user_interface.html\#createtrackbar}{createTrackbar(...)}} & Add trackbar (slider) to the specified window \\
|
\texttt{\href{http://docs.opencv.org/modules/highgui/doc/user_interface.html\#createtrackbar}{createTrackbar(...)}} & Add trackbar (slider) to the specified window \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/highgui/doc/user_interface.html\#setmousecallback}{setMouseCallback(...)}} & \ \ Set the callback on mouse clicks and movements in the specified window \\
|
\texttt{\href{http://docs.opencv.org/modules/highgui/doc/user_interface.html\#setmousecallback}{setMouseCallback(...)}} & \ \ Set the callback on mouse clicks and movements in the specified window \\
|
||||||
|
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
|
|
||||||
See \texttt{\href{http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/camshiftdemo.cpp}{camshiftdemo.cpp}} and other \href{http://code.opencv.org/svn/opencv/trunk/opencv/samples/}{OpenCV samples} on how to use the GUI functions.
|
See \texttt{\href{http://code.opencv.org/projects/opencv/repository/revisions/master/entry/samples/cpp/camshiftdemo.cpp}{camshiftdemo.cpp}} and other \href{http://code.opencv.org/projects/opencv/repository/revisions/master/entry/samples/}{OpenCV samples} on how to use the GUI functions.
|
||||||
|
|
||||||
\section{Camera Calibration, Pose Estimation and Depth Estimation}
|
\section{Camera Calibration, Pose Estimation and Depth Estimation}
|
||||||
|
|
||||||
\begin{tabular}{@{}p{\the\MyLen}%
|
\begin{tabular}{@{}p{\the\MyLen}%
|
||||||
@{}p{\linewidth-\the\MyLen}@{}}
|
@{}p{\linewidth-\the\MyLen}@{}}
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#calibratecamera}{calibrateCamera()}} & Calibrate camera from several views of a calibration pattern. \\
|
\texttt{\href{http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#calibratecamera}{calibrateCamera()}} & Calibrate camera from several views of a calibration pattern. \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#findchessboardcorners}{findChessboardCorners()}} & \ \ \ \ \ \ Find feature points on the checkerboard calibration pattern. \\
|
\texttt{\href{http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#findchessboardcorners}{findChessboardCorners()}} & \ \ \ \ \ \ Find feature points on the checkerboard calibration pattern. \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#solvepnp}{solvePnP()}} & Find the object pose from the known projections of its feature points. \\
|
\texttt{\href{http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#solvepnp}{solvePnP()}} & Find the object pose from the known projections of its feature points. \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#stereocalibrate}{stereoCalibrate()}} & Calibrate stereo camera. \\
|
\texttt{\href{http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#stereocalibrate}{stereoCalibrate()}} & Calibrate stereo camera. \\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#stereorectify}{stereoRectify()}} & Compute the rectification transforms for a calibrated stereo camera.\\
|
\texttt{\href{http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#stereorectify}{stereoRectify()}} & Compute the rectification transforms for a calibrated stereo camera.\\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/geometric_transformations.html\#initundistortrectifymap}{initUndistortRectifyMap()}} & \ \ \ \ \ \ Compute rectification map (for \texttt{remap()}) for each stereo camera head.\\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html\#initundistortrectifymap}{initUndistortRectifyMap()}} & \ \ \ \ \ \ Compute rectification map (for \texttt{remap()}) for each stereo camera head.\\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#StereoBM}{StereoBM}}, \texttt{\href{http://opencv.itseez.com/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#StereoSGBM}{StereoSGBM}} & The stereo correspondence engines to be run on rectified stereo pairs.\\
|
\texttt{\href{http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#StereoBM}{StereoBM}}, \texttt{\href{http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#StereoSGBM}{StereoSGBM}} & The stereo correspondence engines to be run on rectified stereo pairs.\\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#reprojectimageto3d}{reprojectImageTo3D()}} & Convert disparity map to 3D point cloud.\\
|
\texttt{\href{http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#reprojectimageto3d}{reprojectImageTo3D()}} & Convert disparity map to 3D point cloud.\\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#findhomography}{findHomography()}} & Find best-fit perspective transformation between two 2D point sets. \\
|
\texttt{\href{http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html\#findhomography}{findHomography()}} & Find best-fit perspective transformation between two 2D point sets. \\
|
||||||
|
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
|
|
||||||
To calibrate a camera, you can use \texttt{\href{http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/calibration.cpp}{calibration.cpp}} or
|
To calibrate a camera, you can use \texttt{\href{http://code.opencv.org/projects/opencv/repository/revisions/master/entry/samples/cpp/calibration.cpp}{calibration.cpp}} or
|
||||||
\texttt{\href{http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/stereo\_calib.cpp}{stereo\_calib.cpp}} samples.
|
\texttt{\href{http://code.opencv.org/projects/opencv/repository/revisions/master/entry/samples/cpp/stereo\_calib.cpp}{stereo\_calib.cpp}} samples.
|
||||||
To get the disparity maps and the point clouds, use
|
To get the disparity maps and the point clouds, use
|
||||||
\texttt{\href{http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/stereo\_match.cpp}{stereo\_match.cpp}} sample.
|
\texttt{\href{http://code.opencv.org/projects/opencv/repository/revisions/master/entry/samples/cpp/stereo\_match.cpp}{stereo\_match.cpp}} sample.
|
||||||
|
|
||||||
\section{Object Detection}
|
\section{Object Detection}
|
||||||
|
|
||||||
\begin{tabular}{@{}p{\the\MyLen}%
|
\begin{tabular}{@{}p{\the\MyLen}%
|
||||||
@{}p{\linewidth-\the\MyLen}@{}}
|
@{}p{\linewidth-\the\MyLen}@{}}
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/imgproc/doc/object_detection.html\#matchtemplate}{matchTemplate}} & Compute proximity map for given template.\\
|
\texttt{\href{http://docs.opencv.org/modules/imgproc/doc/object_detection.html\#matchtemplate}{matchTemplate}} & Compute proximity map for given template.\\
|
||||||
|
|
||||||
\texttt{\href{http://opencv.itseez.com/modules/objdetect/doc/cascade_classification.html\#cascadeclassifier}{CascadeClassifier}} & Viola's Cascade of Boosted classifiers using Haar or LBP features. Suits for detecting faces, facial features and some other objects without diverse textures. See \texttt{\href{http://code.opencv.org/svn/opencv/trunk/opencv/samples/c/facedetect.cpp}{facedetect.cpp}}\\
|
\texttt{\href{http://docs.opencv.org/modules/objdetect/doc/cascade_classification.html\#cascadeclassifier}{CascadeClassifier}} & Viola's Cascade of Boosted classifiers using Haar or LBP features. Suits for detecting faces, facial features and some other objects without diverse textures. See \texttt{\href{http://code.opencv.org/projects/opencv/repository/revisions/master/entry/samples/c/facedetect.cpp}{facedetect.cpp}}\\
|
||||||
|
|
||||||
\texttt{{HOGDescriptor}} & N. Dalal's object detector using Histogram-of-Oriented-Gradients (HOG) features. Suits for detecting people, cars and other objects with well-defined silhouettes. See \texttt{\href{http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/peopledetect.cpp}{peopledetect.cpp}}\\
|
\texttt{{HOGDescriptor}} & N. Dalal's object detector using Histogram-of-Oriented-Gradients (HOG) features. Suits for detecting people, cars and other objects with well-defined silhouettes. See \texttt{\href{http://code.opencv.org/projects/opencv/repository/revisions/master/entry/samples/cpp/peopledetect.cpp}{peopledetect.cpp}}\\
|
||||||
|
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ Scalar
|
|||||||
|
|
||||||
Code
|
Code
|
||||||
=====
|
=====
|
||||||
* This code is in your OpenCV sample folder. Otherwise you can grab it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/core/Matrix/Drawing_1.cpp>`_
|
* This code is in your OpenCV sample folder. Otherwise you can grab it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/core/Matrix/Drawing_1.cpp>`_
|
||||||
|
|
||||||
Explanation
|
Explanation
|
||||||
=============
|
=============
|
||||||
|
@ -22,7 +22,7 @@ Code
|
|||||||
|
|
||||||
* In this tutorial, we intend to use *random* values for the drawing parameters. Also, we intend to populate our image with a big number of geometric figures. Since we will be initializing them in a random fashion, this process will be automatic and made by using *loops* .
|
* In this tutorial, we intend to use *random* values for the drawing parameters. Also, we intend to populate our image with a big number of geometric figures. Since we will be initializing them in a random fashion, this process will be automatic and made by using *loops* .
|
||||||
|
|
||||||
* This code is in your OpenCV sample folder. Otherwise you can grab it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/core/Matrix/Drawing_2.cpp>`_ .
|
* This code is in your OpenCV sample folder. Otherwise you can grab it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/core/Matrix/Drawing_2.cpp>`_ .
|
||||||
|
|
||||||
Explanation
|
Explanation
|
||||||
============
|
============
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
.. |Author_BernatG| unicode:: Bern U+00E1 t U+0020 G U+00E1 bor
|
.. |Author_BernatG| unicode:: Bern U+00E1 t U+0020 G U+00E1 bor
|
||||||
.. |Author_AndreyK| unicode:: Andrey U+0020 Kamaev
|
.. |Author_AndreyK| unicode:: Andrey U+0020 Kamaev
|
||||||
.. |Author_LeonidBLB| unicode:: Leonid U+0020 Beynenson
|
.. |Author_LeonidBLB| unicode:: Leonid U+0020 Beynenson
|
||||||
|
.. |Author_VsevolodG| unicode:: Vsevolod U+0020 Glumov
|
||||||
.. |Author_VictorE| unicode:: Victor U+0020 Eruhimov
|
.. |Author_VictorE| unicode:: Victor U+0020 Eruhimov
|
||||||
.. |Author_ArtemM| unicode:: Artem U+0020 Myagkov
|
.. |Author_ArtemM| unicode:: Artem U+0020 Myagkov
|
||||||
.. |Author_FernandoI| unicode:: Fernando U+0020 Iglesias U+0020 Garc U+00ED a
|
.. |Author_FernandoI| unicode:: Fernando U+0020 Iglesias U+0020 Garc U+00ED a
|
||||||
|
@ -23,7 +23,7 @@ Theory
|
|||||||
Code
|
Code
|
||||||
====
|
====
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/features2D/SURF_descriptor.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/features2D/SURF_descriptor.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ Theory
|
|||||||
Code
|
Code
|
||||||
====
|
====
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/features2D/SURF_detector.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/features2D/SURF_detector.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ Theory
|
|||||||
Code
|
Code
|
||||||
====
|
====
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/features2D/SURF_FlannMatcher.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/features2D/SURF_FlannMatcher.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ Theory
|
|||||||
Code
|
Code
|
||||||
====
|
====
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/features2D/SURF_Homography.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/features2D/SURF_Homography.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ Theory
|
|||||||
Code
|
Code
|
||||||
====
|
====
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/TrackingMotion/cornerSubPix_Demo.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/TrackingMotion/cornerSubPix_Demo.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ Theory
|
|||||||
Code
|
Code
|
||||||
====
|
====
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/TrackingMotion/cornerDetector_Demo.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/TrackingMotion/cornerDetector_Demo.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ Theory
|
|||||||
Code
|
Code
|
||||||
====
|
====
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/TrackingMotion/goodFeaturesToTrack_Demo.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/TrackingMotion/goodFeaturesToTrack_Demo.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -151,7 +151,7 @@ How does it work?
|
|||||||
Code
|
Code
|
||||||
====
|
====
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/TrackingMotion/cornerHarris_Demo.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/TrackingMotion/cornerHarris_Demo.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ Erosion
|
|||||||
Code
|
Code
|
||||||
======
|
======
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ImgProc/Morphology_1.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ImgProc/Morphology_1.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ Code
|
|||||||
* Applies 4 different kinds of filters (explained in Theory) and show the filtered images sequentially
|
* Applies 4 different kinds of filters (explained in Theory) and show the filtered images sequentially
|
||||||
|
|
||||||
* **Downloadable code**:
|
* **Downloadable code**:
|
||||||
Click `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ImgProc/Smoothing.cpp>`_
|
Click `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ImgProc/Smoothing.cpp>`_
|
||||||
|
|
||||||
* **Code at glance:**
|
* **Code at glance:**
|
||||||
|
|
||||||
|
@ -99,9 +99,9 @@ Code
|
|||||||
|
|
||||||
* **Downloadable code**:
|
* **Downloadable code**:
|
||||||
|
|
||||||
a. Click `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/Histograms_Matching/calcBackProject_Demo1.cpp>`_ for the basic version (explained in this tutorial).
|
a. Click `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/Histograms_Matching/calcBackProject_Demo1.cpp>`_ for the basic version (explained in this tutorial).
|
||||||
b. For stuff slightly fancier (using H-S histograms and floodFill to define a mask for the skin area) you can check the `improved demo <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/Histograms_Matching/calcBackProject_Demo2.cpp>`_
|
b. For stuff slightly fancier (using H-S histograms and floodFill to define a mask for the skin area) you can check the `improved demo <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/Histograms_Matching/calcBackProject_Demo2.cpp>`_
|
||||||
c. ...or you can always check out the classical `camshiftdemo <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/camshiftdemo.cpp>`_ in samples.
|
c. ...or you can always check out the classical `camshiftdemo <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/camshiftdemo.cpp>`_ in samples.
|
||||||
|
|
||||||
* **Code at glance:**
|
* **Code at glance:**
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ Code
|
|||||||
* Plot the three histograms in a window
|
* Plot the three histograms in a window
|
||||||
|
|
||||||
* **Downloadable code**:
|
* **Downloadable code**:
|
||||||
Click `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/Histograms_Matching/calcHist_Demo.cpp>`_
|
Click `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/Histograms_Matching/calcHist_Demo.cpp>`_
|
||||||
|
|
||||||
* **Code at glance:**
|
* **Code at glance:**
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ Code
|
|||||||
* Display the numerical matching parameters obtained.
|
* Display the numerical matching parameters obtained.
|
||||||
|
|
||||||
* **Downloadable code**:
|
* **Downloadable code**:
|
||||||
Click `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/Histograms_Matching/compareHist_Demo.cpp>`_
|
Click `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/Histograms_Matching/compareHist_Demo.cpp>`_
|
||||||
|
|
||||||
* **Code at glance:**
|
* **Code at glance:**
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ Code
|
|||||||
* Display the source and equalized images in a window.
|
* Display the source and equalized images in a window.
|
||||||
|
|
||||||
* **Downloadable code**:
|
* **Downloadable code**:
|
||||||
Click `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/Histograms_Matching/EqualizeHist_Demo.cpp>`_
|
Click `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/Histograms_Matching/EqualizeHist_Demo.cpp>`_
|
||||||
|
|
||||||
* **Code at glance:**
|
* **Code at glance:**
|
||||||
|
|
||||||
|
@ -125,7 +125,7 @@ Code
|
|||||||
* Draw a rectangle around the area corresponding to the highest match
|
* Draw a rectangle around the area corresponding to the highest match
|
||||||
|
|
||||||
* **Downloadable code**:
|
* **Downloadable code**:
|
||||||
Click `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/Histograms_Matching/MatchTemplate_Demo.cpp>`_
|
Click `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/Histograms_Matching/MatchTemplate_Demo.cpp>`_
|
||||||
|
|
||||||
* **Code at glance:**
|
* **Code at glance:**
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ Code
|
|||||||
* Applies the *Canny Detector* and generates a **mask** (bright lines representing the edges on a black background).
|
* Applies the *Canny Detector* and generates a **mask** (bright lines representing the edges on a black background).
|
||||||
* Applies the mask obtained on the original image and display it in a window.
|
* Applies the mask obtained on the original image and display it in a window.
|
||||||
|
|
||||||
#. The tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ImgTrans/CannyDetector_Demo.cpp>`_
|
#. The tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ImgTrans/CannyDetector_Demo.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ Code
|
|||||||
The user chooses either option by pressing 'c' (constant) or 'r' (replicate)
|
The user chooses either option by pressing 'c' (constant) or 'r' (replicate)
|
||||||
* The program finishes when the user presses 'ESC'
|
* The program finishes when the user presses 'ESC'
|
||||||
|
|
||||||
#. The tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp>`_
|
#. The tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ImgTrans/copyMakeBorder_demo.cpp>`_
|
||||||
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
@ -72,7 +72,7 @@ Code
|
|||||||
|
|
||||||
* The filter output (with each kernel) will be shown during 500 milliseconds
|
* The filter output (with each kernel) will be shown during 500 milliseconds
|
||||||
|
|
||||||
#. The tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ImgTrans/filter2D_demo.cpp>`_
|
#. The tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ImgTrans/filter2D_demo.cpp>`_
|
||||||
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
@ -40,9 +40,9 @@ Code
|
|||||||
* Display the detected circle in a window.
|
* Display the detected circle in a window.
|
||||||
|
|
||||||
.. |TutorialHoughCirclesSimpleDownload| replace:: here
|
.. |TutorialHoughCirclesSimpleDownload| replace:: here
|
||||||
.. _TutorialHoughCirclesSimpleDownload: http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/houghlines.cpp
|
.. _TutorialHoughCirclesSimpleDownload: http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/houghlines.cpp
|
||||||
.. |TutorialHoughCirclesFancyDownload| replace:: here
|
.. |TutorialHoughCirclesFancyDownload| replace:: here
|
||||||
.. _TutorialHoughCirclesFancyDownload: http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ImgTrans/HoughCircle_Demo.cpp
|
.. _TutorialHoughCirclesFancyDownload: http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ImgTrans/HoughCircle_Demo.cpp
|
||||||
|
|
||||||
#. The sample code that we will explain can be downloaded from |TutorialHoughCirclesSimpleDownload|_. A slightly fancier version (which shows both Hough standard and probabilistic with trackbars for changing the threshold values) can be found |TutorialHoughCirclesFancyDownload|_.
|
#. The sample code that we will explain can be downloaded from |TutorialHoughCirclesSimpleDownload|_. A slightly fancier version (which shows both Hough standard and probabilistic with trackbars for changing the threshold values) can be found |TutorialHoughCirclesFancyDownload|_.
|
||||||
|
|
||||||
|
@ -89,9 +89,9 @@ Code
|
|||||||
======
|
======
|
||||||
|
|
||||||
.. |TutorialHoughLinesSimpleDownload| replace:: here
|
.. |TutorialHoughLinesSimpleDownload| replace:: here
|
||||||
.. _TutorialHoughLinesSimpleDownload: http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/houghlines.cpp
|
.. _TutorialHoughLinesSimpleDownload: http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/houghlines.cpp
|
||||||
.. |TutorialHoughLinesFancyDownload| replace:: here
|
.. |TutorialHoughLinesFancyDownload| replace:: here
|
||||||
.. _TutorialHoughLinesFancyDownload: http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ImgTrans/HoughLines_Demo.cpp
|
.. _TutorialHoughLinesFancyDownload: http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ImgTrans/HoughLines_Demo.cpp
|
||||||
|
|
||||||
|
|
||||||
#. **What does this program do?**
|
#. **What does this program do?**
|
||||||
|
@ -55,7 +55,7 @@ Code
|
|||||||
* Applies a Laplacian operator to the grayscale image and stores the output image
|
* Applies a Laplacian operator to the grayscale image and stores the output image
|
||||||
* Display the result in a window
|
* Display the result in a window
|
||||||
|
|
||||||
#. The tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp>`_
|
#. The tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ImgTrans/Laplace_Demo.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ Code
|
|||||||
* Each second, apply 1 of 4 different remapping processes to the image and display them indefinitely in a window.
|
* Each second, apply 1 of 4 different remapping processes to the image and display them indefinitely in a window.
|
||||||
* Wait for the user to exit the program
|
* Wait for the user to exit the program
|
||||||
|
|
||||||
#. The tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ImgTrans/Remap_Demo.cpp>`_
|
#. The tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ImgTrans/Remap_Demo.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -121,7 +121,7 @@ Code
|
|||||||
|
|
||||||
* Applies the *Sobel Operator* and generates as output an image with the detected *edges* bright on a darker background.
|
* Applies the *Sobel Operator* and generates as output an image with the detected *edges* bright on a darker background.
|
||||||
|
|
||||||
#. The tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp>`_
|
#. The tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ Code
|
|||||||
* Applies a Rotation to the image after being transformed. This rotation is with respect to the image center
|
* Applies a Rotation to the image after being transformed. This rotation is with respect to the image center
|
||||||
* Waits until the user exits the program
|
* Waits until the user exits the program
|
||||||
|
|
||||||
#. The tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ImgTrans/Geometric_Transforms_Demo.cpp>`_
|
#. The tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ImgTrans/Geometric_Transforms_Demo.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ Black Hat
|
|||||||
Code
|
Code
|
||||||
======
|
======
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ImgProc/Morphology_2.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ImgProc/Morphology_2.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ Gaussian Pyramid
|
|||||||
Code
|
Code
|
||||||
======
|
======
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ImgProc/Pyramids.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ImgProc/Pyramids.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ Theory
|
|||||||
Code
|
Code
|
||||||
====
|
====
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ShapeDescriptors/generalContours_demo1.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ShapeDescriptors/generalContours_demo1.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ Theory
|
|||||||
Code
|
Code
|
||||||
====
|
====
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ShapeDescriptors/generalContours_demo2.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ShapeDescriptors/generalContours_demo2.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ Theory
|
|||||||
Code
|
Code
|
||||||
====
|
====
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ShapeDescriptors/findContours_demo.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ShapeDescriptors/findContours_demo.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ Theory
|
|||||||
Code
|
Code
|
||||||
====
|
====
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ShapeDescriptors/hull_demo.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ShapeDescriptors/hull_demo.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ Theory
|
|||||||
Code
|
Code
|
||||||
====
|
====
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ShapeDescriptors/moments_demo.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ShapeDescriptors/moments_demo.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ Theory
|
|||||||
Code
|
Code
|
||||||
====
|
====
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ShapeDescriptors/pointPolygonTest_demo.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ShapeDescriptors/pointPolygonTest_demo.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ Threshold to Zero, Inverted
|
|||||||
Code
|
Code
|
||||||
======
|
======
|
||||||
|
|
||||||
The tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/ImgProc/Threshold.cpp>`_
|
The tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/ImgProc/Threshold.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
258
doc/tutorials/introduction/android_binary_package/O4A_SDK.rst
Normal file
258
doc/tutorials/introduction/android_binary_package/O4A_SDK.rst
Normal file
@ -0,0 +1,258 @@
|
|||||||
|
|
||||||
|
.. _O4A_SDK:
|
||||||
|
|
||||||
|
|
||||||
|
OpenCV4Android SDK
|
||||||
|
******************
|
||||||
|
|
||||||
|
This tutorial was designed to help you with installation and configuration of OpenCV4Android SDK.
|
||||||
|
|
||||||
|
This guide was written with Windows 7 in mind, though it should work with any other OS supported by OpenCV4Android SDK.
|
||||||
|
|
||||||
|
This tutorial assumes you have the following installed and configured:
|
||||||
|
|
||||||
|
* JDK
|
||||||
|
|
||||||
|
* Android SDK and NDK
|
||||||
|
|
||||||
|
* Eclipse IDE
|
||||||
|
|
||||||
|
* ADT and CDT plugins for Eclipse
|
||||||
|
|
||||||
|
..
|
||||||
|
|
||||||
|
If you need help with anything of the above, you may refer to our :ref:`android_dev_intro` guide.
|
||||||
|
|
||||||
|
If you encounter any error after thoroughly following these steps, feel free to contact us via `OpenCV4Android <https://groups.google.com/group/android-opencv/>`_ discussion group or OpenCV `Q&A forum <http://answers.opencv.org>`_ . We'll do our best to help you out.
|
||||||
|
|
||||||
|
General info
|
||||||
|
============
|
||||||
|
**TODO:** rewrite this section.
|
||||||
|
|
||||||
|
OpenCV4Android SDK uses Android OpenCV Manager for library initialization. OpenCV Manager provides the following benefits:
|
||||||
|
|
||||||
|
* Compact apk-size, since all applications use the same binaries from Manager and do not store native libs within themselves;
|
||||||
|
|
||||||
|
* Hardware specific optimizations are automatically enabled on all supported platforms;
|
||||||
|
|
||||||
|
* Regular updates and bug fixes;
|
||||||
|
|
||||||
|
* Trusted OpenCV library source. All packages with OpenCV are published on Google Play;
|
||||||
|
|
||||||
|
..
|
||||||
|
|
||||||
|
|
||||||
|
For additional information on OpenCV Manager see the:
|
||||||
|
|
||||||
|
* |OpenCV4Android_Tutorial|_
|
||||||
|
|
||||||
|
* |OpenCV4Android_Reference|_
|
||||||
|
|
||||||
|
..
|
||||||
|
|
||||||
|
|
||||||
|
This package is quite close to the current OpenCV4Android distribution. If you're beginner with OpenCV, tutorial from above will help you to start.
|
||||||
|
|
||||||
|
* Library Project for Java development with Eclipse.
|
||||||
|
|
||||||
|
* C++ headers and libraries for native application development.
|
||||||
|
|
||||||
|
* Java samples, javadoc documentation.
|
||||||
|
|
||||||
|
* prebuilt binaries for ARM-v7a platform.
|
||||||
|
|
||||||
|
..
|
||||||
|
|
||||||
|
.. |OpenCV4Android_Tutorial| replace:: Tutorial
|
||||||
|
.. _OpenCV4Android_Tutorial: http://docs.opencv.org/doc/tutorials/introduction/android_binary_package/android_binary_package.html#android-binary-package
|
||||||
|
.. |OpenCV4Android_Reference| replace:: Reference Manual
|
||||||
|
.. _OpenCV4Android_Reference: http://docs.opencv.org/android/refman.html
|
||||||
|
|
||||||
|
Tegra Android Development Pack users
|
||||||
|
====================================
|
||||||
|
|
||||||
|
You may have used `Tegra Android Development Pack <http://developer.nvidia.com/tegra-android-development-pack>`_
|
||||||
|
(**TADP**) released by **NVIDIA** for Android development environment setup.
|
||||||
|
|
||||||
|
Beside Android development tools the TADP 2.0 includes OpenCV4Android SDK 2.4.2, so it can be already installed in your system and you can skip to running the ``face-detection`` sample.
|
||||||
|
|
||||||
|
More details regarding TADP can be found in the :ref:`android_dev_intro` guide.
|
||||||
|
|
||||||
|
Manual OpenCV4Android SDK setup
|
||||||
|
===============================
|
||||||
|
|
||||||
|
Get the OpenCV4Android SDK
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
#. Go to the `OpenCV dowload page on SourceForge <http://sourceforge.net/projects/opencvlibrary/files/opencv-android/>`_ and download the latest available version. Currently it's |opencv_android_bin_pack_url|_
|
||||||
|
|
||||||
|
#. Create a new folder for development for Android with OpenCV development. For this tutorial I have unpacked OpenCV to the :file:`C:\\Work\\OpenCV4Android\\` directory.
|
||||||
|
|
||||||
|
.. note:: Better to use a path without spaces in it. Otherwise you may have problems with :command:`ndk-build`.
|
||||||
|
|
||||||
|
#. Unpack the OpenCV package into the chosen directory.
|
||||||
|
|
||||||
|
You can unpack it using any popular archiver (e.g with |seven_zip|_):
|
||||||
|
|
||||||
|
.. image:: images/android_package_7zip.png
|
||||||
|
:alt: Exploring OpenCV package with 7-Zip
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
On Unix you can use the following command:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
unzip ~/Downloads/OpenCV-2.4.2-android-sdk.zip
|
||||||
|
|
||||||
|
.. |opencv_android_bin_pack| replace:: OpenCV-2.4.2-android-sdk.zip
|
||||||
|
.. _opencv_android_bin_pack_url: http://sourceforge.net/projects/opencvlibrary/files/opencv-android/2.4.2/OpenCV-2.4.2-android-sdk.zip/download
|
||||||
|
.. |opencv_android_bin_pack_url| replace:: |opencv_android_bin_pack|
|
||||||
|
.. |seven_zip| replace:: 7-Zip
|
||||||
|
.. _seven_zip: http://www.7-zip.org/
|
||||||
|
|
||||||
|
Open OpenCV library and samples in Eclipse
|
||||||
|
------------------------------------------
|
||||||
|
|
||||||
|
#. Start *Eclipse* and choose your workspace location.
|
||||||
|
|
||||||
|
We recommend to start working with OpenCV for Android from a new clean workspace. A new Eclipse workspace can for example be created in the folder where you have unpacked OpenCV4Android SDK package:
|
||||||
|
|
||||||
|
.. image:: images/eclipse_1_choose_workspace.png
|
||||||
|
:alt: Choosing C:\Work\android-opencv\ as workspace location
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
#. Import OpenCV library and samples into workspace.
|
||||||
|
|
||||||
|
OpenCV library is packed as a ready-for-use `Android Library Project
|
||||||
|
<http://developer.android.com/guide/developing/projects/index.html#LibraryProjects>`_. You can simply reference it in your projects.
|
||||||
|
|
||||||
|
Each sample included into the |opencv_android_bin_pack| is a regular Android project that already references OpenCV library.
|
||||||
|
Follow the steps below to import OpenCV and samples into the workspace:
|
||||||
|
|
||||||
|
* Right click on the :guilabel:`Package Explorer` window and choose :guilabel:`Import...` option from the context menu:
|
||||||
|
|
||||||
|
.. image:: images/eclipse_5_import_command.png
|
||||||
|
:alt: Select Import... from context menu
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
* In the main panel select :menuselection:`General --> Existing Projects into Workspace` and press :guilabel:`Next` button:
|
||||||
|
|
||||||
|
.. image:: images/eclipse_6_import_existing_projects.png
|
||||||
|
:alt: General > Existing Projects into Workspace
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
* In the :guilabel:`Select root directory` field locate your OpenCV package folder. Eclipse should automatically locate OpenCV library and samples:
|
||||||
|
|
||||||
|
.. image:: images/eclipse_7_select_projects.png
|
||||||
|
:alt: Locate OpenCV library and samples
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
* Click :guilabel:`Finish` button to complete the import operation.
|
||||||
|
|
||||||
|
After clicking :guilabel:`Finish` button Eclipse will load all selected projects into workspace. Numerous errors will be indicated:
|
||||||
|
|
||||||
|
.. image:: images/eclipse_8_false_alarm.png
|
||||||
|
:alt: Confusing Eclipse screen with numerous errors
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
However, **all these errors are only false-alarms**!
|
||||||
|
|
||||||
|
Just give a minute to Eclipse to complete initialization.
|
||||||
|
|
||||||
|
In some cases these errors disappear after :menuselection:`Project --> Clean... --> Clean all --> OK`
|
||||||
|
or after pressing :kbd:`F5` (for Refresh action) when selecting error-label-marked projects in :guilabel:`Package Explorer`.
|
||||||
|
|
||||||
|
Sometimes more advanced manipulations are required:
|
||||||
|
|
||||||
|
* The provided projects are configured for ``API 11`` target (and ``API 9`` for the library) that can be missing platform in your Android SDK.
|
||||||
|
After right click on any project select :guilabel:`Properties` and then :guilabel:`Android` on the left pane.
|
||||||
|
Click some target with `API Level` 11 or higher:
|
||||||
|
|
||||||
|
.. image:: images/eclipse_8a_target.png
|
||||||
|
:alt: Updating target
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
Eclipse will rebuild your workspace and error icons will disappear one by one:
|
||||||
|
|
||||||
|
.. image:: images/eclipse_9_errors_dissapearing.png
|
||||||
|
:alt: After small help Eclipse removes error icons!
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
Once Eclipse completes build you will have the clean workspace without any build errors:
|
||||||
|
|
||||||
|
.. image:: images/eclipse_10_crystal_clean.png
|
||||||
|
:alt: OpenCV package imported into Eclipse
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
.. _Running_OpenCV_Samples:
|
||||||
|
|
||||||
|
Running OpenCV Samples
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
At this point you should be able to build and run the samples. Keep in mind, that ``face-detection``, ``Tutorial 3`` and ``Tutorial 4`` ones include some native code and require Android NDK and CDT plugin for Eclipse to build working applications.
|
||||||
|
If you haven't installed these tools see the corresponding section of :ref:`Android_Dev_Intro`.
|
||||||
|
|
||||||
|
Also, please consider that ``Tutorial 0`` and ``Tutorial 1`` samples use Java Camera API that definitelly accessible on emulator from the Android SDK.
|
||||||
|
Other samples use OpenCV Native Camera which may not work with emulator.
|
||||||
|
|
||||||
|
.. note:: Recent *Android SDK tools, revision 19+* can run ARM v7a OS images but they available not for all Android versions.
|
||||||
|
|
||||||
|
Well, running samples from Eclipse is very simple:
|
||||||
|
|
||||||
|
* Connect your device with :command:`adb` tool from Android SDK or create an emulator with camera support.
|
||||||
|
|
||||||
|
* See `Managing Virtual Devices
|
||||||
|
<http://developer.android.com/guide/developing/devices/index.html>`_ document for help with Android Emulator.
|
||||||
|
* See `Using Hardware Devices
|
||||||
|
<http://developer.android.com/guide/developing/device.html>`_ for help with real devices (not emulators).
|
||||||
|
|
||||||
|
|
||||||
|
* Select project you want to start in :guilabel:`Package Explorer` and just press :kbd:`Ctrl + F11` or select option :menuselection:`Run --> Run` from the main menu, or click :guilabel:`Run` button on the toolbar.
|
||||||
|
|
||||||
|
.. note:: Android Emulator can take several minutes to start. So, please, be patient.
|
||||||
|
|
||||||
|
* On the first run Eclipse will ask you about the running mode for your application:
|
||||||
|
|
||||||
|
.. image:: images/eclipse_11_run_as.png
|
||||||
|
:alt: Run sample as Android Application
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
* Select the :guilabel:`Android Application` option and click :guilabel:`OK` button. Eclipse will install and run the sample.
|
||||||
|
|
||||||
|
Chances are that on the first launch you will not have the `OpenCV Manager <https://docs.google.com/a/itseez.com/presentation/d/1EO_1kijgBg_BsjNp2ymk-aarg-0K279_1VZRcPplSuk/present#slide=id.p>`_ package installed.
|
||||||
|
In this case you will see the following message:
|
||||||
|
|
||||||
|
.. image:: images/android_emulator_opencv_manager_fail.png
|
||||||
|
:alt: You will see this message if you have no OpenCV Manager installed
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
To get rid of the message you will need to install `OpenCV Manager` and the appropriate `OpenCV binary pack`.
|
||||||
|
Simply tap :menuselection:`Yes` if you have *Google Play Market* installed on your device/emulator. It will redirect you to the corresponding page on *Google Play Market*.
|
||||||
|
|
||||||
|
If you have no access to the *Market*, which is often the case with emulators - you will need to install the packages from OpenCV4Android SDK folder manually. Open the console/terminal and type in the following two commands:
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
<Android SDK path>/platform-tools/adb install <OpenCV4Android SDK path>/apk/OpenCV_2.4.2_Manager.apk
|
||||||
|
<Android SDK path>/platform-tools/adb install <OpenCV4Android SDK path>/apk/OpenCV_2.4.2_binary_pack_armv7a.apk
|
||||||
|
|
||||||
|
If you're running Windows, that will probably look like this:
|
||||||
|
|
||||||
|
.. image:: images/install_opencv_manager_with_adb.png
|
||||||
|
:alt: Run these commands in the console to install OpenCV Manager
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
When done, you will be able to run OpenCV samples on your device/emulator seamlessly.
|
||||||
|
|
||||||
|
* Here is ``Tutorial 2 - Use OpenCV Camera`` sample, running on top of stock camera-preview of the emulator.
|
||||||
|
|
||||||
|
.. image:: images/emulator_canny.png
|
||||||
|
:height: 600px
|
||||||
|
:alt: Tutorial 1 Basic - 1. Add OpenCV - running Canny
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
What's next
|
||||||
|
===========
|
||||||
|
|
||||||
|
Now, when you have your instance of OpenCV4Adroid SDK set up and configured, you may want to proceed to using OpenCV in your own application. You can learn how to do that in a separate *Development with OpenCV* tutorial.
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
|
|
||||||
Using OpenCV in C++ code with OpenCV4Android SDK
|
Using OpenCV in C++ code with OpenCV4Android SDK
|
||||||
*********************************************
|
************************************************
|
||||||
|
|
||||||
The Android way is writing all your code in Java. But sometimes, it is not enough and you need to go to the native level and write some parts of your application in C/C++.
|
The Android way is writing all your code in Java. But sometimes, it is not enough and you need to go to the native level and write some parts of your application in C/C++.
|
||||||
This is especially important when you already have some computer vision code which is written in C++ and uses OpenCV, and you want to reuse it in your Android application.
|
This is especially important when you already have some computer vision code which is written in C++ and uses OpenCV, and you want to reuse it in your Android application.
|
||||||
|
@ -0,0 +1,314 @@
|
|||||||
|
|
||||||
|
.. _Android_Dev_Intro:
|
||||||
|
|
||||||
|
|
||||||
|
Introduction into Android Development
|
||||||
|
*************************************
|
||||||
|
|
||||||
|
This guide was designed to help you in learning Android development basics and quickly seting up your working environment.
|
||||||
|
|
||||||
|
This guide was written with Windows 7 in mind, though it should work with any other OS supported by Android SDK.
|
||||||
|
|
||||||
|
If you encounter any error after thoroughly following these steps, feel free to contact us via `OpenCV4Android <https://groups.google.com/group/android-opencv/>`_ discussion group or OpenCV `Q&A forum <http://answers.opencv.org>`_ . We'll do our best to help you out.
|
||||||
|
|
||||||
|
Android application structure
|
||||||
|
=============================
|
||||||
|
|
||||||
|
Usually source code of an Android application has the following structure:
|
||||||
|
|
||||||
|
+ :file:`root folder of the project/`
|
||||||
|
|
||||||
|
- :file:`jni/`
|
||||||
|
|
||||||
|
- :file:`libs/`
|
||||||
|
|
||||||
|
- :file:`res/`
|
||||||
|
|
||||||
|
- :file:`src/`
|
||||||
|
|
||||||
|
- :file:`AndroidManifest.xml`
|
||||||
|
|
||||||
|
- :file:`project.properties`
|
||||||
|
|
||||||
|
- :file:`... other files ...`
|
||||||
|
|
||||||
|
where:
|
||||||
|
|
||||||
|
* the :file:`src` folder contains Java code of the application
|
||||||
|
|
||||||
|
* the :file:`res` folder contains resources of the application (images, xml files describing UI layout , etc),
|
||||||
|
|
||||||
|
* the :file:`libs` folder will contain native libraries after a successful build,
|
||||||
|
|
||||||
|
* and the :file:`jni` folder contains C/C++ application source code and NDK's build scripts :file:`Android.mk` and :file:`Application.mk`
|
||||||
|
producing the native libraries.
|
||||||
|
|
||||||
|
* :file:`AndroidManifest.xml` file presents essential information about application to the Android system
|
||||||
|
(name of the Application, name of main application's package, components of the application, required permissions, etc).
|
||||||
|
|
||||||
|
It can be created using Eclipse wizard or :command:`android` tool from Android SDK.
|
||||||
|
|
||||||
|
* :file:`project.properties` is a text file containing information about target Android platform and other build details.
|
||||||
|
This file is generated by Eclipse or can be created with :command:`android` tool included in Android SDK.
|
||||||
|
|
||||||
|
.. note:: Both files (:file:`AndroidManifest.xml` and :file:`project.properties`) are required to compile the C++ part of the application,
|
||||||
|
since NDK build system relies on them. If any of these files does not exist, compile the Java part of the project before the C++ part.
|
||||||
|
|
||||||
|
:file:`Android.mk` and :file:`Application.mk` scripts
|
||||||
|
==================================================================
|
||||||
|
|
||||||
|
The script :file:`Android.mk` usually has the following structure:
|
||||||
|
|
||||||
|
.. code-block:: make
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := <module_name>
|
||||||
|
LOCAL_SRC_FILES := <list of .c and .cpp project files>
|
||||||
|
<some variable name> := <some variable value>
|
||||||
|
...
|
||||||
|
<some variable name> := <some variable value>
|
||||||
|
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
|
This is the minimal file :file:`Android.mk`, which builds C++ source code of an Android application. Note that the first two lines and the last line are mandatory for any :file:`Android.mk`.
|
||||||
|
|
||||||
|
Usually the file :file:`Application.mk` is optional, but in case of project using OpenCV, when STL and exceptions are used in C++, it also should be created. Example of the file :file:`Application.mk`:
|
||||||
|
|
||||||
|
.. code-block:: make
|
||||||
|
|
||||||
|
APP_STL := gnustl_static
|
||||||
|
APP_CPPFLAGS := -frtti -fexceptions
|
||||||
|
APP_ABI := armeabi-v7a
|
||||||
|
|
||||||
|
Quick environment setup for Android development
|
||||||
|
===============================================
|
||||||
|
|
||||||
|
If you are making a clean environment install, then you can try `Tegra Android Development Pack <http://developer.nvidia.com/tegra-android-development-pack>`_
|
||||||
|
(**TADP**) released by **NVIDIA**.
|
||||||
|
|
||||||
|
When unpacked, TADP will cover all of the environment setup automatically and you can skip the rest of the guide.
|
||||||
|
|
||||||
|
If you are a beginner in Android development then we also recommend you to start with TADP.
|
||||||
|
|
||||||
|
.. note:: *NVIDIA*\ 's Tegra Android Development Pack includes some special features for |Nvidia_Tegra_Platform|_ but its use is not limited to *Tegra* devices only.
|
||||||
|
|
||||||
|
* You need at least *1.6 Gb* free disk space for the install.
|
||||||
|
|
||||||
|
* TADP will download Android SDK platforms and Android NDK from Google's server, so Internet connection is required for the installation.
|
||||||
|
|
||||||
|
* TADP may ask you to flash your development kit at the end of installation process. Just skip this step if you have no |Tegra_Development_Kit|_\ .
|
||||||
|
|
||||||
|
* (``UNIX``) TADP will ask you for *root* in the middle of installation, so you need to be a member of *sudo* group.
|
||||||
|
|
||||||
|
..
|
||||||
|
|
||||||
|
|
||||||
|
.. |Nvidia_Tegra_Platform| replace:: *NVIDIA*\ ’s Tegra platform
|
||||||
|
.. _Nvidia_Tegra_Platform: http://developer.nvidia.com/node/19071
|
||||||
|
.. |Tegra_Development_Kit| replace:: Tegra Development Kit
|
||||||
|
.. _Tegra_Development_Kit: http://developer.nvidia.com/tegra-ventana-development-kit
|
||||||
|
|
||||||
|
.. _Android_Environment_Setup_Lite:
|
||||||
|
|
||||||
|
Manual environment setup for Android Development
|
||||||
|
================================================
|
||||||
|
|
||||||
|
Development in Java
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
You need the following software to be installed in order to develop for Android in Java:
|
||||||
|
|
||||||
|
#. **Sun JDK 6**
|
||||||
|
|
||||||
|
Visit `Java SE Downloads page <http://www.oracle.com/technetwork/java/javase/downloads/>`_ and download an installer for your OS.
|
||||||
|
|
||||||
|
Here is a detailed :abbr:`JDK (Java Development Kit)` `installation guide <http://source.android.com/source/initializing.html#installing-the-jdk>`_
|
||||||
|
for Ubuntu and Mac OS (only JDK sections are applicable for OpenCV)
|
||||||
|
|
||||||
|
.. note:: OpenJDK is not suitable for Android development, since Android SDK supports only Sun JDK.
|
||||||
|
If you use Ubuntu, after installation of Sun JDK you should run the following command to set Sun java environment:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
sudo update-java-alternatives --set java-6-sun
|
||||||
|
|
||||||
|
**TODO:** add a note on Sun/Oracle Java installation on Ubuntu 12.
|
||||||
|
|
||||||
|
#. **Android SDK**
|
||||||
|
|
||||||
|
Get the latest ``Android SDK`` from http://developer.android.com/sdk/index.html
|
||||||
|
|
||||||
|
Here is Google's `install guide <http://developer.android.com/sdk/installing.html>`_ for the SDK.
|
||||||
|
|
||||||
|
.. note:: If you choose SDK packed into a Windows installer, then you should have 32-bit JRE installed. It is not a prerequisite for Android development, but installer is a x86 application and requires 32-bit Java runtime.
|
||||||
|
|
||||||
|
.. note:: If you are running x64 version of Ubuntu Linux, then you need ia32 shared libraries for use on amd64 and ia64 systems to be installed. You can install them with the following command:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
sudo apt-get install ia32-libs
|
||||||
|
|
||||||
|
For Red Hat based systems the following command might be helpful:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
sudo yum install libXtst.i386
|
||||||
|
|
||||||
|
#. **Android SDK components**
|
||||||
|
|
||||||
|
You need the following SDK components to be installed:
|
||||||
|
|
||||||
|
* *Android SDK Tools, revision14* or newer.
|
||||||
|
|
||||||
|
Older revisions should also work, but they are not recommended.
|
||||||
|
|
||||||
|
* *SDK Platform Android 3.0*, ``API 11`` and *Android 2.3.1*, ``API 9``.
|
||||||
|
|
||||||
|
The minimal platform supported by OpenCV Java API is **Android 2.2** (``API 8``). This is also the minimum API Level required for the provided samples to run.
|
||||||
|
See the ``<uses-sdk android:minSdkVersion="8"/>`` tag in their **AndroidManifest.xml** files.
|
||||||
|
But for successful compilation of some samples the **target** platform should be set to Android 3.0 (API 11) or higher. It will not prevent them from running on Android 2.2.
|
||||||
|
|
||||||
|
.. image:: images/android_sdk_and_avd_manager.png
|
||||||
|
:height: 500px
|
||||||
|
:alt: Android SDK Manager
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
See `Adding SDK Components <http://developer.android.com/sdk/adding-components.html>`_ for help with installing/updating SDK components.
|
||||||
|
|
||||||
|
#. **Eclipse IDE**
|
||||||
|
|
||||||
|
Check the `Android SDK System Requirements <http://developer.android.com/sdk/requirements.html>`_ document for a list of Eclipse versions that are compatible with the Android SDK.
|
||||||
|
For OpenCV 2.4.x we recommend **Eclipse 3.7 (Indigo)** or later versions. They work well for OpenCV under both Windows and Linux.
|
||||||
|
|
||||||
|
If you have no Eclipse installed, you can get it from the `official site <http://www.eclipse.org/downloads/>`_.
|
||||||
|
|
||||||
|
#. **ADT plugin for Eclipse**
|
||||||
|
|
||||||
|
These instructions are copied from `Android Developers site <http://developer.android.com/sdk/eclipse-adt.html#downloading>`_, check it out in case of any ADT-related problem.
|
||||||
|
|
||||||
|
Assuming that you have Eclipse IDE installed, as described above, follow these steps to download and install the ADT plugin:
|
||||||
|
|
||||||
|
#. Start Eclipse, then select :menuselection:`Help --> Install New Software...`
|
||||||
|
#. Click :guilabel:`Add` (in the top-right corner).
|
||||||
|
#. In the :guilabel:`Add Repository` dialog that appears, enter "ADT Plugin" for the Name and the following URL for the Location:
|
||||||
|
|
||||||
|
https://dl-ssl.google.com/android/eclipse/
|
||||||
|
|
||||||
|
#. Click :guilabel:`OK`
|
||||||
|
|
||||||
|
.. note:: If you have trouble acquiring the plugin, try using "http" in the Location URL, instead of "https" (https is preferred for security reasons).
|
||||||
|
|
||||||
|
#. In the :guilabel:`Available Software` dialog, select the checkbox next to :guilabel:`Developer Tools` and click :guilabel:`Next`.
|
||||||
|
#. In the next window, you'll see a list of the tools to be downloaded. Click :guilabel:`Next`.
|
||||||
|
#. Read and accept the license agreements, then click :guilabel:`Finish`.
|
||||||
|
|
||||||
|
.. note:: If you get a security warning saying that the authenticity or validity of the software can't be established, click :guilabel:`OK`.
|
||||||
|
|
||||||
|
#. When the installation completes, restart Eclipse.
|
||||||
|
|
||||||
|
Native development in C++
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
You need the following software to be installed in order to develop for Android in C++:
|
||||||
|
|
||||||
|
#. **Android NDK**
|
||||||
|
|
||||||
|
To compile C++ code for Android platform you need ``Android Native Development Kit`` (*NDK*).
|
||||||
|
|
||||||
|
You can get the latest version of NDK from the `download page <http://developer.android.com/sdk/ndk/index.html>`_. To install Android NDK just extract the archive to some folder on your computer. Here are `installation instructions <http://developer.android.com/sdk/ndk/index.html#installing>`_.
|
||||||
|
|
||||||
|
.. note:: Before start you can read official Android NDK documentation which is in the Android NDK archive, in the folder :file:`docs/`.
|
||||||
|
|
||||||
|
The main article about using Android NDK build system is in the :file:`ANDROID-MK.html` file.
|
||||||
|
|
||||||
|
Some additional information you can find in the :file:`APPLICATION-MK.html`, :file:`NDK-BUILD.html` files, and :file:`CPU-ARM-NEON.html`, :file:`CPLUSPLUS-SUPPORT.html`, :file:`PREBUILTS.html`.
|
||||||
|
|
||||||
|
#. **CDT plugin for Eclipse**
|
||||||
|
|
||||||
|
There are several possible ways to integrate compilation of C++ code by Android NDK into Eclipse compilation process.
|
||||||
|
We recommend the approach based on Eclipse :abbr:`CDT(C/C++ Development Tooling)` Builder.
|
||||||
|
|
||||||
|
.. important:: Make sure your Eclipse IDE has the :abbr:`CDT(C/C++ Development Tooling)` plugin installed. Menu :guilabel:`Help -> About Eclipse SDK` and push :guilabel:`Installation Details` button.
|
||||||
|
|
||||||
|
.. image:: images/eclipse_inst_details.png
|
||||||
|
:alt: Configure builders
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
To install the `CDT plugin <http://eclipse.org/cdt/>`_ use menu :guilabel:`Help -> Install New Software...`,
|
||||||
|
then paste the CDT 8.0 repository URL http://download.eclipse.org/tools/cdt/releases/indigo as shown in the picture below and click :guilabel:`Add...`, name it *CDT* and click :guilabel:`OK`.
|
||||||
|
|
||||||
|
.. image:: images/eclipse_inst_cdt.png
|
||||||
|
:alt: Configure builders
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
``CDT Main Features`` should be enough:
|
||||||
|
|
||||||
|
.. image:: images/eclipse_inst_cdt_2.png
|
||||||
|
:alt: Configure builders
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
That's it. Compilation of C++ code is fully integrated into Eclipse building process now.
|
||||||
|
|
||||||
|
Debugging and Testing
|
||||||
|
=====================
|
||||||
|
In this section we will give you some easy-to-follow instructions on how to set up an emulator or hardware device for testing and debugging an Android project.
|
||||||
|
|
||||||
|
AVD
|
||||||
|
---
|
||||||
|
AVD (*Android Virtual Device*) is not probably the most convenient way to test an OpenCV-dependent application, but sure the most uncomplicated one to configure.
|
||||||
|
|
||||||
|
#. Assuming you already have *Android SDK* and *Eclipse IDE* installed, in Eclipse go :guilabel:`Window -> AVD Manager`.
|
||||||
|
**TBD:** how to start AVD Manager without Eclipse...
|
||||||
|
#. Press the :guilabel:`New` button in :guilabel:`AVD Manager` window.
|
||||||
|
#. :guilabel:`Create new Android Virtual Device` window will let you select some properties for your new device, like target API level, size of SD-card and other.
|
||||||
|
.. image:: images/AVD_create.png
|
||||||
|
:alt: Configure builders
|
||||||
|
:align: center
|
||||||
|
#. When you click the :guilabel:`Create AVD` button, your new AVD will be availible in :guilabel:`AVD Manager`.
|
||||||
|
#. Press :guilabel:`Start` to launch the device. Be aware that any AVD (aka Emulator) is usually much slower than a hardware Android device, so it may take up to several minutes to start.
|
||||||
|
#. Go :guilabel:`Run -> Run/Debug` in Eclipse IDE to run your application in regular or debugging mode. :guilabel:`Device Chooser` will let you choose among the running devices or to start a new one.
|
||||||
|
|
||||||
|
Hardware Device
|
||||||
|
---------------
|
||||||
|
If you have an Android device, you can use it to test and debug your applications. This way is more authentic, though a little bit harder to set up.
|
||||||
|
|
||||||
|
#. Attach the Android device to your PC with a USB cable.
|
||||||
|
#. Go to :guilabel:`Start Menu` and **right-click** on :guilabel:`Computer`. Select :guilabel:`Manage` in the context menu. You may be asked for Administrative permittions.
|
||||||
|
#. Select :guilabel:`Device Manager` in the left pane and find an unknown device in the list. You may try unplugging it and then plugging back in order to check whether it's your exact equipment appearing in the list.
|
||||||
|
#. Right-click on your device to get to :guilabel:`Properties` and select the :guilabel:`Details` tab. Select :guilabel:`Device ID` and save both numbers (*e.g in a text file*).
|
||||||
|
.. image:: images/device_details.png
|
||||||
|
:alt: Details
|
||||||
|
:align: center
|
||||||
|
#. Now open file :file:`<Android SDK folder>/extras/google/usb_driver/android_winusb.inf`. You will see some default records there, perhaps looking similar to this:
|
||||||
|
.. code-block:: ini
|
||||||
|
|
||||||
|
;Google Nexus One
|
||||||
|
%SingleAdbInterface% = USB_Install, USB\VID_18D1&PID_0D02
|
||||||
|
%CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_0D02&MI_01
|
||||||
|
|
||||||
|
#. There should be a record like this for your device and since it hasn't appeared automatically you are free to add one manually. All you should do is to add another record similar to the above, but using the numbers you saved earlier. Second number goes to the first line and the first one goes to the second line. Notice, that the record should be inserted under *[Google.NTx86]* or *[Google.NTamd64]* tag, depending on what system you're currently running. For example, in my case it was Nvidia Tegra device and the record looked like this:
|
||||||
|
.. code-block:: ini
|
||||||
|
|
||||||
|
;NVIDIA Tegra
|
||||||
|
%SingleAdbInterface% = USB_Install, USB\VID_0955&PID_7100&MI_01
|
||||||
|
%CompositeAdbInterface% = USB_Install, USB\VID_0955&PID_7100&REV_9999&MI_01
|
||||||
|
|
||||||
|
#. Assuming you have your SDK installed to :file:`C:/android-sdk/`, you may try the following command in Windows console to acertain that your device was recognised and attached:
|
||||||
|
.. code-block:: ini
|
||||||
|
|
||||||
|
C:\android-sdk\platform-tools\adb devices
|
||||||
|
|
||||||
|
.. image:: images/cmd_adb_devices.png
|
||||||
|
:alt: Console
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
#. Now, in Eclipse go :guilabel:`Run -> Run/Debug` to run your application in regular or debugging mode. :guilabel:`Device Chooser` will let you choose among the devices.
|
||||||
|
|
||||||
|
Consult the official `Android Developers site <http://developer.android.com/tools/device.html>`_ for more information on configuring hardware devices to work with other operating systems.
|
||||||
|
|
||||||
|
What's next
|
||||||
|
===========
|
||||||
|
|
||||||
|
Now, when you have your development environment set up and configured, you may want to proceed to installing OpenCV4Android SDK. You can learn how to do that in a separate :ref:`O4A_SDK` tutorial.
|
@ -0,0 +1,471 @@
|
|||||||
|
|
||||||
|
.. _dev_with_OCV_on_Android:
|
||||||
|
|
||||||
|
|
||||||
|
Android development with OpenCV
|
||||||
|
*******************************
|
||||||
|
|
||||||
|
This tutorial is created to help you use OpenCV library within your Android project.
|
||||||
|
|
||||||
|
This guide was written with Windows 7 in mind, though it should work with any other OS supported by OpenCV4Android SDK.
|
||||||
|
|
||||||
|
This tutorial assumes you have the following installed and configured:
|
||||||
|
|
||||||
|
* JDK
|
||||||
|
|
||||||
|
* Android SDK and NDK
|
||||||
|
|
||||||
|
* Eclipse IDE
|
||||||
|
|
||||||
|
* ADT and CDT plugins for Eclipse
|
||||||
|
|
||||||
|
..
|
||||||
|
|
||||||
|
If you need help with anything of the above, you may refer to our :ref:`android_dev_intro` guide.
|
||||||
|
|
||||||
|
This tutorial also assumes you have OpenCV4Android SDK already installed on your development machine and OpenCV Manager on your testing device correspondingly. If you need help with any of these, you may consult our :ref:`O4A_SDK` tutorial.
|
||||||
|
|
||||||
|
If you encounter any error after thoroughly following these steps, feel free to contact us via `OpenCV4Android <https://groups.google.com/group/android-opencv/>`_ discussion group or OpenCV `Q&A forum <http://answers.opencv.org>`_ . We'll do our best to help you out.
|
||||||
|
|
||||||
|
Using OpenCV library within your Android project
|
||||||
|
================================================
|
||||||
|
|
||||||
|
In this section we will explain how to make some existing project to use OpenCV.
|
||||||
|
Starting with 2.4.2 release for Android, *OpenCV Manager* is used to provide apps with the best available version of OpenCV.
|
||||||
|
You can get more information here: :ref:`Android_OpenCV_Manager` and in these `slides <https://docs.google.com/a/itseez.com/presentation/d/1EO_1kijgBg_BsjNp2ymk-aarg-0K279_1VZRcPplSuk/present#slide=id.p>`_.
|
||||||
|
|
||||||
|
Java
|
||||||
|
----
|
||||||
|
Application development with async initialization
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Using async initialization is a **recommended** way for application development. It uses the OpenCV Manager to access OpenCV libraries externally installed in the target system.
|
||||||
|
|
||||||
|
#. Add OpenCV library project to your workspace. Use menu :guilabel:`File -> Import -> Existing project in your workspace`,
|
||||||
|
press :guilabel:`Browse` button and locate OpenCV4Android SDK (:file:`OpenCV-2.4.2-android-sdk/sdk`).
|
||||||
|
|
||||||
|
.. image:: images/eclipse_opencv_dependency0.png
|
||||||
|
:alt: Add dependency from OpenCV library
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
#. In application project add a reference to the OpenCV Java SDK in :guilabel:`Project -> Properties -> Android -> Library -> Add` select ``OpenCV Library - 2.4.2``.
|
||||||
|
|
||||||
|
.. image:: images/eclipse_opencv_dependency1.png
|
||||||
|
:alt: Add dependency from OpenCV library
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
To run OpenCV Manager-based application the first time you need to install packages with the `OpenCV Manager` and `OpenCV binary pack` for you platform.
|
||||||
|
You can do it using Google Play Market or manually with ``adb`` tool:
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
<Android SDK path>/platform-tools/adb install <OpenCV4Android SDK path>/apk/OpenCV_2.4.2_Manager.apk
|
||||||
|
<Android SDK path>/platform-tools/adb install <OpenCV4Android SDK path>/apk/OpenCV_2.4.2_binary_pack_armv7a.apk
|
||||||
|
|
||||||
|
There is a very base code snippet implementing the async initialization. It shows basic principles. See the "15-puzzle" OpenCV sample for details.
|
||||||
|
|
||||||
|
.. code-block:: java
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
public class MyActivity extends Activity implements HelperCallbackInterface
|
||||||
|
{
|
||||||
|
private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) {
|
||||||
|
@Override
|
||||||
|
public void onManagerConnected(int status) {
|
||||||
|
switch (status) {
|
||||||
|
case LoaderCallbackInterface.SUCCESS:
|
||||||
|
{
|
||||||
|
Log.i(TAG, "OpenCV loaded successfully");
|
||||||
|
// Create and set View
|
||||||
|
mView = new puzzle15View(mAppContext);
|
||||||
|
setContentView(mView);
|
||||||
|
} break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
super.onManagerConnected(status);
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Called when the activity is first created. */
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState)
|
||||||
|
{
|
||||||
|
Log.i(TAG, "onCreate");
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
Log.i(TAG, "Trying to load OpenCV library");
|
||||||
|
if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack))
|
||||||
|
{
|
||||||
|
Log.e(TAG, "Cannot connect to OpenCV Manager");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
It this case application works with OpenCV Manager in asynchronous fashion. ``OnManagerConnected`` callback will be called in UI thread, when initialization finishes.
|
||||||
|
Please note, that it is not allowed to use OpenCV calls or load OpenCV-dependent native libs before invoking this callback.
|
||||||
|
Load your own native libraries that depend on OpenCV after the successful OpenCV initialization.
|
||||||
|
|
||||||
|
Application development with static initialization
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
According to this approach all OpenCV binaries are included into your application package. It is designed mostly for development purposes.
|
||||||
|
This approach is deprecated for the production code, release package is recommended to communicate with OpenCV Manager via the async initialization described above.
|
||||||
|
|
||||||
|
#. Add the OpenCV library project to your workspace the same way as for the async initialization above.
|
||||||
|
Use menu :guilabel:`File -> Import -> Existing project in your workspace`, push :guilabel:`Browse` button and select OpenCV SDK path (:file:`OpenCV-2.4.2-android-sdk/sdk`).
|
||||||
|
|
||||||
|
.. image:: images/eclipse_opencv_dependency0.png
|
||||||
|
:alt: Add dependency from OpenCV library
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
#. In the application project add a reference to the OpenCV4Android SDK in :guilabel:`Project -> Properties -> Android -> Library -> Add` select ``OpenCV Library - 2.4.2``;
|
||||||
|
|
||||||
|
.. image:: images/eclipse_opencv_dependency1.png
|
||||||
|
:alt: Add dependency from OpenCV library
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
#. If your application project **doesn't have a JNI part**, just copy the corresponding OpenCV native libs from :file:`<OpenCV-2.4.2-android-sdk>/sdk/native/libs/<target_arch>` to your project directory to folder :file:`libs/<target_arch>`.
|
||||||
|
|
||||||
|
In case of the application project **with a JNI part**, instead of manual libraries copying you need to modify your ``Android.mk`` file:
|
||||||
|
add the following two code lines after the ``"include $(CLEAR_VARS)"`` and before ``"include path_to_OpenCV-2.4.2-android-sdk/sdk/native/jni/OpenCV.mk"``
|
||||||
|
|
||||||
|
.. code-block:: make
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
OPENCV_CAMERA_MODULES:=on
|
||||||
|
OPENCV_INSTALL_MODULES:=on
|
||||||
|
|
||||||
|
The result should look like the following:
|
||||||
|
|
||||||
|
.. code-block:: make
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
# OpenCV
|
||||||
|
OPENCV_CAMERA_MODULES:=on
|
||||||
|
OPENCV_INSTALL_MODULES:=on
|
||||||
|
include ../../sdk/native/jni/OpenCV.mk
|
||||||
|
|
||||||
|
After that the OpenCV libraries will be copied to your application :file:`libs` folder during the JNI part build.
|
||||||
|
|
||||||
|
Eclipse will automatically include all the libraries from the :file:`libs` folder to the application package (APK).
|
||||||
|
|
||||||
|
#. The last step of enabling OpenCV in your application is Java initialization code before call to OpenCV API.
|
||||||
|
It can be done, for example, in the static section of the ``Activity`` class:
|
||||||
|
|
||||||
|
.. code-block:: java
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
static {
|
||||||
|
if (!OpenCVLoader.initDebug()) {
|
||||||
|
// Handle initialization error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
If you application includes other OpenCV-dependent native libraries you should load them **after** OpenCV initialization:
|
||||||
|
|
||||||
|
.. code-block:: java
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
static {
|
||||||
|
if (!OpenCVLoader.initDebug()) {
|
||||||
|
// Handle initialization error
|
||||||
|
} else {
|
||||||
|
System.loadLibrary("my_jni_lib1");
|
||||||
|
System.loadLibrary("my_jni_lib2");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Native/C++
|
||||||
|
----------
|
||||||
|
|
||||||
|
To build your own Android application, which uses OpenCV from native part, the following steps should be done:
|
||||||
|
|
||||||
|
#. You can use an environment variable to specify the location of OpenCV package or just hardcode absolute or relative path in the :file:`jni/Android.mk` of your projects.
|
||||||
|
|
||||||
|
#. The file :file:`jni/Android.mk` should be written for the current application using the common rules for this file.
|
||||||
|
|
||||||
|
For detailed information see the Android NDK documentation from the Android NDK archive, in the file
|
||||||
|
:file:`<path_where_NDK_is_placed>/docs/ANDROID-MK.html`
|
||||||
|
|
||||||
|
#. The line
|
||||||
|
|
||||||
|
.. code-block:: make
|
||||||
|
|
||||||
|
include C:\Work\OpenCV4Android\OpenCV-2.4.2-android-sdk\sdk\native\jni\OpenCV.mk
|
||||||
|
|
||||||
|
should be inserted into the :file:`jni/Android.mk` file **after** the line
|
||||||
|
|
||||||
|
.. code-block:: make
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
#. Several variables can be used to customize OpenCV stuff, but you **don't need** to use them when your application uses the `async initialization` via the `OpenCV Manager` API.
|
||||||
|
|
||||||
|
Note: these variables should be set **before** the ``"include .../OpenCV.mk"`` line:
|
||||||
|
|
||||||
|
.. code-block:: make
|
||||||
|
|
||||||
|
OPENCV_INSTALL_MODULES:=on
|
||||||
|
|
||||||
|
Copies necessary OpenCV dynamic libs to the project ``libs`` folder in order to include them into the APK.
|
||||||
|
|
||||||
|
.. code-block:: make
|
||||||
|
|
||||||
|
OPENCV_CAMERA_MODULES:=off
|
||||||
|
|
||||||
|
Skip native OpenCV camera related libs copying to the project ``libs`` folder.
|
||||||
|
|
||||||
|
.. code-block:: make
|
||||||
|
|
||||||
|
OPENCV_LIB_TYPE:=STATIC
|
||||||
|
|
||||||
|
Perform static link with OpenCV. By default dynamic link is used and the project JNI lib depends on ``libopencv_java.so``.
|
||||||
|
|
||||||
|
#. The file :file:`Application.mk` should exist and should contain lines:
|
||||||
|
|
||||||
|
.. code-block:: make
|
||||||
|
|
||||||
|
APP_STL := gnustl_static
|
||||||
|
APP_CPPFLAGS := -frtti -fexceptions
|
||||||
|
|
||||||
|
Also the line like this one:
|
||||||
|
|
||||||
|
.. code-block:: make
|
||||||
|
|
||||||
|
APP_ABI := armeabi-v7a
|
||||||
|
|
||||||
|
should specify the application target platforms.
|
||||||
|
|
||||||
|
In some cases a linkage error (like ``"In function 'cv::toUtf16(std::basic_string<...>... undefined reference to 'mbstowcs'"``) happens
|
||||||
|
when building an application JNI library depending on OpenCV.
|
||||||
|
The following line in the :file:`Application.mk` usually fixes it:
|
||||||
|
|
||||||
|
.. code-block:: make
|
||||||
|
|
||||||
|
APP_PLATFORM := android-9
|
||||||
|
|
||||||
|
|
||||||
|
#. Either use :ref:`manual <NDK_build_cli>` ``ndk-build`` invocation or :ref:`setup Eclipse CDT Builder <Android_NDK_integration_with_Eclipse>` to build native JNI lib before Java part [re]build and APK creation.
|
||||||
|
|
||||||
|
**TBD:** move this info from tutorial v1 to part 1 of tutorial v2.
|
||||||
|
|
||||||
|
|
||||||
|
Hello OpenCV Sample
|
||||||
|
===================
|
||||||
|
|
||||||
|
Here are basic steps to guide you trough the process of creating a simple OpenCV-centric application.
|
||||||
|
It will be capable of accessing camera output, processing it and displaying the result.
|
||||||
|
|
||||||
|
#. Open Eclipse IDE, create a new clean workspace, create a new Android project (*File -> New -> Android Project*).
|
||||||
|
|
||||||
|
#. Set name, target, package and minSDKVersion accordingly.
|
||||||
|
|
||||||
|
#. Create a new class (*File -> New -> Class*). Name it for example: *HelloOpenCVView*.
|
||||||
|
.. image:: images/dev_OCV_new_class.png
|
||||||
|
:alt: Add a new class.
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
* It should extend *SurfaceView* class.
|
||||||
|
|
||||||
|
* It also should implement *SurfaceHolder.Callback*, *Runnable*.
|
||||||
|
|
||||||
|
#. Edit *HelloOpenCVView* class.
|
||||||
|
|
||||||
|
* Add an *import* line for *android.content.context*.
|
||||||
|
|
||||||
|
* Modify autogenerated stubs: *HelloOpenCVView*, *surfaceCreated*, *surfaceDestroyed* and *surfaceChanged*.
|
||||||
|
.. code-block:: java
|
||||||
|
|
||||||
|
package com.hello.opencv.test;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
public class HelloOpenCVView extends SurfaceView implements Callback, Runnable {
|
||||||
|
|
||||||
|
public HelloOpenCVView(Context context) {
|
||||||
|
super(context);
|
||||||
|
getHolder().addCallback(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void surfaceCreated(SurfaceHolder holder) {
|
||||||
|
(new Thread(this)).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void surfaceDestroyed(SurfaceHolder holder) {
|
||||||
|
cameraRelease();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void surfaceChanged(SurfaceHolder holder, int format, int width,
|
||||||
|
int height) {
|
||||||
|
cameraSetup(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
* Add *cameraOpen*, *cameraRelease* and *cameraSetup* voids as shown below.
|
||||||
|
|
||||||
|
* Also, don't forget to add the public void *run()* as follows:
|
||||||
|
|
||||||
|
.. code-block:: java
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
// TODO: loop { getFrame(), processFrame(), drawFrame() }
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean cameraOpen() {
|
||||||
|
return false; //TODO: open camera
|
||||||
|
}
|
||||||
|
|
||||||
|
private void cameraRelease() {
|
||||||
|
// TODO release camera
|
||||||
|
}
|
||||||
|
|
||||||
|
private void cameraSetup(int width, int height) {
|
||||||
|
// TODO setup camera
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
..
|
||||||
|
|
||||||
|
#. Create a new *Activity* (*New -> Other -> Android -> Android Activity*) and name it, for example: *HelloOpenCVActivity*. For this activity define *onCreate*, *onResume* and *onPause* voids.
|
||||||
|
.. code-block:: java
|
||||||
|
|
||||||
|
public void onCreate (Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
mView = new HelloOpenCVView(this);
|
||||||
|
setContentView (mView);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
mView.cameraRelease();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
if( !mView.cameraOpen() ) {
|
||||||
|
// MessageBox and exit app
|
||||||
|
AlertDialog ad = new AlertDialog.Builder(this).create();
|
||||||
|
ad.setCancelable(false); // This blocks the "BACK" button
|
||||||
|
ad.setMessage("Fatal error: can't open camera!");
|
||||||
|
ad.setButton("OK", new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
dialog.dismiss();
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
ad.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#. Add the following permissions to the AndroidManifest.xml file:
|
||||||
|
.. code-block:: xml
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
|
<uses-feature android:name="android.hardware.camera" />
|
||||||
|
<uses-feature android:name="android.hardware.camera.autofocus" />
|
||||||
|
|
||||||
|
#. Reference OpenCV library within your project properties.
|
||||||
|
.. image:: images/dev_OCV_reference.png
|
||||||
|
:alt: Reference OpenCV library.
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
#. We now need some code to handle the camera. Update the *HelloOpenCVView* class as follows:
|
||||||
|
.. code-block:: java
|
||||||
|
|
||||||
|
private VideoCapture mCamera;
|
||||||
|
|
||||||
|
public boolean cameraOpen() {
|
||||||
|
synchronized (this) {
|
||||||
|
cameraRelease();
|
||||||
|
mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID);
|
||||||
|
if (!mCamera.isOpened()) {
|
||||||
|
mCamera.release();
|
||||||
|
mCamera = null;
|
||||||
|
Log.e("HelloOpenCVView", "Failed to open native camera");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public void cameraRelease() {
|
||||||
|
synchronized(this) {
|
||||||
|
if (mCamera != null) {
|
||||||
|
mCamera.release();
|
||||||
|
mCamera = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void cameraSetup(int width, int height) {
|
||||||
|
synchronized (this) {
|
||||||
|
if (mCamera != null && mCamera.isOpened()) {
|
||||||
|
List<Size> sizes = mCamera.getSupportedPreviewSizes();
|
||||||
|
int mFrameWidth = width;
|
||||||
|
int mFrameHeight = height;
|
||||||
|
{ // selecting optimal camera preview size
|
||||||
|
double minDiff = Double.MAX_VALUE;
|
||||||
|
for (Size size : sizes) {
|
||||||
|
if (Math.abs(size.height - height) < minDiff) {
|
||||||
|
mFrameWidth = (int) size.width;
|
||||||
|
mFrameHeight = (int) size.height;
|
||||||
|
minDiff = Math.abs(size.height - height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mCamera.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, mFrameWidth);
|
||||||
|
mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#. The last step would be to update the *run()* void in *HelloOpenCVView* class as follows:
|
||||||
|
.. code-block:: java
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
while (true) {
|
||||||
|
Bitmap bmp = null;
|
||||||
|
synchronized (this) {
|
||||||
|
if (mCamera == null)
|
||||||
|
break;
|
||||||
|
if (!mCamera.grab())
|
||||||
|
break;
|
||||||
|
|
||||||
|
bmp = processFrame(mCamera);
|
||||||
|
}
|
||||||
|
if (bmp != null) {
|
||||||
|
Canvas canvas = getHolder().lockCanvas();
|
||||||
|
if (canvas != null) {
|
||||||
|
canvas.drawBitmap(bmp, (canvas.getWidth() - bmp.getWidth()) / 2,
|
||||||
|
(canvas.getHeight() - bmp.getHeight()) / 2, null);
|
||||||
|
getHolder().unlockCanvasAndPost(canvas);
|
||||||
|
|
||||||
|
}
|
||||||
|
bmp.recycle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Bitmap processFrame(VideoCapture capture) {
|
||||||
|
Mat mRgba = new Mat();
|
||||||
|
capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
|
||||||
|
//process mRgba
|
||||||
|
Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
|
||||||
|
try {
|
||||||
|
Utils.matToBitmap(mRgba, bmp);
|
||||||
|
} catch(Exception e) {
|
||||||
|
Log.e("processFrame", "Utils.matToBitmap() throws an exception: " + e.getMessage());
|
||||||
|
bmp.recycle();
|
||||||
|
bmp = null;
|
||||||
|
}
|
||||||
|
return bmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 20 KiB |
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
Binary file not shown.
After Width: | Height: | Size: 8.6 KiB |
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
@ -17,7 +17,7 @@ In this tutorial you will learn how to:
|
|||||||
Source Code
|
Source Code
|
||||||
===========
|
===========
|
||||||
|
|
||||||
Download the source code from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/introduction/display_image/display_image.cpp>`_.
|
Download the source code from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/introduction/display_image/display_image.cpp>`_.
|
||||||
|
|
||||||
.. literalinclude:: ../../../../samples/cpp/tutorial_code/introduction/display_image/display_image.cpp
|
.. literalinclude:: ../../../../samples/cpp/tutorial_code/introduction/display_image/display_image.cpp
|
||||||
:language: cpp
|
:language: cpp
|
||||||
|
File diff suppressed because one or more lines are too long
@ -106,7 +106,7 @@ Here you can read tutorials about how to set up your computer to work with the O
|
|||||||
.. tabularcolumns:: m{100pt} m{300pt}
|
.. tabularcolumns:: m{100pt} m{300pt}
|
||||||
.. cssclass:: toctableopencv
|
.. cssclass:: toctableopencv
|
||||||
|
|
||||||
================ ======================================================
|
================ =================================================
|
||||||
|AndroidBinPack| **Title:** :ref:`Android_Binary_Package`
|
|AndroidBinPack| **Title:** :ref:`Android_Binary_Package`
|
||||||
|
|
||||||
*Compatibility:* > OpenCV 2.3.1
|
*Compatibility:* > OpenCV 2.3.1
|
||||||
@ -115,17 +115,13 @@ Here you can read tutorials about how to set up your computer to work with the O
|
|||||||
|
|
||||||
You will learn how to setup OpenCV for Android platform!
|
You will learn how to setup OpenCV for Android platform!
|
||||||
|
|
||||||
================ ======================================================
|
================ =================================================
|
||||||
|
|
||||||
.. |AndroidBinPack| image:: images/android_logo.png
|
|
||||||
:height: 90pt
|
|
||||||
:width: 90pt
|
|
||||||
|
|
||||||
.. tabularcolumns:: m{100pt} m{300pt}
|
.. tabularcolumns:: m{100pt} m{300pt}
|
||||||
.. cssclass:: toctableopencv
|
.. cssclass:: toctableopencv
|
||||||
|
|
||||||
================ ======================================================
|
================ =================================================
|
||||||
|AndroidNDKPack| **Title:** :ref:`Android_Binary_Package_with_NDK`
|
|AndroidBinPack| **Title:** :ref:`Android_Binary_Package_with_NDK`
|
||||||
|
|
||||||
*Compatibility:* > OpenCV 2.3.1
|
*Compatibility:* > OpenCV 2.3.1
|
||||||
|
|
||||||
@ -133,12 +129,62 @@ Here you can read tutorials about how to set up your computer to work with the O
|
|||||||
|
|
||||||
You will learn how to work with C++ OpenCV code for Android platform
|
You will learn how to work with C++ OpenCV code for Android platform
|
||||||
|
|
||||||
================ ======================================================
|
================ =================================================
|
||||||
|
|
||||||
.. |AndroidNDKPack| image:: images/android_logo.png
|
.. |AndroidBinPack| image:: images/android_logo.png
|
||||||
:height: 90pt
|
:height: 90pt
|
||||||
:width: 90pt
|
:width: 90pt
|
||||||
|
|
||||||
|
|
||||||
|
* **Android** tutorials v2 [in progress]
|
||||||
|
|
||||||
|
.. tabularcolumns:: m{100pt} m{300pt}
|
||||||
|
.. cssclass:: toctableopencv
|
||||||
|
|
||||||
|
================ =================================================
|
||||||
|
|AndroidLogo| **Title:** :ref:`Android_Dev_Intro`
|
||||||
|
|
||||||
|
*Compatibility:* > OpenCV 2.4.2
|
||||||
|
|
||||||
|
*Author:* |Author_VsevolodG|
|
||||||
|
|
||||||
|
Not a tutorial, but a guide introducing Android development basics and environment setup
|
||||||
|
|
||||||
|
================ =================================================
|
||||||
|
|
||||||
|
.. tabularcolumns:: m{100pt} m{300pt}
|
||||||
|
.. cssclass:: toctableopencv
|
||||||
|
|
||||||
|
================ =================================================
|
||||||
|
|AndroidLogo| **Title:** :ref:`O4A_SDK`
|
||||||
|
|
||||||
|
*Compatibility:* > OpenCV 2.4.2
|
||||||
|
|
||||||
|
*Author:* |Author_VsevolodG|
|
||||||
|
|
||||||
|
OpenCV4Android SDK: general info, installation, running samples
|
||||||
|
|
||||||
|
================ =================================================
|
||||||
|
|
||||||
|
.. tabularcolumns:: m{100pt} m{300pt}
|
||||||
|
.. cssclass:: toctableopencv
|
||||||
|
|
||||||
|
================ =================================================
|
||||||
|
|AndroidLogo| **Title:** :ref:`dev_with_OCV_on_Android`
|
||||||
|
|
||||||
|
*Compatibility:* > OpenCV 2.4.2
|
||||||
|
|
||||||
|
*Author:* |Author_VsevolodG|
|
||||||
|
|
||||||
|
Development with OpenCV4Android SDK
|
||||||
|
|
||||||
|
================ =================================================
|
||||||
|
|
||||||
|
.. |AndroidLogo| image:: images/android_logo.png
|
||||||
|
:height: 90pt
|
||||||
|
:width: 90pt
|
||||||
|
|
||||||
|
|
||||||
* **iOS**
|
* **iOS**
|
||||||
|
|
||||||
.. tabularcolumns:: m{100pt} m{300pt}
|
.. tabularcolumns:: m{100pt} m{300pt}
|
||||||
@ -196,6 +242,9 @@ Here you can read tutorials about how to set up your computer to work with the O
|
|||||||
|
|
||||||
* **Want to contribute, and see your own work between the OpenCV tutorials?**
|
* **Want to contribute, and see your own work between the OpenCV tutorials?**
|
||||||
|
|
||||||
|
.. tabularcolumns:: m{100pt} m{300pt}
|
||||||
|
.. cssclass:: toctableopencv
|
||||||
|
|
||||||
=============== ======================================================
|
=============== ======================================================
|
||||||
|HowToWriteT| **Title:** :ref:`howToWriteTutorial`
|
|HowToWriteT| **Title:** :ref:`howToWriteTutorial`
|
||||||
|
|
||||||
@ -226,6 +275,9 @@ Here you can read tutorials about how to set up your computer to work with the O
|
|||||||
../windows_visual_studio_Opencv/windows_visual_studio_Opencv
|
../windows_visual_studio_Opencv/windows_visual_studio_Opencv
|
||||||
../android_binary_package/android_binary_package
|
../android_binary_package/android_binary_package
|
||||||
../android_binary_package/android_binary_package_using_with_NDK
|
../android_binary_package/android_binary_package_using_with_NDK
|
||||||
|
../android_binary_package/android_dev_intro
|
||||||
|
../android_binary_package/O4A_SDK
|
||||||
|
../android_binary_package/dev_with_OCV_on_Android
|
||||||
../ios_install/ios_install
|
../ios_install/ios_install
|
||||||
../display_image/display_image
|
../display_image/display_image
|
||||||
../load_save_image/load_save_image
|
../load_save_image/load_save_image
|
||||||
|
@ -22,7 +22,7 @@ Theory
|
|||||||
Code
|
Code
|
||||||
====
|
====
|
||||||
|
|
||||||
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/objectDetection/objectDetection.cpp>`_ . The second version (using LBP for face detection) can be `found here <http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/tutorial_code/objectDetection/objectDetection2.cpp>`_
|
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/objectDetection/objectDetection.cpp>`_ . The second version (using LBP for face detection) can be `found here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/objectDetection/objectDetection2.cpp>`_
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
OpenCV Tutorials
|
OpenCV Tutorials
|
||||||
################
|
################
|
||||||
|
|
||||||
The following links describe a set of basic OpenCV tutorials. All the source code mentioned here is provide as part of the OpenCV regular releases, so check before you start copy & pasting the code. The list of tutorials below is automatically generated from reST files located in our SVN repository.
|
The following links describe a set of basic OpenCV tutorials. All the source code mentioned here is provide as part of the OpenCV regular releases, so check before you start copy & pasting the code. The list of tutorials below is automatically generated from reST files located in our GIT repository.
|
||||||
|
|
||||||
As always, we would be happy to hear your comments and receive your contributions on any tutorial.
|
As always, we would be happy to hear your comments and receive your contributions on any tutorial.
|
||||||
|
|
||||||
|
@ -130,4 +130,4 @@ Flags specifing the needed generator type must be used in combination with parti
|
|||||||
|
|
||||||
For more information please refer to the example of usage openni_capture.cpp_ in ``opencv/samples/cpp`` folder.
|
For more information please refer to the example of usage openni_capture.cpp_ in ``opencv/samples/cpp`` folder.
|
||||||
|
|
||||||
.. _openni_capture.cpp: http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/openni_capture.cpp
|
.. _openni_capture.cpp: http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/openni_capture.cpp
|
||||||
|
@ -6,7 +6,7 @@ The built framework is universal, it can be used to build app and run it on eith
|
|||||||
Usage:
|
Usage:
|
||||||
./build_framework.py <outputdir>
|
./build_framework.py <outputdir>
|
||||||
|
|
||||||
By cmake conventions (and especially if you work with OpenCV SVN repository),
|
By cmake conventions (and especially if you work with OpenCV repository),
|
||||||
the output dir should not be a subdirectory of OpenCV source tree.
|
the output dir should not be a subdirectory of OpenCV source tree.
|
||||||
|
|
||||||
Script will create <outputdir>, if it's missing, and a few its subdirectories:
|
Script will create <outputdir>, if it's missing, and a few its subdirectories:
|
||||||
|
@ -67,11 +67,12 @@ StereoVar::~StereoVar()
|
|||||||
|
|
||||||
static Mat diffX(Mat &src)
|
static Mat diffX(Mat &src)
|
||||||
{
|
{
|
||||||
register int x, y, cols = src.cols - 1;
|
int cols = src.cols - 1;
|
||||||
Mat dst(src.size(), src.type());
|
Mat dst(src.size(), src.type());
|
||||||
for(y = 0; y < src.rows; y++){
|
for(int y = 0; y < src.rows; y++){
|
||||||
const float* pSrc = src.ptr<float>(y);
|
const float* pSrc = src.ptr<float>(y);
|
||||||
float* pDst = dst.ptr<float>(y);
|
float* pDst = dst.ptr<float>(y);
|
||||||
|
int x = 0;
|
||||||
#if CV_SSE2
|
#if CV_SSE2
|
||||||
for (x = 0; x <= cols - 8; x += 8) {
|
for (x = 0; x <= cols - 8; x += 8) {
|
||||||
__m128 a0 = _mm_loadu_ps(pSrc + x);
|
__m128 a0 = _mm_loadu_ps(pSrc + x);
|
||||||
|
@ -2446,6 +2446,6 @@ The above methods are usually enough for users. If you want to make your own alg
|
|||||||
* Make a class and specify ``Algorithm`` as its base class.
|
* Make a class and specify ``Algorithm`` as its base class.
|
||||||
* The algorithm parameters should be the class members. See ``Algorithm::get()`` for the list of possible types of the parameters.
|
* The algorithm parameters should be the class members. See ``Algorithm::get()`` for the list of possible types of the parameters.
|
||||||
* Add public virtual method ``AlgorithmInfo* info() const;`` to your class.
|
* Add public virtual method ``AlgorithmInfo* info() const;`` to your class.
|
||||||
* Add constructor function, ``AlgorithmInfo`` instance and implement the ``info()`` method. The simplest way is to take http://code.opencv.org/svn/opencv/trunk/opencv/modules/ml/src/ml_init.cpp as the reference and modify it according to the list of your parameters.
|
* Add constructor function, ``AlgorithmInfo`` instance and implement the ``info()`` method. The simplest way is to take http://code.opencv.org/projects/opencv/repository/revisions/master/entry/modules/ml/src/ml_init.cpp as the reference and modify it according to the list of your parameters.
|
||||||
* Add some public function (e.g. ``initModule_<mymodule>()``) that calls info() of your algorithm and put it into the same source file as ``info()`` implementation. This is to force C++ linker to include this object file into the target application. See ``Algorithm::create()`` for details.
|
* Add some public function (e.g. ``initModule_<mymodule>()``) that calls info() of your algorithm and put it into the same source file as ``info()`` implementation. This is to force C++ linker to include this object file into the target application. See ``Algorithm::create()`` for details.
|
||||||
|
|
||||||
|
@ -1024,7 +1024,7 @@ double cv::invert( InputArray _src, OutputArray _dst, int method )
|
|||||||
__m128 s0 = _mm_or_ps(t0, t1);
|
__m128 s0 = _mm_or_ps(t0, t1);
|
||||||
__m128 det =_mm_set1_ps((float)d);
|
__m128 det =_mm_set1_ps((float)d);
|
||||||
s0 = _mm_mul_ps(s0, det);
|
s0 = _mm_mul_ps(s0, det);
|
||||||
const uchar CV_DECL_ALIGNED(16) inv[16] = {0,0,0,0,0,0,0,0x80,0,0,0,0x80,0,0,0,0};
|
static const uchar CV_DECL_ALIGNED(16) inv[16] = {0,0,0,0,0,0,0,0x80,0,0,0,0x80,0,0,0,0};
|
||||||
__m128 pattern = _mm_load_ps((const float*)inv);
|
__m128 pattern = _mm_load_ps((const float*)inv);
|
||||||
s0 = _mm_xor_ps(s0, pattern);//==-1*s0
|
s0 = _mm_xor_ps(s0, pattern);//==-1*s0
|
||||||
s0 = _mm_shuffle_ps(s0, s0, _MM_SHUFFLE(0,2,1,3));
|
s0 = _mm_shuffle_ps(s0, s0, _MM_SHUFFLE(0,2,1,3));
|
||||||
@ -1064,7 +1064,7 @@ double cv::invert( InputArray _src, OutputArray _dst, int method )
|
|||||||
__m128d det = _mm_load1_pd((const double*)&d);
|
__m128d det = _mm_load1_pd((const double*)&d);
|
||||||
sm = _mm_mul_pd(sm, det);
|
sm = _mm_mul_pd(sm, det);
|
||||||
|
|
||||||
uchar CV_DECL_ALIGNED(16) inv[8] = {0,0,0,0,0,0,0,0x80};
|
static const uchar CV_DECL_ALIGNED(16) inv[8] = {0,0,0,0,0,0,0,0x80};
|
||||||
__m128d pattern = _mm_load1_pd((double*)inv);
|
__m128d pattern = _mm_load1_pd((double*)inv);
|
||||||
ss = _mm_mul_pd(ss, det);
|
ss = _mm_mul_pd(ss, det);
|
||||||
ss = _mm_xor_pd(ss, pattern);//==-1*ss
|
ss = _mm_xor_pd(ss, pattern);//==-1*ss
|
||||||
@ -1097,9 +1097,50 @@ double cv::invert( InputArray _src, OutputArray _dst, int method )
|
|||||||
double d = det3(Sf);
|
double d = det3(Sf);
|
||||||
if( d != 0. )
|
if( d != 0. )
|
||||||
{
|
{
|
||||||
|
float CV_DECL_ALIGNED(16) t[12];
|
||||||
|
|
||||||
result = true;
|
result = true;
|
||||||
d = 1./d;
|
d = 1./d;
|
||||||
float t[9];
|
#if CV_SSE2
|
||||||
|
if(USE_SSE2)
|
||||||
|
{
|
||||||
|
__m128 det =_mm_set1_ps((float)d);
|
||||||
|
__m128 s0 = _mm_loadu_ps((const float*)srcdata);//s0 = Sf(0,0) Sf(0,1) Sf(0,2) ***
|
||||||
|
__m128 s1 = _mm_loadu_ps((const float*)(srcdata+srcstep));//s1 = Sf(1,0) Sf(1,1) Sf(1,2) ***
|
||||||
|
__m128 s2 = _mm_set_ps(0.f, Sf(2,2), Sf(2,1), Sf(2,0)); //s2 = Sf(2,0) Sf(2,1) Sf(2,2) ***
|
||||||
|
|
||||||
|
__m128 r0 = _mm_shuffle_ps(s1,s1,_MM_SHUFFLE(3,0,2,1)); //r0 = Sf(1,1) Sf(1,2) Sf(1,0) ***
|
||||||
|
__m128 r1 = _mm_shuffle_ps(s2,s2,_MM_SHUFFLE(3,1,0,2)); //r1 = Sf(2,2) Sf(2,0) Sf(2,1) ***
|
||||||
|
__m128 r2 = _mm_shuffle_ps(s2,s2,_MM_SHUFFLE(3,0,2,1)); //r2 = Sf(2,1) Sf(2,2) Sf(2,0) ***
|
||||||
|
|
||||||
|
__m128 t0 = _mm_mul_ps(s0, r0);//t0 = Sf(0,0)*Sf(1,1) Sf(0,1)*Sf(1,2) Sf(0,2)*Sf(1,0) ***
|
||||||
|
__m128 t1 = _mm_mul_ps(s0, r1);//t1 = Sf(0,0)*Sf(2,2) Sf(0,1)*Sf(2,0) Sf(0,2)*Sf(2,1) ***
|
||||||
|
__m128 t2 = _mm_mul_ps(s1, r2);//t2 = Sf(1,0)*Sf(2,1) Sf(1,1)*Sf(2,2) Sf(1,2)*Sf(2,0) ***
|
||||||
|
|
||||||
|
__m128 r3 = _mm_shuffle_ps(s0,s0,_MM_SHUFFLE(3,0,2,1));//r3 = Sf(0,1) Sf(0,2) Sf(0,0) ***
|
||||||
|
__m128 r4 = _mm_shuffle_ps(s0,s0,_MM_SHUFFLE(3,1,0,2));//r4 = Sf(0,2) Sf(0,0) Sf(0,1) ***
|
||||||
|
|
||||||
|
__m128 t00 = _mm_mul_ps(s1, r3);//t00 = Sf(1,0)*Sf(0,1) Sf(1,1)*Sf(0,2) Sf(1,2)*Sf(0,0) ***
|
||||||
|
__m128 t11 = _mm_mul_ps(s2, r4);//t11 = Sf(2,0)*Sf(0,2) Sf(2,1)*Sf(0,0) Sf(2,2)*Sf(0,1) ***
|
||||||
|
__m128 t22 = _mm_mul_ps(s2, r0);//t22 = Sf(2,0)*Sf(1,1) Sf(2,1)*Sf(1,2) Sf(2,2)*Sf(1,0) ***
|
||||||
|
|
||||||
|
t0 = _mm_mul_ps(_mm_sub_ps(t0,t00), det);//Sf(0,0)*Sf(1,1) Sf(0,1)*Sf(1,2) Sf(0,2)*Sf(1,0) ***
|
||||||
|
//-Sf(1,0)*Sf(0,1) -Sf(1,1)*Sf(0,2) -Sf(1,2)*Sf(0,0)
|
||||||
|
t1 = _mm_mul_ps(_mm_sub_ps(t1,t11), det);//Sf(0,0)*Sf(2,2) Sf(0,1)*Sf(2,0) Sf(0,2)*Sf(2,1) ***
|
||||||
|
//-Sf(2,0)*Sf(0,2) -Sf(2,1)*Sf(0,0) -Sf(2,2)*Sf(0,1)
|
||||||
|
t2 = _mm_mul_ps(_mm_sub_ps(t2,t22), det);//Sf(1,0)*Sf(2,1) Sf(1,1)*Sf(2,2) Sf(1,2)*Sf(2,0) ***
|
||||||
|
//-Sf(2,0)*Sf(1,1) -Sf(2,1)*Sf(1,2) -Sf(2,2)*Sf(1,0)
|
||||||
|
_mm_store_ps(t, t0);
|
||||||
|
_mm_store_ps(t+4, t1);
|
||||||
|
_mm_store_ps(t+8, t2);
|
||||||
|
|
||||||
|
Df(0,0) = t[9]; Df(0,1) = t[6]; Df(0,2) = t[1];
|
||||||
|
Df(1,0) = t[10]; Df(1,1) = t[4]; Df(1,2) = t[2];
|
||||||
|
Df(2,0) = t[8]; Df(2,1) = t[5]; Df(2,2) = t[0];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
t[0] = (float)(((double)Sf(1,1) * Sf(2,2) - (double)Sf(1,2) * Sf(2,1)) * d);
|
t[0] = (float)(((double)Sf(1,1) * Sf(2,2) - (double)Sf(1,2) * Sf(2,1)) * d);
|
||||||
t[1] = (float)(((double)Sf(0,2) * Sf(2,1) - (double)Sf(0,1) * Sf(2,2)) * d);
|
t[1] = (float)(((double)Sf(0,2) * Sf(2,1) - (double)Sf(0,1) * Sf(2,2)) * d);
|
||||||
t[2] = (float)(((double)Sf(0,1) * Sf(1,2) - (double)Sf(0,2) * Sf(1,1)) * d);
|
t[2] = (float)(((double)Sf(0,1) * Sf(1,2) - (double)Sf(0,2) * Sf(1,1)) * d);
|
||||||
@ -1117,6 +1158,7 @@ double cv::invert( InputArray _src, OutputArray _dst, int method )
|
|||||||
Df(2,0) = t[6]; Df(2,1) = t[7]; Df(2,2) = t[8];
|
Df(2,0) = t[6]; Df(2,1) = t[7]; Df(2,2) = t[8];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
double d = det3(Sd);
|
double d = det3(Sd);
|
||||||
|
@ -148,7 +148,7 @@ Wrapping class for feature detection using the
|
|||||||
class FastFeatureDetector : public FeatureDetector
|
class FastFeatureDetector : public FeatureDetector
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FastFeatureDetector( int threshold=1, bool nonmaxSuppression=true );
|
FastFeatureDetector( int threshold=1, bool nonmaxSuppression=true, type=FastFeatureDetector::TYPE_9_16 );
|
||||||
virtual void read( const FileNode& fn );
|
virtual void read( const FileNode& fn );
|
||||||
virtual void write( FileStorage& fs ) const;
|
virtual void write( FileStorage& fs ) const;
|
||||||
protected:
|
protected:
|
||||||
|
@ -7,7 +7,7 @@ FAST
|
|||||||
--------
|
--------
|
||||||
Detects corners using the FAST algorithm
|
Detects corners using the FAST algorithm
|
||||||
|
|
||||||
.. ocv:function:: void FAST( InputArray image, vector<KeyPoint>& keypoints, int threshold, bool nonmaxSupression=true )
|
.. ocv:function:: void FAST( InputArray image, vector<KeyPoint>& keypoints, int threshold, bool nonmaxSupression=true, type=FastFeatureDetector::TYPE_9_16 )
|
||||||
|
|
||||||
:param image: Image where keypoints (corners) are detected.
|
:param image: Image where keypoints (corners) are detected.
|
||||||
|
|
||||||
@ -17,6 +17,8 @@ Detects corners using the FAST algorithm
|
|||||||
|
|
||||||
:param nonmaxSupression: If it is true, non-maximum suppression is applied to detected corners (keypoints).
|
:param nonmaxSupression: If it is true, non-maximum suppression is applied to detected corners (keypoints).
|
||||||
|
|
||||||
|
:param type: one of the three neighborhoods as defined in the paper: ``FastFeatureDetector::TYPE_9_16``, ``FastFeatureDetector::TYPE_7_12``, ``FastFeatureDetector::TYPE_5_8``
|
||||||
|
|
||||||
Detects corners using the FAST algorithm by [Rosten06]_.
|
Detects corners using the FAST algorithm by [Rosten06]_.
|
||||||
|
|
||||||
.. [Rosten06] E. Rosten. Machine Learning for High-speed Corner Detection, 2006.
|
.. [Rosten06] E. Rosten. Machine Learning for High-speed Corner Detection, 2006.
|
||||||
|
@ -350,7 +350,7 @@ int cornerScore<8>(const uchar* ptr, const int pixel[], int threshold)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int b0 = -a0;
|
int b0 = -a0;
|
||||||
for( k = 0; k < 12; k += 2 )
|
for( k = 0; k < 8; k += 2 )
|
||||||
{
|
{
|
||||||
int b = std::max((int)d[k+1], (int)d[k+2]);
|
int b = std::max((int)d[k+1], (int)d[k+2]);
|
||||||
b = std::max(b, (int)d[k+3]);
|
b = std::max(b, (int)d[k+3]);
|
||||||
@ -375,7 +375,10 @@ template<int patternSize>
|
|||||||
void FAST_t(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, bool nonmax_suppression)
|
void FAST_t(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, bool nonmax_suppression)
|
||||||
{
|
{
|
||||||
Mat img = _img.getMat();
|
Mat img = _img.getMat();
|
||||||
const int K = patternSize/2, N = patternSize + K + 1, quarterPatternSize = patternSize/4;
|
const int K = patternSize/2, N = patternSize + K + 1;
|
||||||
|
#if CV_SSE2
|
||||||
|
const int quarterPatternSize = patternSize/4;
|
||||||
|
#endif
|
||||||
int i, j, k, pixel[25];
|
int i, j, k, pixel[25];
|
||||||
makeOffsets(pixel, (int)img.step, patternSize);
|
makeOffsets(pixel, (int)img.step, patternSize);
|
||||||
for(k = patternSize; k < 25; k++)
|
for(k = patternSize; k < 25; k++)
|
||||||
|
@ -59,5 +59,5 @@ While developing algorithms for multiple GPUs, note a data passing overhead. For
|
|||||||
With this algorithm, a dual GPU gave a 180
|
With this algorithm, a dual GPU gave a 180
|
||||||
%
|
%
|
||||||
performance increase comparing to the single Fermi GPU. For a source code example, see
|
performance increase comparing to the single Fermi GPU. For a source code example, see
|
||||||
http://code.opencv.org/svn/opencv/trunk/opencv/samples/gpu/.
|
http://code.opencv.org/projects/opencv/repository/revisions/master/entry/samples/gpu/.
|
||||||
|
|
||||||
|
@ -917,6 +917,12 @@ CV_EXPORTS void graphcut(GpuMat& terminals, GpuMat& leftTransp, GpuMat& rightTra
|
|||||||
GpuMat& labels,
|
GpuMat& labels,
|
||||||
GpuMat& buf, Stream& stream = Stream::Null());
|
GpuMat& buf, Stream& stream = Stream::Null());
|
||||||
|
|
||||||
|
//! compute mask for Generalized Flood fill componetns labeling.
|
||||||
|
CV_EXPORTS void connectivityMask(const GpuMat& image, GpuMat& mask, const cv::Scalar& lo, const cv::Scalar& hi, Stream& stream = Stream::Null());
|
||||||
|
|
||||||
|
//! performs connected componnents labeling.
|
||||||
|
CV_EXPORTS void labelComponents(const GpuMat& mask, GpuMat& components, Stream& stream = Stream::Null());
|
||||||
|
|
||||||
////////////////////////////////// Histograms //////////////////////////////////
|
////////////////////////////////// Histograms //////////////////////////////////
|
||||||
|
|
||||||
//! Compute levels with even distribution. levels will have 1 row and nLevels cols and CV_32SC1 type.
|
//! Compute levels with even distribution. levels will have 1 row and nLevels cols and CV_32SC1 type.
|
||||||
|
@ -1148,6 +1148,9 @@ GPU_PERF_TEST(CvtColor, cv::gpu::DeviceInfo, cv::Size, MatDepth, CvtColorInfo)
|
|||||||
cv::gpu::GpuMat src(src_host);
|
cv::gpu::GpuMat src(src_host);
|
||||||
cv::gpu::GpuMat dst;
|
cv::gpu::GpuMat dst;
|
||||||
|
|
||||||
|
if (info.code >= cv::COLOR_BayerBG2BGR && info.code <= cv::COLOR_BayerGR2BGR)
|
||||||
|
info.dcn = 4;
|
||||||
|
|
||||||
cv::gpu::cvtColor(src, dst, info.code, info.dcn);
|
cv::gpu::cvtColor(src, dst, info.code, info.dcn);
|
||||||
|
|
||||||
TEST_CYCLE()
|
TEST_CYCLE()
|
||||||
@ -1172,7 +1175,20 @@ INSTANTIATE_TEST_CASE_P(ImgProc, CvtColor, testing::Combine(
|
|||||||
CvtColorInfo(3, 3, cv::COLOR_BGR2HSV),
|
CvtColorInfo(3, 3, cv::COLOR_BGR2HSV),
|
||||||
CvtColorInfo(3, 3, cv::COLOR_HSV2BGR),
|
CvtColorInfo(3, 3, cv::COLOR_HSV2BGR),
|
||||||
CvtColorInfo(3, 3, cv::COLOR_BGR2HLS),
|
CvtColorInfo(3, 3, cv::COLOR_BGR2HLS),
|
||||||
CvtColorInfo(3, 3, cv::COLOR_HLS2BGR))));
|
CvtColorInfo(3, 3, cv::COLOR_HLS2BGR),
|
||||||
|
CvtColorInfo(3, 3, cv::COLOR_BGR2Lab),
|
||||||
|
CvtColorInfo(3, 3, cv::COLOR_RGB2Lab),
|
||||||
|
CvtColorInfo(3, 3, cv::COLOR_BGR2Luv),
|
||||||
|
CvtColorInfo(3, 3, cv::COLOR_RGB2Luv),
|
||||||
|
CvtColorInfo(3, 3, cv::COLOR_Lab2BGR),
|
||||||
|
CvtColorInfo(3, 3, cv::COLOR_Lab2RGB),
|
||||||
|
CvtColorInfo(3, 3, cv::COLOR_Luv2BGR),
|
||||||
|
CvtColorInfo(3, 3, cv::COLOR_Luv2RGB),
|
||||||
|
CvtColorInfo(1, 3, cv::COLOR_BayerBG2BGR),
|
||||||
|
CvtColorInfo(1, 3, cv::COLOR_BayerGB2BGR),
|
||||||
|
CvtColorInfo(1, 3, cv::COLOR_BayerRG2BGR),
|
||||||
|
CvtColorInfo(1, 3, cv::COLOR_BayerGR2BGR),
|
||||||
|
CvtColorInfo(4, 4, cv::COLOR_RGBA2mRGBA))));
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
// SwapChannels
|
// SwapChannels
|
||||||
|
@ -65,19 +65,19 @@ void PrintTo(const CvtColorInfo& info, ostream* os)
|
|||||||
"BGR2HSV",
|
"BGR2HSV",
|
||||||
"RGB2HSV",
|
"RGB2HSV",
|
||||||
|
|
||||||
0,
|
"",
|
||||||
0,
|
"",
|
||||||
|
|
||||||
0,
|
"BGR2Lab",
|
||||||
0,
|
"RGB2Lab",
|
||||||
|
|
||||||
0,
|
"BayerBG2BGR",
|
||||||
0,
|
"BayerGB2BGR",
|
||||||
0,
|
"BayerRG2BGR",
|
||||||
0,
|
"BayerGR2BGR",
|
||||||
|
|
||||||
0,
|
"BGR2Luv",
|
||||||
0,
|
"RGB2Luv",
|
||||||
|
|
||||||
"BGR2HLS",
|
"BGR2HLS",
|
||||||
"RGB2HLS",
|
"RGB2HLS",
|
||||||
@ -85,18 +85,18 @@ void PrintTo(const CvtColorInfo& info, ostream* os)
|
|||||||
"HSV2BGR",
|
"HSV2BGR",
|
||||||
"HSV2RGB",
|
"HSV2RGB",
|
||||||
|
|
||||||
0,
|
"Lab2BGR",
|
||||||
0,
|
"Lab2RGB",
|
||||||
0,
|
"Luv2BGR",
|
||||||
0,
|
"Luv2RGB",
|
||||||
|
|
||||||
"HLS2BGR",
|
"HLS2BGR",
|
||||||
"HLS2RGB",
|
"HLS2RGB",
|
||||||
|
|
||||||
0,
|
"BayerBG2BGR_VNG",
|
||||||
0,
|
"BayerGB2BGR_VNG",
|
||||||
0,
|
"BayerRG2BGR_VNG",
|
||||||
0,
|
"BayerGR2BGR_VNG",
|
||||||
|
|
||||||
"BGR2HSV_FULL",
|
"BGR2HSV_FULL",
|
||||||
"RGB2HSV_FULL",
|
"RGB2HSV_FULL",
|
||||||
@ -108,30 +108,78 @@ void PrintTo(const CvtColorInfo& info, ostream* os)
|
|||||||
"HLS2BGR_FULL",
|
"HLS2BGR_FULL",
|
||||||
"HLS2RGB_FULL",
|
"HLS2RGB_FULL",
|
||||||
|
|
||||||
0,
|
"LBGR2Lab",
|
||||||
0,
|
"LRGB2Lab",
|
||||||
0,
|
"LBGR2Luv",
|
||||||
0,
|
"LRGB2Luv",
|
||||||
|
|
||||||
0,
|
"Lab2LBGR",
|
||||||
0,
|
"Lab2LRGB",
|
||||||
0,
|
"Luv2LBGR",
|
||||||
0,
|
"Luv2LRGB",
|
||||||
|
|
||||||
"BGR2YUV",
|
"BGR2YUV",
|
||||||
"RGB2YUV",
|
"RGB2YUV",
|
||||||
"YUV2BGR",
|
"YUV2BGR",
|
||||||
"YUV2RGB",
|
"YUV2RGB",
|
||||||
|
|
||||||
0,
|
"BayerBG2GRAY",
|
||||||
0,
|
"BayerGB2GRAY",
|
||||||
0,
|
"BayerRG2GRAY",
|
||||||
0,
|
"BayerGR2GRAY",
|
||||||
|
|
||||||
0,
|
//YUV 4:2:0 formats family
|
||||||
0,
|
"YUV2RGB_NV12",
|
||||||
0,
|
"YUV2BGR_NV12",
|
||||||
0
|
"YUV2RGB_NV21",
|
||||||
|
"YUV2BGR_NV21",
|
||||||
|
|
||||||
|
"YUV2RGBA_NV12",
|
||||||
|
"YUV2BGRA_NV12",
|
||||||
|
"YUV2RGBA_NV21",
|
||||||
|
"YUV2BGRA_NV21",
|
||||||
|
|
||||||
|
"YUV2RGB_YV12",
|
||||||
|
"YUV2BGR_YV12",
|
||||||
|
"YUV2RGB_IYUV",
|
||||||
|
"YUV2BGR_IYUV",
|
||||||
|
|
||||||
|
"YUV2RGBA_YV12",
|
||||||
|
"YUV2BGRA_YV12",
|
||||||
|
"YUV2RGBA_IYUV",
|
||||||
|
"YUV2BGRA_IYUV",
|
||||||
|
|
||||||
|
"YUV2GRAY_420",
|
||||||
|
|
||||||
|
//YUV 4:2:2 formats family
|
||||||
|
"YUV2RGB_UYVY",
|
||||||
|
"YUV2BGR_UYVY",
|
||||||
|
"YUV2RGB_VYUY",
|
||||||
|
"YUV2BGR_VYUY",
|
||||||
|
|
||||||
|
"YUV2RGBA_UYVY",
|
||||||
|
"YUV2BGRA_UYVY",
|
||||||
|
"YUV2RGBA_VYUY",
|
||||||
|
"YUV2BGRA_VYUY",
|
||||||
|
|
||||||
|
"YUV2RGB_YUY2",
|
||||||
|
"YUV2BGR_YUY2",
|
||||||
|
"YUV2RGB_YVYU",
|
||||||
|
"YUV2BGR_YVYU",
|
||||||
|
|
||||||
|
"YUV2RGBA_YUY2",
|
||||||
|
"YUV2BGRA_YUY2",
|
||||||
|
"YUV2RGBA_YVYU",
|
||||||
|
"YUV2BGRA_YVYU",
|
||||||
|
|
||||||
|
"YUV2GRAY_UYVY",
|
||||||
|
"YUV2GRAY_YUY2",
|
||||||
|
|
||||||
|
// alpha premultiplication
|
||||||
|
"RGBA2mRGBA",
|
||||||
|
"mRGBA2RGBA",
|
||||||
|
|
||||||
|
"COLORCVT_MAX"
|
||||||
};
|
};
|
||||||
|
|
||||||
*os << str[info.code];
|
*os << str[info.code];
|
||||||
|
@ -712,6 +712,19 @@ INSTANTIATE_TEST_CASE_P(ImgProc, CvtColor, testing::Combine(
|
|||||||
CvtColorInfo(3, 3, cv::COLOR_BGR2HSV),
|
CvtColorInfo(3, 3, cv::COLOR_BGR2HSV),
|
||||||
CvtColorInfo(3, 3, cv::COLOR_HSV2BGR),
|
CvtColorInfo(3, 3, cv::COLOR_HSV2BGR),
|
||||||
CvtColorInfo(3, 3, cv::COLOR_BGR2HLS),
|
CvtColorInfo(3, 3, cv::COLOR_BGR2HLS),
|
||||||
CvtColorInfo(3, 3, cv::COLOR_HLS2BGR))));
|
CvtColorInfo(3, 3, cv::COLOR_HLS2BGR),
|
||||||
|
CvtColorInfo(3, 3, cv::COLOR_BGR2Lab),
|
||||||
|
CvtColorInfo(3, 3, cv::COLOR_RGB2Lab),
|
||||||
|
CvtColorInfo(3, 3, cv::COLOR_BGR2Luv),
|
||||||
|
CvtColorInfo(3, 3, cv::COLOR_RGB2Luv),
|
||||||
|
CvtColorInfo(3, 3, cv::COLOR_Lab2BGR),
|
||||||
|
CvtColorInfo(3, 3, cv::COLOR_Lab2RGB),
|
||||||
|
CvtColorInfo(3, 3, cv::COLOR_Luv2BGR),
|
||||||
|
CvtColorInfo(3, 3, cv::COLOR_Luv2RGB),
|
||||||
|
CvtColorInfo(1, 3, cv::COLOR_BayerBG2BGR),
|
||||||
|
CvtColorInfo(1, 3, cv::COLOR_BayerGB2BGR),
|
||||||
|
CvtColorInfo(1, 3, cv::COLOR_BayerRG2BGR),
|
||||||
|
CvtColorInfo(1, 3, cv::COLOR_BayerGR2BGR),
|
||||||
|
CvtColorInfo(4, 4, cv::COLOR_RGBA2mRGBA))));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -65,19 +65,19 @@ void PrintTo(const CvtColorInfo& info, ostream* os)
|
|||||||
"BGR2HSV",
|
"BGR2HSV",
|
||||||
"RGB2HSV",
|
"RGB2HSV",
|
||||||
|
|
||||||
0,
|
"",
|
||||||
0,
|
"",
|
||||||
|
|
||||||
0,
|
"BGR2Lab",
|
||||||
0,
|
"RGB2Lab",
|
||||||
|
|
||||||
0,
|
"BayerBG2BGR",
|
||||||
0,
|
"BayerGB2BGR",
|
||||||
0,
|
"BayerRG2BGR",
|
||||||
0,
|
"BayerGR2BGR",
|
||||||
|
|
||||||
0,
|
"BGR2Luv",
|
||||||
0,
|
"RGB2Luv",
|
||||||
|
|
||||||
"BGR2HLS",
|
"BGR2HLS",
|
||||||
"RGB2HLS",
|
"RGB2HLS",
|
||||||
@ -85,18 +85,18 @@ void PrintTo(const CvtColorInfo& info, ostream* os)
|
|||||||
"HSV2BGR",
|
"HSV2BGR",
|
||||||
"HSV2RGB",
|
"HSV2RGB",
|
||||||
|
|
||||||
0,
|
"Lab2BGR",
|
||||||
0,
|
"Lab2RGB",
|
||||||
0,
|
"Luv2BGR",
|
||||||
0,
|
"Luv2RGB",
|
||||||
|
|
||||||
"HLS2BGR",
|
"HLS2BGR",
|
||||||
"HLS2RGB",
|
"HLS2RGB",
|
||||||
|
|
||||||
0,
|
"BayerBG2BGR_VNG",
|
||||||
0,
|
"BayerGB2BGR_VNG",
|
||||||
0,
|
"BayerRG2BGR_VNG",
|
||||||
0,
|
"BayerGR2BGR_VNG",
|
||||||
|
|
||||||
"BGR2HSV_FULL",
|
"BGR2HSV_FULL",
|
||||||
"RGB2HSV_FULL",
|
"RGB2HSV_FULL",
|
||||||
@ -108,30 +108,78 @@ void PrintTo(const CvtColorInfo& info, ostream* os)
|
|||||||
"HLS2BGR_FULL",
|
"HLS2BGR_FULL",
|
||||||
"HLS2RGB_FULL",
|
"HLS2RGB_FULL",
|
||||||
|
|
||||||
0,
|
"LBGR2Lab",
|
||||||
0,
|
"LRGB2Lab",
|
||||||
0,
|
"LBGR2Luv",
|
||||||
0,
|
"LRGB2Luv",
|
||||||
|
|
||||||
0,
|
"Lab2LBGR",
|
||||||
0,
|
"Lab2LRGB",
|
||||||
0,
|
"Luv2LBGR",
|
||||||
0,
|
"Luv2LRGB",
|
||||||
|
|
||||||
"BGR2YUV",
|
"BGR2YUV",
|
||||||
"RGB2YUV",
|
"RGB2YUV",
|
||||||
"YUV2BGR",
|
"YUV2BGR",
|
||||||
"YUV2RGB",
|
"YUV2RGB",
|
||||||
|
|
||||||
0,
|
"BayerBG2GRAY",
|
||||||
0,
|
"BayerGB2GRAY",
|
||||||
0,
|
"BayerRG2GRAY",
|
||||||
0,
|
"BayerGR2GRAY",
|
||||||
|
|
||||||
0,
|
//YUV 4:2:0 formats family
|
||||||
0,
|
"YUV2RGB_NV12",
|
||||||
0,
|
"YUV2BGR_NV12",
|
||||||
0
|
"YUV2RGB_NV21",
|
||||||
|
"YUV2BGR_NV21",
|
||||||
|
|
||||||
|
"YUV2RGBA_NV12",
|
||||||
|
"YUV2BGRA_NV12",
|
||||||
|
"YUV2RGBA_NV21",
|
||||||
|
"YUV2BGRA_NV21",
|
||||||
|
|
||||||
|
"YUV2RGB_YV12",
|
||||||
|
"YUV2BGR_YV12",
|
||||||
|
"YUV2RGB_IYUV",
|
||||||
|
"YUV2BGR_IYUV",
|
||||||
|
|
||||||
|
"YUV2RGBA_YV12",
|
||||||
|
"YUV2BGRA_YV12",
|
||||||
|
"YUV2RGBA_IYUV",
|
||||||
|
"YUV2BGRA_IYUV",
|
||||||
|
|
||||||
|
"YUV2GRAY_420",
|
||||||
|
|
||||||
|
//YUV 4:2:2 formats family
|
||||||
|
"YUV2RGB_UYVY",
|
||||||
|
"YUV2BGR_UYVY",
|
||||||
|
"YUV2RGB_VYUY",
|
||||||
|
"YUV2BGR_VYUY",
|
||||||
|
|
||||||
|
"YUV2RGBA_UYVY",
|
||||||
|
"YUV2BGRA_UYVY",
|
||||||
|
"YUV2RGBA_VYUY",
|
||||||
|
"YUV2BGRA_VYUY",
|
||||||
|
|
||||||
|
"YUV2RGB_YUY2",
|
||||||
|
"YUV2BGR_YUY2",
|
||||||
|
"YUV2RGB_YVYU",
|
||||||
|
"YUV2BGR_YVYU",
|
||||||
|
|
||||||
|
"YUV2RGBA_YUY2",
|
||||||
|
"YUV2BGRA_YUY2",
|
||||||
|
"YUV2RGBA_YVYU",
|
||||||
|
"YUV2BGRA_YVYU",
|
||||||
|
|
||||||
|
"YUV2GRAY_UYVY",
|
||||||
|
"YUV2GRAY_YUY2",
|
||||||
|
|
||||||
|
// alpha premultiplication
|
||||||
|
"RGBA2mRGBA",
|
||||||
|
"mRGBA2RGBA",
|
||||||
|
|
||||||
|
"COLORCVT_MAX"
|
||||||
};
|
};
|
||||||
|
|
||||||
*os << str[info.code];
|
*os << str[info.code];
|
||||||
|
@ -54,6 +54,17 @@ void cv::gpu::gammaCorrection(const GpuMat&, GpuMat&, bool, Stream&) { throw_nog
|
|||||||
#else /* !defined (HAVE_CUDA) */
|
#else /* !defined (HAVE_CUDA) */
|
||||||
|
|
||||||
#include <cvt_colot_internal.h>
|
#include <cvt_colot_internal.h>
|
||||||
|
|
||||||
|
namespace cv { namespace gpu {
|
||||||
|
namespace device
|
||||||
|
{
|
||||||
|
template <int cn>
|
||||||
|
void Bayer2BGR_8u_gpu(DevMem2Db src, DevMem2Db dst, bool blue_last, bool start_with_green, cudaStream_t stream);
|
||||||
|
template <int cn>
|
||||||
|
void Bayer2BGR_16u_gpu(DevMem2Db src, DevMem2Db dst, bool blue_last, bool start_with_green, cudaStream_t stream);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
|
||||||
using namespace ::cv::gpu::device;
|
using namespace ::cv::gpu::device;
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
@ -1144,13 +1155,13 @@ namespace
|
|||||||
funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, StreamAccessor::getStream(stream));
|
funcs[dcn == 4][src.channels() == 4][src.depth()](src, dst, StreamAccessor::getStream(stream));
|
||||||
}
|
}
|
||||||
|
|
||||||
void bgr_to_lab(const GpuMat& src, GpuMat& dst, int dcn, Stream& stream)
|
void bgr_to_lab(const GpuMat& src, GpuMat& dst, int dcn, Stream& st)
|
||||||
{
|
{
|
||||||
#if (CUDA_VERSION < 5000)
|
#if (CUDA_VERSION < 5000)
|
||||||
(void)src;
|
(void)src;
|
||||||
(void)dst;
|
(void)dst;
|
||||||
(void)dcn;
|
(void)dcn;
|
||||||
(void)stream;
|
(void)st;
|
||||||
CV_Error( CV_StsBadFlag, "Unknown/unsupported color conversion code" );
|
CV_Error( CV_StsBadFlag, "Unknown/unsupported color conversion code" );
|
||||||
#else
|
#else
|
||||||
CV_Assert(src.depth() == CV_8U);
|
CV_Assert(src.depth() == CV_8U);
|
||||||
@ -1160,13 +1171,17 @@ namespace
|
|||||||
|
|
||||||
dst.create(src.size(), CV_MAKETYPE(src.depth(), dcn));
|
dst.create(src.size(), CV_MAKETYPE(src.depth(), dcn));
|
||||||
|
|
||||||
NppStreamHandler h(StreamAccessor::getStream(stream));
|
cudaStream_t stream = StreamAccessor::getStream(st);
|
||||||
|
NppStreamHandler h(stream);
|
||||||
|
|
||||||
NppiSize oSizeROI;
|
NppiSize oSizeROI;
|
||||||
oSizeROI.width = src.cols;
|
oSizeROI.width = src.cols;
|
||||||
oSizeROI.height = src.rows;
|
oSizeROI.height = src.rows;
|
||||||
|
|
||||||
nppSafeCall( nppiBGRToLab_8u_C3R(src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI) );
|
nppSafeCall( nppiBGRToLab_8u_C3R(src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI) );
|
||||||
|
|
||||||
|
if (stream == 0)
|
||||||
|
cudaSafeCall( cudaDeviceSynchronize() );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1176,13 +1191,13 @@ namespace
|
|||||||
bgr_to_lab(dst, dst, -1, stream);
|
bgr_to_lab(dst, dst, -1, stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lab_to_bgr(const GpuMat& src, GpuMat& dst, int dcn, Stream& stream)
|
void lab_to_bgr(const GpuMat& src, GpuMat& dst, int dcn, Stream& st)
|
||||||
{
|
{
|
||||||
#if (CUDA_VERSION < 5000)
|
#if (CUDA_VERSION < 5000)
|
||||||
(void)src;
|
(void)src;
|
||||||
(void)dst;
|
(void)dst;
|
||||||
(void)dcn;
|
(void)dcn;
|
||||||
(void)stream;
|
(void)st;
|
||||||
CV_Error( CV_StsBadFlag, "Unknown/unsupported color conversion code" );
|
CV_Error( CV_StsBadFlag, "Unknown/unsupported color conversion code" );
|
||||||
#else
|
#else
|
||||||
CV_Assert(src.depth() == CV_8U);
|
CV_Assert(src.depth() == CV_8U);
|
||||||
@ -1192,13 +1207,17 @@ namespace
|
|||||||
|
|
||||||
dst.create(src.size(), CV_MAKETYPE(src.depth(), dcn));
|
dst.create(src.size(), CV_MAKETYPE(src.depth(), dcn));
|
||||||
|
|
||||||
NppStreamHandler h(StreamAccessor::getStream(stream));
|
cudaStream_t stream = StreamAccessor::getStream(st);
|
||||||
|
NppStreamHandler h(stream);
|
||||||
|
|
||||||
NppiSize oSizeROI;
|
NppiSize oSizeROI;
|
||||||
oSizeROI.width = src.cols;
|
oSizeROI.width = src.cols;
|
||||||
oSizeROI.height = src.rows;
|
oSizeROI.height = src.rows;
|
||||||
|
|
||||||
nppSafeCall( nppiLabToBGR_8u_C3R(src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI) );
|
nppSafeCall( nppiLabToBGR_8u_C3R(src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI) );
|
||||||
|
|
||||||
|
if (stream == 0)
|
||||||
|
cudaSafeCall( cudaDeviceSynchronize() );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1208,13 +1227,13 @@ namespace
|
|||||||
bgr_to_rgb(dst, dst, -1, stream);
|
bgr_to_rgb(dst, dst, -1, stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rgb_to_luv(const GpuMat& src, GpuMat& dst, int dcn, Stream& stream)
|
void rgb_to_luv(const GpuMat& src, GpuMat& dst, int dcn, Stream& st)
|
||||||
{
|
{
|
||||||
#if (CUDA_VERSION < 5000)
|
#if (CUDA_VERSION < 5000)
|
||||||
(void)src;
|
(void)src;
|
||||||
(void)dst;
|
(void)dst;
|
||||||
(void)dcn;
|
(void)dcn;
|
||||||
(void)stream;
|
(void)st;
|
||||||
CV_Error( CV_StsBadFlag, "Unknown/unsupported color conversion code" );
|
CV_Error( CV_StsBadFlag, "Unknown/unsupported color conversion code" );
|
||||||
#else
|
#else
|
||||||
CV_Assert(src.depth() == CV_8U);
|
CV_Assert(src.depth() == CV_8U);
|
||||||
@ -1224,7 +1243,8 @@ namespace
|
|||||||
|
|
||||||
dst.create(src.size(), CV_MAKETYPE(src.depth(), dcn));
|
dst.create(src.size(), CV_MAKETYPE(src.depth(), dcn));
|
||||||
|
|
||||||
NppStreamHandler h(StreamAccessor::getStream(stream));
|
cudaStream_t stream = StreamAccessor::getStream(st);
|
||||||
|
NppStreamHandler h(stream);
|
||||||
|
|
||||||
NppiSize oSizeROI;
|
NppiSize oSizeROI;
|
||||||
oSizeROI.width = src.cols;
|
oSizeROI.width = src.cols;
|
||||||
@ -1234,6 +1254,9 @@ namespace
|
|||||||
nppSafeCall( nppiRGBToLUV_8u_C3R(src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI) );
|
nppSafeCall( nppiRGBToLUV_8u_C3R(src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI) );
|
||||||
else
|
else
|
||||||
nppSafeCall( nppiRGBToLUV_8u_AC4R(src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI) );
|
nppSafeCall( nppiRGBToLUV_8u_AC4R(src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI) );
|
||||||
|
|
||||||
|
if (stream == 0)
|
||||||
|
cudaSafeCall( cudaDeviceSynchronize() );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1243,13 +1266,13 @@ namespace
|
|||||||
rgb_to_luv(dst, dst, -1, stream);
|
rgb_to_luv(dst, dst, -1, stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void luv_to_rgb(const GpuMat& src, GpuMat& dst, int dcn, Stream& stream)
|
void luv_to_rgb(const GpuMat& src, GpuMat& dst, int dcn, Stream& st)
|
||||||
{
|
{
|
||||||
#if (CUDA_VERSION < 5000)
|
#if (CUDA_VERSION < 5000)
|
||||||
(void)src;
|
(void)src;
|
||||||
(void)dst;
|
(void)dst;
|
||||||
(void)dcn;
|
(void)dcn;
|
||||||
(void)stream;
|
(void)st;
|
||||||
CV_Error( CV_StsBadFlag, "Unknown/unsupported color conversion code" );
|
CV_Error( CV_StsBadFlag, "Unknown/unsupported color conversion code" );
|
||||||
#else
|
#else
|
||||||
CV_Assert(src.depth() == CV_8U);
|
CV_Assert(src.depth() == CV_8U);
|
||||||
@ -1259,7 +1282,8 @@ namespace
|
|||||||
|
|
||||||
dst.create(src.size(), CV_MAKETYPE(src.depth(), dcn));
|
dst.create(src.size(), CV_MAKETYPE(src.depth(), dcn));
|
||||||
|
|
||||||
NppStreamHandler h(StreamAccessor::getStream(stream));
|
cudaStream_t stream = StreamAccessor::getStream(st);
|
||||||
|
NppStreamHandler h(stream);
|
||||||
|
|
||||||
NppiSize oSizeROI;
|
NppiSize oSizeROI;
|
||||||
oSizeROI.width = src.cols;
|
oSizeROI.width = src.cols;
|
||||||
@ -1269,6 +1293,9 @@ namespace
|
|||||||
nppSafeCall( nppiLUVToRGB_8u_C3R(src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI) );
|
nppSafeCall( nppiLUVToRGB_8u_C3R(src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI) );
|
||||||
else
|
else
|
||||||
nppSafeCall( nppiLUVToRGB_8u_AC4R(src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI) );
|
nppSafeCall( nppiLUVToRGB_8u_AC4R(src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI) );
|
||||||
|
|
||||||
|
if (stream == 0)
|
||||||
|
cudaSafeCall( cudaDeviceSynchronize() );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1278,19 +1305,20 @@ namespace
|
|||||||
bgr_to_rgb(dst, dst, -1, stream);
|
bgr_to_rgb(dst, dst, -1, stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rgba_to_mbgra(const GpuMat& src, GpuMat& dst, int, Stream& stream)
|
void rgba_to_mbgra(const GpuMat& src, GpuMat& dst, int, Stream& st)
|
||||||
{
|
{
|
||||||
#if (CUDA_VERSION < 5000)
|
#if (CUDA_VERSION < 5000)
|
||||||
(void)src;
|
(void)src;
|
||||||
(void)dst;
|
(void)dst;
|
||||||
(void)stream;
|
(void)st;
|
||||||
CV_Error( CV_StsBadFlag, "Unknown/unsupported color conversion code" );
|
CV_Error( CV_StsBadFlag, "Unknown/unsupported color conversion code" );
|
||||||
#else
|
#else
|
||||||
CV_Assert(src.type() == CV_8UC4 || src.type() == CV_16UC4);
|
CV_Assert(src.type() == CV_8UC4 || src.type() == CV_16UC4);
|
||||||
|
|
||||||
dst.create(src.size(), src.type());
|
dst.create(src.size(), src.type());
|
||||||
|
|
||||||
NppStreamHandler h(StreamAccessor::getStream(stream));
|
cudaStream_t stream = StreamAccessor::getStream(st);
|
||||||
|
NppStreamHandler h(stream);
|
||||||
|
|
||||||
NppiSize oSizeROI;
|
NppiSize oSizeROI;
|
||||||
oSizeROI.width = src.cols;
|
oSizeROI.width = src.cols;
|
||||||
@ -1300,8 +1328,52 @@ namespace
|
|||||||
nppSafeCall( nppiAlphaPremul_8u_AC4R(src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI) );
|
nppSafeCall( nppiAlphaPremul_8u_AC4R(src.ptr<Npp8u>(), static_cast<int>(src.step), dst.ptr<Npp8u>(), static_cast<int>(dst.step), oSizeROI) );
|
||||||
else
|
else
|
||||||
nppSafeCall( nppiAlphaPremul_16u_AC4R(src.ptr<Npp16u>(), static_cast<int>(src.step), dst.ptr<Npp16u>(), static_cast<int>(dst.step), oSizeROI) );
|
nppSafeCall( nppiAlphaPremul_16u_AC4R(src.ptr<Npp16u>(), static_cast<int>(src.step), dst.ptr<Npp16u>(), static_cast<int>(dst.step), oSizeROI) );
|
||||||
|
|
||||||
|
if (stream == 0)
|
||||||
|
cudaSafeCall( cudaDeviceSynchronize() );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bayer_to_bgr(const GpuMat& src, GpuMat& dst, int dcn, bool blue_last, bool start_with_green, Stream& stream)
|
||||||
|
{
|
||||||
|
typedef void (*func_t)(DevMem2Db src, DevMem2Db dst, bool blue_last, bool start_with_green, cudaStream_t stream);
|
||||||
|
static const func_t funcs[3][4] =
|
||||||
|
{
|
||||||
|
{0,0,Bayer2BGR_8u_gpu<3>, Bayer2BGR_8u_gpu<4>},
|
||||||
|
{0,0,0,0},
|
||||||
|
{0,0,Bayer2BGR_16u_gpu<3>, Bayer2BGR_16u_gpu<4>}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (dcn <= 0) dcn = 3;
|
||||||
|
|
||||||
|
CV_Assert(src.type() == CV_8UC1 || src.type() == CV_16UC1);
|
||||||
|
CV_Assert(src.rows > 2 && src.cols > 2);
|
||||||
|
CV_Assert(dcn == 3 || dcn == 4);
|
||||||
|
|
||||||
|
dst.create(src.size(), CV_MAKETYPE(src.depth(), dcn));
|
||||||
|
|
||||||
|
funcs[src.depth()][dcn - 1](src, dst, blue_last, start_with_green, StreamAccessor::getStream(stream));
|
||||||
|
}
|
||||||
|
|
||||||
|
void bayerBG_to_bgr(const GpuMat& src, GpuMat& dst, int dcn, Stream& stream)
|
||||||
|
{
|
||||||
|
bayer_to_bgr(src, dst, dcn, false, false, stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bayerGB_to_bgr(const GpuMat& src, GpuMat& dst, int dcn, Stream& stream)
|
||||||
|
{
|
||||||
|
bayer_to_bgr(src, dst, dcn, false, true, stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bayerRG_to_bgr(const GpuMat& src, GpuMat& dst, int dcn, Stream& stream)
|
||||||
|
{
|
||||||
|
bayer_to_bgr(src, dst, dcn, true, false, stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bayerGR_to_bgr(const GpuMat& src, GpuMat& dst, int dcn, Stream& stream)
|
||||||
|
{
|
||||||
|
bayer_to_bgr(src, dst, dcn, true, true, stream);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cv::gpu::cvtColor(const GpuMat& src, GpuMat& dst, int code, int dcn, Stream& stream)
|
void cv::gpu::cvtColor(const GpuMat& src, GpuMat& dst, int code, int dcn, Stream& stream)
|
||||||
@ -1366,10 +1438,10 @@ void cv::gpu::cvtColor(const GpuMat& src, GpuMat& dst, int code, int dcn, Stream
|
|||||||
bgr_to_lab, // CV_BGR2Lab =44
|
bgr_to_lab, // CV_BGR2Lab =44
|
||||||
rgb_to_lab, // CV_RGB2Lab =45
|
rgb_to_lab, // CV_RGB2Lab =45
|
||||||
|
|
||||||
0, // CV_BayerBG2BGR =46
|
bayerBG_to_bgr, // CV_BayerBG2BGR =46
|
||||||
0, // CV_BayerGB2BGR =47
|
bayerGB_to_bgr, // CV_BayerGB2BGR =47
|
||||||
0, // CV_BayerRG2BGR =48
|
bayerRG_to_bgr, // CV_BayerRG2BGR =48
|
||||||
0, // CV_BayerGR2BGR =49
|
bayerGR_to_bgr, // CV_BayerGR2BGR =49
|
||||||
|
|
||||||
bgr_to_luv, // CV_BGR2Luv =50
|
bgr_to_luv, // CV_BGR2Luv =50
|
||||||
rgb_to_luv, // CV_RGB2Luv =51
|
rgb_to_luv, // CV_RGB2Luv =51
|
||||||
@ -1424,57 +1496,57 @@ void cv::gpu::cvtColor(const GpuMat& src, GpuMat& dst, int code, int dcn, Stream
|
|||||||
0, // CV_BayerGR2GRAY = 89
|
0, // CV_BayerGR2GRAY = 89
|
||||||
|
|
||||||
//YUV 4:2:0 formats family
|
//YUV 4:2:0 formats family
|
||||||
0, // COLOR_YUV2RGB_NV12 = 90,
|
0, // CV_YUV2RGB_NV12 = 90,
|
||||||
0, // COLOR_YUV2BGR_NV12 = 91,
|
0, // CV_YUV2BGR_NV12 = 91,
|
||||||
0, // COLOR_YUV2RGB_NV21 = 92,
|
0, // CV_YUV2RGB_NV21 = 92,
|
||||||
0, // COLOR_YUV2BGR_NV21 = 93,
|
0, // CV_YUV2BGR_NV21 = 93,
|
||||||
|
|
||||||
0, // COLOR_YUV2RGBA_NV12 = 94,
|
0, // CV_YUV2RGBA_NV12 = 94,
|
||||||
0, // COLOR_YUV2BGRA_NV12 = 95,
|
0, // CV_YUV2BGRA_NV12 = 95,
|
||||||
0, // COLOR_YUV2RGBA_NV21 = 96,
|
0, // CV_YUV2RGBA_NV21 = 96,
|
||||||
0, // COLOR_YUV2BGRA_NV21 = 97,
|
0, // CV_YUV2BGRA_NV21 = 97,
|
||||||
|
|
||||||
0, // COLOR_YUV2RGB_YV12 = 98,
|
0, // CV_YUV2RGB_YV12 = 98,
|
||||||
0, // COLOR_YUV2BGR_YV12 = 99,
|
0, // CV_YUV2BGR_YV12 = 99,
|
||||||
0, // COLOR_YUV2RGB_IYUV = 100,
|
0, // CV_YUV2RGB_IYUV = 100,
|
||||||
0, // COLOR_YUV2BGR_IYUV = 101,
|
0, // CV_YUV2BGR_IYUV = 101,
|
||||||
|
|
||||||
0, // COLOR_YUV2RGBA_YV12 = 102,
|
0, // CV_YUV2RGBA_YV12 = 102,
|
||||||
0, // COLOR_YUV2BGRA_YV12 = 103,
|
0, // CV_YUV2BGRA_YV12 = 103,
|
||||||
0, // COLOR_YUV2RGBA_IYUV = 104,
|
0, // CV_YUV2RGBA_IYUV = 104,
|
||||||
0, // COLOR_YUV2BGRA_IYUV = 105,
|
0, // CV_YUV2BGRA_IYUV = 105,
|
||||||
|
|
||||||
0, // COLOR_YUV2GRAY_420 = 106,
|
0, // CV_YUV2GRAY_420 = 106,
|
||||||
|
|
||||||
//YUV 4:2:2 formats family
|
//YUV 4:2:2 formats family
|
||||||
0, // COLOR_YUV2RGB_UYVY = 107,
|
0, // CV_YUV2RGB_UYVY = 107,
|
||||||
0, // COLOR_YUV2BGR_UYVY = 108,
|
0, // CV_YUV2BGR_UYVY = 108,
|
||||||
0, // //COLOR_YUV2RGB_VYUY = 109,
|
0, // //CV_YUV2RGB_VYUY = 109,
|
||||||
0, // //COLOR_YUV2BGR_VYUY = 110,
|
0, // //CV_YUV2BGR_VYUY = 110,
|
||||||
|
|
||||||
0, // COLOR_YUV2RGBA_UYVY = 111,
|
0, // CV_YUV2RGBA_UYVY = 111,
|
||||||
0, // COLOR_YUV2BGRA_UYVY = 112,
|
0, // CV_YUV2BGRA_UYVY = 112,
|
||||||
0, // //COLOR_YUV2RGBA_VYUY = 113,
|
0, // //CV_YUV2RGBA_VYUY = 113,
|
||||||
0, // //COLOR_YUV2BGRA_VYUY = 114,
|
0, // //CV_YUV2BGRA_VYUY = 114,
|
||||||
|
|
||||||
0, // COLOR_YUV2RGB_YUY2 = 115,
|
0, // CV_YUV2RGB_YUY2 = 115,
|
||||||
0, // COLOR_YUV2BGR_YUY2 = 116,
|
0, // CV_YUV2BGR_YUY2 = 116,
|
||||||
0, // COLOR_YUV2RGB_YVYU = 117,
|
0, // CV_YUV2RGB_YVYU = 117,
|
||||||
0, // COLOR_YUV2BGR_YVYU = 118,
|
0, // CV_YUV2BGR_YVYU = 118,
|
||||||
|
|
||||||
0, // COLOR_YUV2RGBA_YUY2 = 119,
|
0, // CV_YUV2RGBA_YUY2 = 119,
|
||||||
0, // COLOR_YUV2BGRA_YUY2 = 120,
|
0, // CV_YUV2BGRA_YUY2 = 120,
|
||||||
0, // COLOR_YUV2RGBA_YVYU = 121,
|
0, // CV_YUV2RGBA_YVYU = 121,
|
||||||
0, // COLOR_YUV2BGRA_YVYU = 122,
|
0, // CV_YUV2BGRA_YVYU = 122,
|
||||||
|
|
||||||
0, // COLOR_YUV2GRAY_UYVY = 123,
|
0, // CV_YUV2GRAY_UYVY = 123,
|
||||||
0, // COLOR_YUV2GRAY_YUY2 = 124,
|
0, // CV_YUV2GRAY_YUY2 = 124,
|
||||||
|
|
||||||
// alpha premultiplication
|
// alpha premultiplication
|
||||||
rgba_to_mbgra, // COLOR_RGBA2mRGBA = 125,
|
rgba_to_mbgra, // CV_RGBA2mRGBA = 125,
|
||||||
0, // COLOR_mRGBA2RGBA = 126,
|
0, // CV_mRGBA2RGBA = 126,
|
||||||
|
|
||||||
0, // COLOR_COLORCVT_MAX = 127
|
0, // CV_COLORCVT_MAX = 127
|
||||||
};
|
};
|
||||||
|
|
||||||
CV_Assert(code < 128);
|
CV_Assert(code < 128);
|
||||||
|
522
modules/gpu/src/cuda/ccomponetns.cu
Normal file
522
modules/gpu/src/cuda/ccomponetns.cu
Normal file
@ -0,0 +1,522 @@
|
|||||||
|
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||||
|
//
|
||||||
|
// By downloading, copying, installing or using the software you agree to this license.
|
||||||
|
// If you do not agree to this license, do not download, install,
|
||||||
|
// copy or use the software.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// License Agreement
|
||||||
|
// For Open Source Computer Vision Library
|
||||||
|
//
|
||||||
|
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||||
|
// Copyright (C) 2008-2011, Willow Garage Inc., all rights reserved.
|
||||||
|
// Third party copyrights are property of their respective owners.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
// are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other materials provided with the distribution.
|
||||||
|
//
|
||||||
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
|
// derived from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// This software is provided by the copyright holders and contributors "as is" and
|
||||||
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
|
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||||
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
|
// indirect, incidental, special, exemplary, or consequential damages
|
||||||
|
// (including, but not limited to, procurement of substitute goods or services;
|
||||||
|
// loss of use, data, or profits; or business interruption) however caused
|
||||||
|
// and on any theory of liability, whether in contract, strict liability,
|
||||||
|
// or tort (including negligence or otherwise) arising in any way out of
|
||||||
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
|
//M*/
|
||||||
|
|
||||||
|
#include <opencv2/gpu/device/common.hpp>
|
||||||
|
#include <opencv2/gpu/device/vec_traits.hpp>
|
||||||
|
#include <opencv2/gpu/device/vec_math.hpp>
|
||||||
|
#include <iostream>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
namespace cv { namespace gpu { namespace device
|
||||||
|
{
|
||||||
|
namespace ccl
|
||||||
|
{
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
WARP_SIZE = 32,
|
||||||
|
WARP_LOG = 5,
|
||||||
|
|
||||||
|
CTA_SIZE_X = 32,
|
||||||
|
CTA_SIZE_Y = 8,
|
||||||
|
|
||||||
|
STA_SIZE_MARGE_Y = 4,
|
||||||
|
STA_SIZE_MARGE_X = 32,
|
||||||
|
|
||||||
|
TPB_X = 1,
|
||||||
|
TPB_Y = 4,
|
||||||
|
|
||||||
|
TILE_COLS = CTA_SIZE_X * TPB_X,
|
||||||
|
TILE_ROWS = CTA_SIZE_Y * TPB_Y
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T> struct IntervalsTraits
|
||||||
|
{
|
||||||
|
typedef T elem_type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<> struct IntervalsTraits<unsigned char>
|
||||||
|
{
|
||||||
|
typedef int dist_type;
|
||||||
|
enum {ch = 1};
|
||||||
|
};
|
||||||
|
|
||||||
|
template<> struct IntervalsTraits<uchar3>
|
||||||
|
{
|
||||||
|
typedef int3 dist_type;
|
||||||
|
enum {ch = 3};
|
||||||
|
};
|
||||||
|
|
||||||
|
template<> struct IntervalsTraits<uchar4>
|
||||||
|
{
|
||||||
|
typedef int4 dist_type;
|
||||||
|
enum {ch = 4};
|
||||||
|
};
|
||||||
|
|
||||||
|
template<> struct IntervalsTraits<unsigned short>
|
||||||
|
{
|
||||||
|
typedef int dist_type;
|
||||||
|
enum {ch = 1};
|
||||||
|
};
|
||||||
|
|
||||||
|
template<> struct IntervalsTraits<ushort3>
|
||||||
|
{
|
||||||
|
typedef int3 dist_type;
|
||||||
|
enum {ch = 3};
|
||||||
|
};
|
||||||
|
|
||||||
|
template<> struct IntervalsTraits<ushort4>
|
||||||
|
{
|
||||||
|
typedef int4 dist_type;
|
||||||
|
enum {ch = 4};
|
||||||
|
};
|
||||||
|
|
||||||
|
template<> struct IntervalsTraits<float>
|
||||||
|
{
|
||||||
|
typedef float dist_type;
|
||||||
|
enum {ch = 1};
|
||||||
|
};
|
||||||
|
|
||||||
|
template<> struct IntervalsTraits<int>
|
||||||
|
{
|
||||||
|
typedef int dist_type;
|
||||||
|
enum {ch = 1};
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef unsigned char component;
|
||||||
|
enum Edges { UP = 1, DOWN = 2, LEFT = 4, RIGHT = 8, EMPTY = 0xF0 };
|
||||||
|
|
||||||
|
template<typename T, int CH> struct InInterval {};
|
||||||
|
|
||||||
|
template<typename T> struct InInterval<T, 1>
|
||||||
|
{
|
||||||
|
__host__ __device__ __forceinline__ InInterval(const float4& _lo, const float4& _hi) : lo(-_lo.x), hi(_hi.x) {};
|
||||||
|
T lo, hi;
|
||||||
|
|
||||||
|
template<typename I> __device__ __forceinline__ bool operator() (const I& a, const I& b) const
|
||||||
|
{
|
||||||
|
I d = a - b;
|
||||||
|
return lo <= d && d <= hi;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T> struct InInterval<T, 3>
|
||||||
|
{
|
||||||
|
__host__ __device__ __forceinline__ InInterval(const float4& _lo, const float4& _hi)
|
||||||
|
: lo (VecTraits<T>::make(-_lo.x, -_lo.y, -_lo.z)), hi (VecTraits<T>::make(_hi.x, _hi.y, _hi.z)){};
|
||||||
|
T lo, hi;
|
||||||
|
|
||||||
|
template<typename I> __device__ __forceinline__ bool operator() (const I& a, const I& b) const
|
||||||
|
{
|
||||||
|
I d = a - b;
|
||||||
|
return lo.x <= d.x && d.x <= hi.x &&
|
||||||
|
lo.y <= d.y && d.y <= hi.y &&
|
||||||
|
lo.z <= d.z && d.z <= hi.z;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T> struct InInterval<T, 4>
|
||||||
|
{
|
||||||
|
__host__ __device__ __forceinline__ InInterval(const float4& _lo, const float4& _hi)
|
||||||
|
: lo (VecTraits<T>::make(-_lo.x, -_lo.y, -_lo.z, -_lo.w)), hi (VecTraits<T>::make(_hi.x, _hi.y, _hi.z, -_hi.w)){};
|
||||||
|
T lo, hi;
|
||||||
|
|
||||||
|
template<typename I> __device__ __forceinline__ bool operator() (const I& a, const I& b) const
|
||||||
|
{
|
||||||
|
I d = a - b;
|
||||||
|
return lo.x <= d.x && d.x <= hi.x &&
|
||||||
|
lo.y <= d.y && d.y <= hi.y &&
|
||||||
|
lo.z <= d.z && d.z <= hi.z &&
|
||||||
|
lo.w <= d.w && d.w <= hi.w;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T, typename F>
|
||||||
|
__global__ void computeConnectivity(const DevMem2D_<T> image, DevMem2D components, F connected)
|
||||||
|
{
|
||||||
|
int x = threadIdx.x + blockIdx.x * blockDim.x;
|
||||||
|
int y = threadIdx.y + blockIdx.y * blockDim.y;
|
||||||
|
|
||||||
|
if (x >= image.cols || y >= image.rows) return;
|
||||||
|
|
||||||
|
T intensity = image(y, x);
|
||||||
|
component c = 0;
|
||||||
|
|
||||||
|
if ( x > 0 && connected(intensity, image(y, x - 1)))
|
||||||
|
c |= LEFT;
|
||||||
|
|
||||||
|
if ( y > 0 && connected(intensity, image(y - 1, x)))
|
||||||
|
c |= UP;
|
||||||
|
|
||||||
|
if ( x - 1 < image.cols && connected(intensity, image(y, x + 1)))
|
||||||
|
c |= RIGHT;
|
||||||
|
|
||||||
|
if ( y - 1 < image.rows && connected(intensity, image(y + 1, x)))
|
||||||
|
c |= DOWN;
|
||||||
|
|
||||||
|
components(y, x) = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
template< typename T>
|
||||||
|
void computeEdges(const DevMem2D& image, DevMem2D edges, const float4& lo, const float4& hi, cudaStream_t stream)
|
||||||
|
{
|
||||||
|
dim3 block(CTA_SIZE_X, CTA_SIZE_Y);
|
||||||
|
dim3 grid(divUp(image.cols, block.x), divUp(image.rows, block.y));
|
||||||
|
|
||||||
|
typedef InInterval<typename IntervalsTraits<T>::dist_type, IntervalsTraits<T>::ch> Int_t;
|
||||||
|
|
||||||
|
Int_t inInt(lo, hi);
|
||||||
|
computeConnectivity<T, Int_t><<<grid, block, 0, stream>>>(static_cast<const DevMem2D_<T> >(image), edges, inInt);
|
||||||
|
|
||||||
|
cudaSafeCall( cudaGetLastError() );
|
||||||
|
if (stream == 0)
|
||||||
|
cudaSafeCall( cudaDeviceSynchronize() );
|
||||||
|
}
|
||||||
|
|
||||||
|
template void computeEdges<uchar> (const DevMem2D& image, DevMem2D edges, const float4& lo, const float4& hi, cudaStream_t stream);
|
||||||
|
template void computeEdges<uchar3> (const DevMem2D& image, DevMem2D edges, const float4& lo, const float4& hi, cudaStream_t stream);
|
||||||
|
template void computeEdges<uchar4> (const DevMem2D& image, DevMem2D edges, const float4& lo, const float4& hi, cudaStream_t stream);
|
||||||
|
template void computeEdges<ushort> (const DevMem2D& image, DevMem2D edges, const float4& lo, const float4& hi, cudaStream_t stream);
|
||||||
|
template void computeEdges<ushort3>(const DevMem2D& image, DevMem2D edges, const float4& lo, const float4& hi, cudaStream_t stream);
|
||||||
|
template void computeEdges<ushort4>(const DevMem2D& image, DevMem2D edges, const float4& lo, const float4& hi, cudaStream_t stream);
|
||||||
|
template void computeEdges<int> (const DevMem2D& image, DevMem2D edges, const float4& lo, const float4& hi, cudaStream_t stream);
|
||||||
|
template void computeEdges<float> (const DevMem2D& image, DevMem2D edges, const float4& lo, const float4& hi, cudaStream_t stream);
|
||||||
|
|
||||||
|
__global__ void lableTiles(const DevMem2D edges, DevMem2Di comps)
|
||||||
|
{
|
||||||
|
int x = threadIdx.x + blockIdx.x * TILE_COLS;
|
||||||
|
int y = threadIdx.y + blockIdx.y * TILE_ROWS;
|
||||||
|
|
||||||
|
if (x >= edges.cols || y >= edges.rows) return;
|
||||||
|
|
||||||
|
//currently x is 1
|
||||||
|
int bounds = ((y + TPB_Y) < edges.rows);
|
||||||
|
|
||||||
|
__shared__ int labelsTile[TILE_ROWS][TILE_COLS];
|
||||||
|
__shared__ int edgesTile[TILE_ROWS][TILE_COLS];
|
||||||
|
|
||||||
|
int new_labels[TPB_Y][TPB_X];
|
||||||
|
int old_labels[TPB_Y][TPB_X];
|
||||||
|
|
||||||
|
#pragma unroll
|
||||||
|
for (int i = 0; i < TPB_Y; ++i)
|
||||||
|
#pragma unroll
|
||||||
|
for (int j = 0; j < TPB_X; ++j)
|
||||||
|
{
|
||||||
|
int yloc = threadIdx.y + CTA_SIZE_Y * i;
|
||||||
|
int xloc = threadIdx.x + CTA_SIZE_X * j;
|
||||||
|
component c = edges(bounds * (y + CTA_SIZE_Y * i), x + CTA_SIZE_X * j);
|
||||||
|
|
||||||
|
if (!xloc) c &= ~LEFT;
|
||||||
|
if (!yloc) c &= ~UP;
|
||||||
|
|
||||||
|
if (xloc == TILE_COLS -1) c &= ~RIGHT;
|
||||||
|
if (yloc == TILE_ROWS -1) c &= ~DOWN;
|
||||||
|
|
||||||
|
new_labels[i][j] = yloc * TILE_COLS + xloc;
|
||||||
|
edgesTile[yloc][xloc] = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 0; ; ++i)
|
||||||
|
{
|
||||||
|
//1. backup
|
||||||
|
#pragma unroll
|
||||||
|
for (int i = 0; i < TPB_Y; ++i)
|
||||||
|
#pragma unroll
|
||||||
|
for (int j = 0; j < TPB_X; ++j)
|
||||||
|
{
|
||||||
|
int yloc = threadIdx.y + CTA_SIZE_Y * i;
|
||||||
|
int xloc = threadIdx.x + CTA_SIZE_X * j;
|
||||||
|
|
||||||
|
old_labels[i][j] = new_labels[i][j];
|
||||||
|
labelsTile[yloc][xloc] = new_labels[i][j];
|
||||||
|
}
|
||||||
|
|
||||||
|
__syncthreads();
|
||||||
|
|
||||||
|
//2. compare local arrays
|
||||||
|
#pragma unroll
|
||||||
|
for (int i = 0; i < TPB_Y; ++i)
|
||||||
|
#pragma unroll
|
||||||
|
for (int j = 0; j < TPB_X; ++j)
|
||||||
|
{
|
||||||
|
int yloc = threadIdx.y + CTA_SIZE_Y * i;
|
||||||
|
int xloc = threadIdx.x + CTA_SIZE_X * j;
|
||||||
|
|
||||||
|
component c = edgesTile[yloc][xloc];
|
||||||
|
int label = new_labels[i][j];
|
||||||
|
|
||||||
|
if (c & UP)
|
||||||
|
label = ::min(label, labelsTile[yloc - 1][xloc]);
|
||||||
|
|
||||||
|
if (c & DOWN)
|
||||||
|
label = ::min(label, labelsTile[yloc + 1][xloc]);
|
||||||
|
|
||||||
|
if (c & LEFT)
|
||||||
|
label = ::min(label, labelsTile[yloc][xloc - 1]);
|
||||||
|
|
||||||
|
if (c & RIGHT)
|
||||||
|
label = ::min(label, labelsTile[yloc][xloc + 1]);
|
||||||
|
|
||||||
|
new_labels[i][j] = label;
|
||||||
|
}
|
||||||
|
|
||||||
|
__syncthreads();
|
||||||
|
|
||||||
|
//3. determine: Is any value changed?
|
||||||
|
int changed = 0;
|
||||||
|
#pragma unroll
|
||||||
|
for (int i = 0; i < TPB_Y; ++i)
|
||||||
|
#pragma unroll
|
||||||
|
for (int j = 0; j < TPB_X; ++j)
|
||||||
|
{
|
||||||
|
if (new_labels[i][j] < old_labels[i][j])
|
||||||
|
{
|
||||||
|
changed = 1;
|
||||||
|
atomicMin(&labelsTile[0][0] + old_labels[i][j], new_labels[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
changed = __syncthreads_or(changed);
|
||||||
|
if (!changed)
|
||||||
|
break;
|
||||||
|
|
||||||
|
//4. Compact paths
|
||||||
|
const int *labels = &labelsTile[0][0];
|
||||||
|
#pragma unroll
|
||||||
|
for (int i = 0; i < TPB_Y; ++i)
|
||||||
|
#pragma unroll
|
||||||
|
for (int j = 0; j < TPB_X; ++j)
|
||||||
|
{
|
||||||
|
int label = new_labels[i][j];
|
||||||
|
|
||||||
|
while( labels[label] < label ) label = labels[label];
|
||||||
|
|
||||||
|
new_labels[i][j] = label;
|
||||||
|
}
|
||||||
|
__syncthreads();
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma unroll
|
||||||
|
for (int i = 0; i < TPB_Y; ++i)
|
||||||
|
#pragma unroll
|
||||||
|
for (int j = 0; j < TPB_X; ++j)
|
||||||
|
{
|
||||||
|
int label = new_labels[i][j];
|
||||||
|
int yloc = label / TILE_COLS;
|
||||||
|
int xloc = label - yloc * TILE_COLS;
|
||||||
|
|
||||||
|
xloc += blockIdx.x * TILE_COLS;
|
||||||
|
yloc += blockIdx.y * TILE_ROWS;
|
||||||
|
|
||||||
|
label = yloc * edges.cols + xloc;
|
||||||
|
// do it for x too.
|
||||||
|
if (y + CTA_SIZE_Y * i < comps.rows) comps(y + CTA_SIZE_Y * i, x + CTA_SIZE_X * j) = label;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__device__ __forceinline__ int root(const DevMem2Di& comps, int label)
|
||||||
|
{
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
int y = label / comps.cols;
|
||||||
|
int x = label - y * comps.cols;
|
||||||
|
|
||||||
|
int parent = comps(y, x);
|
||||||
|
|
||||||
|
if (label == parent) break;
|
||||||
|
|
||||||
|
label = parent;
|
||||||
|
}
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
__device__ __forceinline__ void isConnected(DevMem2Di& comps, int l1, int l2, bool& changed)
|
||||||
|
{
|
||||||
|
int r1 = root(comps, l1);
|
||||||
|
int r2 = root(comps, l2);
|
||||||
|
|
||||||
|
if (r1 == r2) return;
|
||||||
|
|
||||||
|
int mi = ::min(r1, r2);
|
||||||
|
int ma = ::max(r1, r2);
|
||||||
|
|
||||||
|
int y = ma / comps.cols;
|
||||||
|
int x = ma - y * comps.cols;
|
||||||
|
|
||||||
|
atomicMin(&comps.ptr(y)[x], mi);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
__global__ void crossMerge(const int tilesNumY, const int tilesNumX, int tileSizeY, int tileSizeX,
|
||||||
|
const DevMem2D edges, DevMem2Di comps, const int yIncomplete, int xIncomplete)
|
||||||
|
{
|
||||||
|
int tid = threadIdx.y * blockDim.x + threadIdx.x;
|
||||||
|
int stride = blockDim.y * blockDim.x;
|
||||||
|
|
||||||
|
int ybegin = blockIdx.y * (tilesNumY * tileSizeY);
|
||||||
|
int yend = ybegin + tilesNumY * tileSizeY;
|
||||||
|
|
||||||
|
if (blockIdx.y == gridDim.y - 1)
|
||||||
|
{
|
||||||
|
yend -= yIncomplete * tileSizeY;
|
||||||
|
yend -= tileSizeY;
|
||||||
|
tileSizeY = (edges.rows % tileSizeY);
|
||||||
|
|
||||||
|
yend += tileSizeY;
|
||||||
|
}
|
||||||
|
|
||||||
|
int xbegin = blockIdx.x * tilesNumX * tileSizeX;
|
||||||
|
int xend = xbegin + tilesNumX * tileSizeX;
|
||||||
|
|
||||||
|
if (blockIdx.x == gridDim.x - 1)
|
||||||
|
{
|
||||||
|
if (xIncomplete) yend = ybegin;
|
||||||
|
xend -= xIncomplete * tileSizeX;
|
||||||
|
xend -= tileSizeX;
|
||||||
|
tileSizeX = (edges.cols % tileSizeX);
|
||||||
|
|
||||||
|
xend += tileSizeX;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (blockIdx.y == (gridDim.y - 1) && yIncomplete)
|
||||||
|
{
|
||||||
|
xend = xbegin;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tasksV = (tilesNumX - 1) * (yend - ybegin);
|
||||||
|
int tasksH = (tilesNumY - 1) * (xend - xbegin);
|
||||||
|
|
||||||
|
int total = tasksH + tasksV;
|
||||||
|
|
||||||
|
bool changed;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
changed = false;
|
||||||
|
for (int taskIdx = tid; taskIdx < total; taskIdx += stride)
|
||||||
|
{
|
||||||
|
if (taskIdx < tasksH)
|
||||||
|
{
|
||||||
|
int indexH = taskIdx;
|
||||||
|
|
||||||
|
int row = indexH / (xend - xbegin);
|
||||||
|
int col = indexH - row * (xend - xbegin);
|
||||||
|
|
||||||
|
int y = ybegin + (row + 1) * tileSizeY;
|
||||||
|
int x = xbegin + col;
|
||||||
|
|
||||||
|
component e = edges( x, y);
|
||||||
|
if (e & UP)
|
||||||
|
{
|
||||||
|
int lc = comps(y,x);
|
||||||
|
int lu = comps(y - 1, x);
|
||||||
|
|
||||||
|
isConnected(comps, lc, lu, changed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int indexV = taskIdx - tasksH;
|
||||||
|
|
||||||
|
int col = indexV / (yend - ybegin);
|
||||||
|
int row = indexV - col * (yend - ybegin);
|
||||||
|
|
||||||
|
int x = xbegin + (col + 1) * tileSizeX;
|
||||||
|
int y = ybegin + row;
|
||||||
|
|
||||||
|
component e = edges(x, y);
|
||||||
|
if (e & LEFT)
|
||||||
|
{
|
||||||
|
int lc = comps(y, x);
|
||||||
|
int ll = comps(y, x - 1);
|
||||||
|
|
||||||
|
isConnected(comps, lc, ll, changed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (__syncthreads_or(changed));
|
||||||
|
}
|
||||||
|
|
||||||
|
__global__ void flatten(const DevMem2D edges, DevMem2Di comps)
|
||||||
|
{
|
||||||
|
int x = threadIdx.x + blockIdx.x * blockDim.x;
|
||||||
|
int y = threadIdx.y + blockIdx.y * blockDim.y;
|
||||||
|
|
||||||
|
if( x < comps.cols && y < comps.rows)
|
||||||
|
comps(y, x) = root(comps, comps(y, x));
|
||||||
|
}
|
||||||
|
|
||||||
|
void labelComponents(const DevMem2D& edges, DevMem2Di comps, cudaStream_t stream)
|
||||||
|
{
|
||||||
|
dim3 block(CTA_SIZE_X, CTA_SIZE_Y);
|
||||||
|
dim3 grid(divUp(edges.cols, TILE_COLS), divUp(edges.rows, TILE_ROWS));
|
||||||
|
|
||||||
|
lableTiles<<<grid, block, 0, stream>>>(edges, comps);
|
||||||
|
cudaSafeCall( cudaGetLastError() );
|
||||||
|
|
||||||
|
int tileSizeX = TILE_COLS, tileSizeY = TILE_ROWS;
|
||||||
|
|
||||||
|
cudaSafeCall( cudaGetLastError() );
|
||||||
|
// cudaSafeCall( cudaDeviceSynchronize() );
|
||||||
|
|
||||||
|
while (grid.x > 1 || grid.y > 1)
|
||||||
|
{
|
||||||
|
dim3 mergeGrid(ceilf(grid.x / 2.0), ceilf(grid.y / 2.0));
|
||||||
|
dim3 mergeBlock(STA_SIZE_MARGE_X, STA_SIZE_MARGE_Y);
|
||||||
|
std::cout << "merging: " << grid.y << " x " << grid.x << " ---> " << mergeGrid.y << " x " << mergeGrid.x << " for tiles: " << tileSizeY << " x " << tileSizeX << std::endl;
|
||||||
|
crossMerge<<<mergeGrid, mergeBlock, 0, stream>>>(2, 2, tileSizeY, tileSizeX, edges, comps, ceilf(grid.y / 2.0) - grid.y / 2, ceilf(grid.x / 2.0) - grid.x / 2);
|
||||||
|
tileSizeX <<= 1;
|
||||||
|
tileSizeY <<= 1;
|
||||||
|
grid = mergeGrid;
|
||||||
|
|
||||||
|
cudaSafeCall( cudaGetLastError() );
|
||||||
|
}
|
||||||
|
|
||||||
|
grid.x = divUp(edges.cols, block.x);
|
||||||
|
grid.y = divUp(edges.rows, block.y);
|
||||||
|
flatten<<<grid, block, 0, stream>>>(edges, comps);
|
||||||
|
cudaSafeCall( cudaGetLastError() );
|
||||||
|
if (stream == 0)
|
||||||
|
cudaSafeCall( cudaDeviceSynchronize() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} } }
|
327
modules/gpu/src/cuda/debayer.cu
Normal file
327
modules/gpu/src/cuda/debayer.cu
Normal file
@ -0,0 +1,327 @@
|
|||||||
|
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||||
|
//
|
||||||
|
// By downloading, copying, installing or using the software you agree to this license.
|
||||||
|
// If you do not agree to this license, do not download, install,
|
||||||
|
// copy or use the software.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// License Agreement
|
||||||
|
// For Open Source Computer Vision Library
|
||||||
|
//
|
||||||
|
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||||
|
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||||
|
// Third party copyrights are property of their respective owners.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
// are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistribution's of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other materials provided with the distribution.
|
||||||
|
//
|
||||||
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
|
// derived from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// This software is provided by the copyright holders and contributors "as is" and
|
||||||
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
|
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||||
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
|
// indirect, incidental, special, exemplary, or consequential damages
|
||||||
|
// (including, but not limited to, procurement of substitute goods or services;
|
||||||
|
// loss of use, data, or profits; or business interruption) however caused
|
||||||
|
// and on any theory of liability, whether in contract, strict liability,
|
||||||
|
// or tort (including negligence or otherwise) arising in any way out of
|
||||||
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
|
//
|
||||||
|
//M*/
|
||||||
|
|
||||||
|
#include <opencv2/gpu/device/common.hpp>
|
||||||
|
#include <opencv2/gpu/device/vec_traits.hpp>
|
||||||
|
#include <opencv2/gpu/device/vec_math.hpp>
|
||||||
|
#include <opencv2/gpu/device/limits.hpp>
|
||||||
|
|
||||||
|
namespace cv { namespace gpu {
|
||||||
|
namespace device
|
||||||
|
{
|
||||||
|
template <typename D>
|
||||||
|
__global__ void Bayer2BGR_8u(const PtrStepb src, DevMem2D_<D> dst, const bool blue_last, const bool start_with_green)
|
||||||
|
{
|
||||||
|
const int s_x = blockIdx.x * blockDim.x + threadIdx.x;
|
||||||
|
int s_y = blockIdx.y * blockDim.y + threadIdx.y;
|
||||||
|
|
||||||
|
if (s_y >= dst.rows || (s_x << 2) >= dst.cols)
|
||||||
|
return;
|
||||||
|
|
||||||
|
s_y = ::min(::max(s_y, 1), dst.rows - 2);
|
||||||
|
|
||||||
|
uchar4 patch[3][3];
|
||||||
|
patch[0][1] = ((const uchar4*) src.ptr(s_y - 1))[s_x];
|
||||||
|
patch[0][0] = ((const uchar4*) src.ptr(s_y - 1))[::max(s_x - 1, 0)];
|
||||||
|
patch[0][2] = ((const uchar4*) src.ptr(s_y - 1))[::min(s_x + 1, ((dst.cols + 3) >> 2) - 1)];
|
||||||
|
|
||||||
|
patch[1][1] = ((const uchar4*) src.ptr(s_y))[s_x];
|
||||||
|
patch[1][0] = ((const uchar4*) src.ptr(s_y))[::max(s_x - 1, 0)];
|
||||||
|
patch[1][2] = ((const uchar4*) src.ptr(s_y))[::min(s_x + 1, ((dst.cols + 3) >> 2) - 1)];
|
||||||
|
|
||||||
|
patch[2][1] = ((const uchar4*) src.ptr(s_y + 1))[s_x];
|
||||||
|
patch[2][0] = ((const uchar4*) src.ptr(s_y + 1))[::max(s_x - 1, 0)];
|
||||||
|
patch[2][2] = ((const uchar4*) src.ptr(s_y + 1))[::min(s_x + 1, ((dst.cols + 3) >> 2) - 1)];
|
||||||
|
|
||||||
|
D res0 = VecTraits<D>::all(numeric_limits<uchar>::max());
|
||||||
|
D res1 = VecTraits<D>::all(numeric_limits<uchar>::max());
|
||||||
|
D res2 = VecTraits<D>::all(numeric_limits<uchar>::max());
|
||||||
|
D res3 = VecTraits<D>::all(numeric_limits<uchar>::max());
|
||||||
|
|
||||||
|
if ((s_y & 1) ^ start_with_green)
|
||||||
|
{
|
||||||
|
const int t0 = (patch[0][1].x + patch[2][1].x + 1) >> 1;
|
||||||
|
const int t1 = (patch[1][0].w + patch[1][1].y + 1) >> 1;
|
||||||
|
|
||||||
|
const int t2 = (patch[0][1].x + patch[0][1].z + patch[2][1].x + patch[2][1].z + 2) >> 2;
|
||||||
|
const int t3 = (patch[0][1].y + patch[1][1].x + patch[1][1].z + patch[2][1].y + 2) >> 2;
|
||||||
|
|
||||||
|
const int t4 = (patch[0][1].z + patch[2][1].z + 1) >> 1;
|
||||||
|
const int t5 = (patch[1][1].y + patch[1][1].w + 1) >> 1;
|
||||||
|
|
||||||
|
const int t6 = (patch[0][1].z + patch[0][2].x + patch[2][1].z + patch[2][2].x + 2) >> 2;
|
||||||
|
const int t7 = (patch[0][1].w + patch[1][1].z + patch[1][2].x + patch[2][1].w + 2) >> 2;
|
||||||
|
|
||||||
|
if ((s_y & 1) ^ blue_last)
|
||||||
|
{
|
||||||
|
res0.x = t1;
|
||||||
|
res0.y = patch[1][1].x;
|
||||||
|
res0.z = t0;
|
||||||
|
|
||||||
|
res1.x = patch[1][1].y;
|
||||||
|
res1.y = t3;
|
||||||
|
res1.z = t2;
|
||||||
|
|
||||||
|
res2.x = t5;
|
||||||
|
res2.y = patch[1][1].z;
|
||||||
|
res2.z = t4;
|
||||||
|
|
||||||
|
res3.x = patch[1][1].w;
|
||||||
|
res3.y = t7;
|
||||||
|
res3.z = t6;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
res0.x = t0;
|
||||||
|
res0.y = patch[1][1].x;
|
||||||
|
res0.z = t1;
|
||||||
|
|
||||||
|
res1.x = t2;
|
||||||
|
res1.y = t3;
|
||||||
|
res1.z = patch[1][1].y;
|
||||||
|
|
||||||
|
res2.x = t4;
|
||||||
|
res2.y = patch[1][1].z;
|
||||||
|
res2.z = t5;
|
||||||
|
|
||||||
|
res3.x = t6;
|
||||||
|
res3.y = t7;
|
||||||
|
res3.z = patch[1][1].w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const int t0 = (patch[0][0].w + patch[0][1].y + patch[2][0].w + patch[2][1].y + 2) >> 2;
|
||||||
|
const int t1 = (patch[0][1].x + patch[1][0].w + patch[1][1].y + patch[2][1].x + 2) >> 2;
|
||||||
|
|
||||||
|
const int t2 = (patch[0][1].y + patch[2][1].y + 1) >> 1;
|
||||||
|
const int t3 = (patch[1][1].x + patch[1][1].z + 1) >> 1;
|
||||||
|
|
||||||
|
const int t4 = (patch[0][1].y + patch[0][1].w + patch[2][1].y + patch[2][1].w + 2) >> 2;
|
||||||
|
const int t5 = (patch[0][1].z + patch[1][1].y + patch[1][1].w + patch[2][1].z + 2) >> 2;
|
||||||
|
|
||||||
|
const int t6 = (patch[0][1].w + patch[2][1].w + 1) >> 1;
|
||||||
|
const int t7 = (patch[1][1].z + patch[1][2].x + 1) >> 1;
|
||||||
|
|
||||||
|
if ((s_y & 1) ^ blue_last)
|
||||||
|
{
|
||||||
|
res0.x = patch[1][1].x;
|
||||||
|
res0.y = t1;
|
||||||
|
res0.z = t0;
|
||||||
|
|
||||||
|
res1.x = t3;
|
||||||
|
res1.y = patch[1][1].y;
|
||||||
|
res1.z = t2;
|
||||||
|
|
||||||
|
res2.x = patch[1][1].z;
|
||||||
|
res2.y = t5;
|
||||||
|
res2.z = t4;
|
||||||
|
|
||||||
|
res3.x = t7;
|
||||||
|
res3.y = patch[1][1].w;
|
||||||
|
res3.z = t6;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
res0.x = t0;
|
||||||
|
res0.y = t1;
|
||||||
|
res0.z = patch[1][1].x;
|
||||||
|
|
||||||
|
res1.x = t2;
|
||||||
|
res1.y = patch[1][1].y;
|
||||||
|
res1.z = t3;
|
||||||
|
|
||||||
|
res2.x = t4;
|
||||||
|
res2.y = t5;
|
||||||
|
res2.z = patch[1][1].z;
|
||||||
|
|
||||||
|
res3.x = t6;
|
||||||
|
res3.y = patch[1][1].w;
|
||||||
|
res3.z = t7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const int d_x = (blockIdx.x * blockDim.x + threadIdx.x) << 2;
|
||||||
|
const int d_y = blockIdx.y * blockDim.y + threadIdx.y;
|
||||||
|
|
||||||
|
dst(d_y, d_x) = res0;
|
||||||
|
if (d_x + 1 < dst.cols)
|
||||||
|
dst(d_y, d_x + 1) = res1;
|
||||||
|
if (d_x + 2 < dst.cols)
|
||||||
|
dst(d_y, d_x + 2) = res2;
|
||||||
|
if (d_x + 3 < dst.cols)
|
||||||
|
dst(d_y, d_x + 3) = res3;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename D>
|
||||||
|
__global__ void Bayer2BGR_16u(const PtrStepb src, DevMem2D_<D> dst, const bool blue_last, const bool start_with_green)
|
||||||
|
{
|
||||||
|
const int s_x = blockIdx.x * blockDim.x + threadIdx.x;
|
||||||
|
int s_y = blockIdx.y * blockDim.y + threadIdx.y;
|
||||||
|
|
||||||
|
if (s_y >= dst.rows || (s_x << 1) >= dst.cols)
|
||||||
|
return;
|
||||||
|
|
||||||
|
s_y = ::min(::max(s_y, 1), dst.rows - 2);
|
||||||
|
|
||||||
|
ushort2 patch[3][3];
|
||||||
|
patch[0][1] = ((const ushort2*) src.ptr(s_y - 1))[s_x];
|
||||||
|
patch[0][0] = ((const ushort2*) src.ptr(s_y - 1))[::max(s_x - 1, 0)];
|
||||||
|
patch[0][2] = ((const ushort2*) src.ptr(s_y - 1))[::min(s_x + 1, ((dst.cols + 1) >> 1) - 1)];
|
||||||
|
|
||||||
|
patch[1][1] = ((const ushort2*) src.ptr(s_y))[s_x];
|
||||||
|
patch[1][0] = ((const ushort2*) src.ptr(s_y))[::max(s_x - 1, 0)];
|
||||||
|
patch[1][2] = ((const ushort2*) src.ptr(s_y))[::min(s_x + 1, ((dst.cols + 1) >> 1) - 1)];
|
||||||
|
|
||||||
|
patch[2][1] = ((const ushort2*) src.ptr(s_y + 1))[s_x];
|
||||||
|
patch[2][0] = ((const ushort2*) src.ptr(s_y + 1))[::max(s_x - 1, 0)];
|
||||||
|
patch[2][2] = ((const ushort2*) src.ptr(s_y + 1))[::min(s_x + 1, ((dst.cols + 1) >> 1) - 1)];
|
||||||
|
|
||||||
|
D res0 = VecTraits<D>::all(numeric_limits<ushort>::max());
|
||||||
|
D res1 = VecTraits<D>::all(numeric_limits<ushort>::max());
|
||||||
|
|
||||||
|
if ((s_y & 1) ^ start_with_green)
|
||||||
|
{
|
||||||
|
const int t0 = (patch[0][1].x + patch[2][1].x + 1) >> 1;
|
||||||
|
const int t1 = (patch[1][0].y + patch[1][1].y + 1) >> 1;
|
||||||
|
|
||||||
|
const int t2 = (patch[0][1].x + patch[0][2].x + patch[2][1].x + patch[2][2].x + 2) >> 2;
|
||||||
|
const int t3 = (patch[0][1].y + patch[1][1].x + patch[1][2].x + patch[2][1].y + 2) >> 2;
|
||||||
|
|
||||||
|
if ((s_y & 1) ^ blue_last)
|
||||||
|
{
|
||||||
|
res0.x = t1;
|
||||||
|
res0.y = patch[1][1].x;
|
||||||
|
res0.z = t0;
|
||||||
|
|
||||||
|
res1.x = patch[1][1].y;
|
||||||
|
res1.y = t3;
|
||||||
|
res1.z = t2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
res0.x = t0;
|
||||||
|
res0.y = patch[1][1].x;
|
||||||
|
res0.z = t1;
|
||||||
|
|
||||||
|
res1.x = t2;
|
||||||
|
res1.y = t3;
|
||||||
|
res1.z = patch[1][1].y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const int t0 = (patch[0][0].y + patch[0][1].y + patch[2][0].y + patch[2][1].y + 2) >> 2;
|
||||||
|
const int t1 = (patch[0][1].x + patch[1][0].y + patch[1][1].y + patch[2][1].x + 2) >> 2;
|
||||||
|
|
||||||
|
const int t2 = (patch[0][1].y + patch[2][1].y + 1) >> 1;
|
||||||
|
const int t3 = (patch[1][1].x + patch[1][2].x + 1) >> 1;
|
||||||
|
|
||||||
|
if ((s_y & 1) ^ blue_last)
|
||||||
|
{
|
||||||
|
res0.x = patch[1][1].x;
|
||||||
|
res0.y = t1;
|
||||||
|
res0.z = t0;
|
||||||
|
|
||||||
|
res1.x = t3;
|
||||||
|
res1.y = patch[1][1].y;
|
||||||
|
res1.z = t2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
res0.x = t0;
|
||||||
|
res0.y = t1;
|
||||||
|
res0.z = patch[1][1].x;
|
||||||
|
|
||||||
|
res1.x = t2;
|
||||||
|
res1.y = patch[1][1].y;
|
||||||
|
res1.z = t3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const int d_x = (blockIdx.x * blockDim.x + threadIdx.x) << 1;
|
||||||
|
const int d_y = blockIdx.y * blockDim.y + threadIdx.y;
|
||||||
|
|
||||||
|
dst(d_y, d_x) = res0;
|
||||||
|
if (d_x + 1 < dst.cols)
|
||||||
|
dst(d_y, d_x + 1) = res1;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <int cn>
|
||||||
|
void Bayer2BGR_8u_gpu(DevMem2Db src, DevMem2Db dst, bool blue_last, bool start_with_green, cudaStream_t stream)
|
||||||
|
{
|
||||||
|
typedef typename TypeVec<uchar, cn>::vec_type dst_t;
|
||||||
|
|
||||||
|
const dim3 block(32, 8);
|
||||||
|
const dim3 grid(divUp(dst.cols, 4 * block.x), divUp(dst.rows, block.y));
|
||||||
|
|
||||||
|
cudaSafeCall( cudaFuncSetCacheConfig(Bayer2BGR_8u<dst_t>, cudaFuncCachePreferL1) );
|
||||||
|
|
||||||
|
Bayer2BGR_8u<dst_t><<<grid, block, 0, stream>>>(src, (DevMem2D_<dst_t>)dst, blue_last, start_with_green);
|
||||||
|
cudaSafeCall( cudaGetLastError() );
|
||||||
|
|
||||||
|
if (stream == 0)
|
||||||
|
cudaSafeCall( cudaDeviceSynchronize() );
|
||||||
|
}
|
||||||
|
template <int cn>
|
||||||
|
void Bayer2BGR_16u_gpu(DevMem2Db src, DevMem2Db dst, bool blue_last, bool start_with_green, cudaStream_t stream)
|
||||||
|
{
|
||||||
|
typedef typename TypeVec<ushort, cn>::vec_type dst_t;
|
||||||
|
|
||||||
|
const dim3 block(32, 8);
|
||||||
|
const dim3 grid(divUp(dst.cols, 2 * block.x), divUp(dst.rows, block.y));
|
||||||
|
|
||||||
|
cudaSafeCall( cudaFuncSetCacheConfig(Bayer2BGR_16u<dst_t>, cudaFuncCachePreferL1) );
|
||||||
|
|
||||||
|
Bayer2BGR_16u<dst_t><<<grid, block, 0, stream>>>(src, (DevMem2D_<dst_t>)dst, blue_last, start_with_green);
|
||||||
|
cudaSafeCall( cudaGetLastError() );
|
||||||
|
|
||||||
|
if (stream == 0)
|
||||||
|
cudaSafeCall( cudaDeviceSynchronize() );
|
||||||
|
}
|
||||||
|
|
||||||
|
template void Bayer2BGR_8u_gpu<3>(DevMem2Db src, DevMem2Db dst, bool blue_last, bool start_with_green, cudaStream_t stream);
|
||||||
|
template void Bayer2BGR_8u_gpu<4>(DevMem2Db src, DevMem2Db dst, bool blue_last, bool start_with_green, cudaStream_t stream);
|
||||||
|
template void Bayer2BGR_16u_gpu<3>(DevMem2Db src, DevMem2Db dst, bool blue_last, bool start_with_green, cudaStream_t stream);
|
||||||
|
template void Bayer2BGR_16u_gpu<4>(DevMem2Db src, DevMem2Db dst, bool blue_last, bool start_with_green, cudaStream_t stream);
|
||||||
|
}
|
||||||
|
}}
|
@ -47,8 +47,76 @@
|
|||||||
void cv::gpu::graphcut(GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, Stream&) { throw_nogpu(); }
|
void cv::gpu::graphcut(GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, Stream&) { throw_nogpu(); }
|
||||||
void cv::gpu::graphcut(GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, Stream&) { throw_nogpu(); }
|
void cv::gpu::graphcut(GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, GpuMat&, Stream&) { throw_nogpu(); }
|
||||||
|
|
||||||
|
void cv::gpu::connectivityMask(const GpuMat&, GpuMat&, const cv::Scalar&, const cv::Scalar&, Stream&) { throw_nogpu(); }
|
||||||
|
void cv::gpu::labelComponents(const GpuMat& mask, GpuMat& components, Stream& stream) { throw_nogpu(); }
|
||||||
|
|
||||||
#else /* !defined (HAVE_CUDA) */
|
#else /* !defined (HAVE_CUDA) */
|
||||||
|
|
||||||
|
namespace cv { namespace gpu { namespace device
|
||||||
|
{
|
||||||
|
namespace ccl
|
||||||
|
{
|
||||||
|
void labelComponents(const DevMem2D& edges, DevMem2Di comps, cudaStream_t stream);
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void computeEdges(const DevMem2D& image, DevMem2D edges, const float4& lo, const float4& hi, cudaStream_t stream);
|
||||||
|
}
|
||||||
|
}}}
|
||||||
|
|
||||||
|
|
||||||
|
float4 scalarToCudaType(const cv::Scalar& in)
|
||||||
|
{
|
||||||
|
float4 res;
|
||||||
|
res.x = in[0]; res.y = in[1]; res.z = in[2]; res.w = in[3];
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void cv::gpu::connectivityMask(const GpuMat& image, GpuMat& mask, const cv::Scalar& lo, const cv::Scalar& hi, Stream& s)
|
||||||
|
{
|
||||||
|
CV_Assert(!image.empty());
|
||||||
|
|
||||||
|
int ch = image.channels();
|
||||||
|
CV_Assert(ch <= 4);
|
||||||
|
|
||||||
|
int depth = image.depth();
|
||||||
|
|
||||||
|
typedef void (*func_t)(const DevMem2D& image, DevMem2D edges, const float4& lo, const float4& hi, cudaStream_t stream);
|
||||||
|
|
||||||
|
static const func_t suppotLookup[8][4] =
|
||||||
|
{ // 1, 2, 3, 4
|
||||||
|
{ device::ccl::computeEdges<uchar>, 0, device::ccl::computeEdges<uchar3>, device::ccl::computeEdges<uchar4> },// CV_8U
|
||||||
|
{ 0, 0, 0, 0 },// CV_16U
|
||||||
|
{ device::ccl::computeEdges<ushort>, 0, device::ccl::computeEdges<ushort3>, device::ccl::computeEdges<ushort4> },// CV_8S
|
||||||
|
{ 0, 0, 0, 0 },// CV_16S
|
||||||
|
{ device::ccl::computeEdges<int>, 0, 0, 0 },// CV_32S
|
||||||
|
{ device::ccl::computeEdges<float>, 0, 0, 0 },// CV_32F
|
||||||
|
{ 0, 0, 0, 0 },// CV_64F
|
||||||
|
{ 0, 0, 0, 0 } // CV_USRTYPE1
|
||||||
|
};
|
||||||
|
|
||||||
|
func_t f = suppotLookup[depth][ch - 1];
|
||||||
|
CV_Assert(f);
|
||||||
|
|
||||||
|
if (image.size() != mask.size() || mask.type() != CV_8UC1)
|
||||||
|
mask.create(image.size(), CV_8UC1);
|
||||||
|
|
||||||
|
cudaStream_t stream = StreamAccessor::getStream(s);
|
||||||
|
float4 culo = scalarToCudaType(lo), cuhi = scalarToCudaType(hi);
|
||||||
|
f(image, mask, culo, cuhi, stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cv::gpu::labelComponents(const GpuMat& mask, GpuMat& components, Stream& s)
|
||||||
|
{
|
||||||
|
CV_Assert(!mask.empty() && mask.type() == CV_8U);
|
||||||
|
|
||||||
|
if (mask.size() != components.size() || components.type() != CV_32SC1)
|
||||||
|
components.create(mask.size(), CV_32SC1);
|
||||||
|
|
||||||
|
cudaStream_t stream = StreamAccessor::getStream(s);
|
||||||
|
device::ccl::labelComponents(mask, components, stream);
|
||||||
|
}
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
typedef NppStatus (*init_func_t)(NppiSize oSize, NppiGraphcutState** ppState, Npp8u* pDeviceMem);
|
typedef NppStatus (*init_func_t)(NppiSize oSize, NppiGraphcutState** ppState, Npp8u* pDeviceMem);
|
||||||
|
@ -41,6 +41,8 @@
|
|||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
|
|
||||||
|
#ifdef HAVE_CUDA
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -1628,7 +1630,7 @@ TEST_P(CvtColor, BGR2Lab)
|
|||||||
}
|
}
|
||||||
catch (const cv::Exception& e)
|
catch (const cv::Exception& e)
|
||||||
{
|
{
|
||||||
#if (CUDA_VERSION < 5000)
|
#if defined (CUDA_VERSION) && (CUDA_VERSION < 5000)
|
||||||
ASSERT_EQ(CV_StsBadFlag, e.code);
|
ASSERT_EQ(CV_StsBadFlag, e.code);
|
||||||
#else
|
#else
|
||||||
FAIL();
|
FAIL();
|
||||||
@ -1655,7 +1657,7 @@ TEST_P(CvtColor, RGB2Lab)
|
|||||||
}
|
}
|
||||||
catch (const cv::Exception& e)
|
catch (const cv::Exception& e)
|
||||||
{
|
{
|
||||||
#if (CUDA_VERSION < 5000)
|
#if defined (CUDA_VERSION) && (CUDA_VERSION < 5000)
|
||||||
ASSERT_EQ(CV_StsBadFlag, e.code);
|
ASSERT_EQ(CV_StsBadFlag, e.code);
|
||||||
#else
|
#else
|
||||||
FAIL();
|
FAIL();
|
||||||
@ -1682,7 +1684,7 @@ TEST_P(CvtColor, BGR2Luv)
|
|||||||
}
|
}
|
||||||
catch (const cv::Exception& e)
|
catch (const cv::Exception& e)
|
||||||
{
|
{
|
||||||
#if (CUDA_VERSION < 5000)
|
#if defined (CUDA_VERSION) && (CUDA_VERSION < 5000)
|
||||||
ASSERT_EQ(CV_StsBadFlag, e.code);
|
ASSERT_EQ(CV_StsBadFlag, e.code);
|
||||||
#else
|
#else
|
||||||
FAIL();
|
FAIL();
|
||||||
@ -1709,7 +1711,7 @@ TEST_P(CvtColor, RGB2Luv)
|
|||||||
}
|
}
|
||||||
catch (const cv::Exception& e)
|
catch (const cv::Exception& e)
|
||||||
{
|
{
|
||||||
#if (CUDA_VERSION < 5000)
|
#if defined (CUDA_VERSION) && (CUDA_VERSION < 5000)
|
||||||
ASSERT_EQ(CV_StsBadFlag, e.code);
|
ASSERT_EQ(CV_StsBadFlag, e.code);
|
||||||
#else
|
#else
|
||||||
FAIL();
|
FAIL();
|
||||||
@ -1736,7 +1738,7 @@ TEST_P(CvtColor, RGBA2mRGBA)
|
|||||||
}
|
}
|
||||||
catch (const cv::Exception& e)
|
catch (const cv::Exception& e)
|
||||||
{
|
{
|
||||||
#if (CUDA_VERSION < 5000)
|
#if defined (CUDA_VERSION) && (CUDA_VERSION < 5000)
|
||||||
ASSERT_EQ(CV_StsBadFlag, e.code);
|
ASSERT_EQ(CV_StsBadFlag, e.code);
|
||||||
#else
|
#else
|
||||||
FAIL();
|
FAIL();
|
||||||
@ -1744,6 +1746,159 @@ TEST_P(CvtColor, RGBA2mRGBA)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_P(CvtColor, BayerBG2BGR)
|
||||||
|
{
|
||||||
|
if ((depth != CV_8U && depth != CV_16U) || useRoi)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cv::Mat src = randomMat(size, depth);
|
||||||
|
|
||||||
|
cv::gpu::GpuMat dst;
|
||||||
|
cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerBG2BGR);
|
||||||
|
|
||||||
|
cv::Mat dst_gold;
|
||||||
|
cv::cvtColor(src, dst_gold, cv::COLOR_BayerBG2BGR);
|
||||||
|
|
||||||
|
EXPECT_MAT_NEAR(dst_gold(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), dst(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(CvtColor, BayerBG2BGR4)
|
||||||
|
{
|
||||||
|
if ((depth != CV_8U && depth != CV_16U) || useRoi)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cv::Mat src = randomMat(size, depth);
|
||||||
|
|
||||||
|
cv::gpu::GpuMat dst;
|
||||||
|
cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerBG2BGR, 4);
|
||||||
|
|
||||||
|
ASSERT_EQ(4, dst.channels());
|
||||||
|
|
||||||
|
cv::Mat dst_gold;
|
||||||
|
cv::cvtColor(src, dst_gold, cv::COLOR_BayerBG2BGR);
|
||||||
|
|
||||||
|
cv::Mat dst4(dst);
|
||||||
|
cv::Mat dst3;
|
||||||
|
cv::cvtColor(dst4, dst3, cv::COLOR_BGRA2BGR);
|
||||||
|
|
||||||
|
|
||||||
|
EXPECT_MAT_NEAR(dst_gold(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), dst3(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(CvtColor, BayerGB2BGR)
|
||||||
|
{
|
||||||
|
if ((depth != CV_8U && depth != CV_16U) || useRoi)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cv::Mat src = randomMat(size, depth);
|
||||||
|
|
||||||
|
cv::gpu::GpuMat dst;
|
||||||
|
cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerGB2BGR);
|
||||||
|
|
||||||
|
cv::Mat dst_gold;
|
||||||
|
cv::cvtColor(src, dst_gold, cv::COLOR_BayerGB2BGR);
|
||||||
|
|
||||||
|
EXPECT_MAT_NEAR(dst_gold(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), dst(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(CvtColor, BayerGB2BGR4)
|
||||||
|
{
|
||||||
|
if ((depth != CV_8U && depth != CV_16U) || useRoi)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cv::Mat src = randomMat(size, depth);
|
||||||
|
|
||||||
|
cv::gpu::GpuMat dst;
|
||||||
|
cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerGB2BGR, 4);
|
||||||
|
|
||||||
|
ASSERT_EQ(4, dst.channels());
|
||||||
|
|
||||||
|
cv::Mat dst_gold;
|
||||||
|
cv::cvtColor(src, dst_gold, cv::COLOR_BayerGB2BGR);
|
||||||
|
|
||||||
|
cv::Mat dst4(dst);
|
||||||
|
cv::Mat dst3;
|
||||||
|
cv::cvtColor(dst4, dst3, cv::COLOR_BGRA2BGR);
|
||||||
|
|
||||||
|
EXPECT_MAT_NEAR(dst_gold(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), dst3(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(CvtColor, BayerRG2BGR)
|
||||||
|
{
|
||||||
|
if ((depth != CV_8U && depth != CV_16U) || useRoi)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cv::Mat src = randomMat(size, depth);
|
||||||
|
|
||||||
|
cv::gpu::GpuMat dst;
|
||||||
|
cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerRG2BGR);
|
||||||
|
|
||||||
|
cv::Mat dst_gold;
|
||||||
|
cv::cvtColor(src, dst_gold, cv::COLOR_BayerRG2BGR);
|
||||||
|
|
||||||
|
EXPECT_MAT_NEAR(dst_gold(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), dst(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(CvtColor, BayerRG2BGR4)
|
||||||
|
{
|
||||||
|
if ((depth != CV_8U && depth != CV_16U) || useRoi)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cv::Mat src = randomMat(size, depth);
|
||||||
|
|
||||||
|
cv::gpu::GpuMat dst;
|
||||||
|
cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerRG2BGR, 4);
|
||||||
|
|
||||||
|
ASSERT_EQ(4, dst.channels());
|
||||||
|
|
||||||
|
cv::Mat dst_gold;
|
||||||
|
cv::cvtColor(src, dst_gold, cv::COLOR_BayerRG2BGR);
|
||||||
|
|
||||||
|
cv::Mat dst4(dst);
|
||||||
|
cv::Mat dst3;
|
||||||
|
cv::cvtColor(dst4, dst3, cv::COLOR_BGRA2BGR);
|
||||||
|
|
||||||
|
EXPECT_MAT_NEAR(dst_gold(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), dst3(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(CvtColor, BayerGR2BGR)
|
||||||
|
{
|
||||||
|
if ((depth != CV_8U && depth != CV_16U) || useRoi)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cv::Mat src = randomMat(size, depth);
|
||||||
|
|
||||||
|
cv::gpu::GpuMat dst;
|
||||||
|
cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerGR2BGR);
|
||||||
|
|
||||||
|
cv::Mat dst_gold;
|
||||||
|
cv::cvtColor(src, dst_gold, cv::COLOR_BayerGR2BGR);
|
||||||
|
|
||||||
|
EXPECT_MAT_NEAR(dst_gold(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), dst(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(CvtColor, BayerGR2BGR4)
|
||||||
|
{
|
||||||
|
if ((depth != CV_8U && depth != CV_16U) || useRoi)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cv::Mat src = randomMat(size, depth);
|
||||||
|
|
||||||
|
cv::gpu::GpuMat dst;
|
||||||
|
cv::gpu::cvtColor(loadMat(src, useRoi), dst, cv::COLOR_BayerGR2BGR, 4);
|
||||||
|
|
||||||
|
ASSERT_EQ(4, dst.channels());
|
||||||
|
|
||||||
|
cv::Mat dst_gold;
|
||||||
|
cv::cvtColor(src, dst_gold, cv::COLOR_BayerGR2BGR);
|
||||||
|
|
||||||
|
cv::Mat dst4(dst);
|
||||||
|
cv::Mat dst3;
|
||||||
|
cv::cvtColor(dst4, dst3, cv::COLOR_BGRA2BGR);
|
||||||
|
|
||||||
|
EXPECT_MAT_NEAR(dst_gold(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), dst3(cv::Rect(1, 1, dst.cols - 2, dst.rows - 2)), 0);
|
||||||
|
}
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, CvtColor, testing::Combine(
|
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, CvtColor, testing::Combine(
|
||||||
ALL_DEVICES,
|
ALL_DEVICES,
|
||||||
DIFFERENT_SIZES,
|
DIFFERENT_SIZES,
|
||||||
@ -1791,3 +1946,5 @@ INSTANTIATE_TEST_CASE_P(GPU_ImgProc, SwapChannels, testing::Combine(
|
|||||||
WHOLE_SUBMAT));
|
WHOLE_SUBMAT));
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
#endif // HAVE_CUDA
|
||||||
|
205
modules/gpu/test/test_labeling.cpp
Normal file
205
modules/gpu/test/test_labeling.cpp
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||||
|
//
|
||||||
|
// By downloading, copying, installing or using the software you agree to this license.
|
||||||
|
// If you do not agree to this license, do not download, install,
|
||||||
|
// copy or use the software.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// License Agreement
|
||||||
|
// For Open Source Computer Vision Library
|
||||||
|
//
|
||||||
|
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||||
|
// Copyright (C) 2008-2011, Willow Garage Inc., all rights reserved.
|
||||||
|
// Third party copyrights are property of their respective owners.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
// are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other materials provided with the distribution.
|
||||||
|
//
|
||||||
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
|
// derived from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// This software is provided by the copyright holders and contributors "as is" and
|
||||||
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
|
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||||
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
|
// indirect, incidental, special, exemplary, or consequential damages
|
||||||
|
// (including, but not limited to, procurement of substitute goods or services;
|
||||||
|
// loss of use, data, or profits; or business interruption) however caused
|
||||||
|
// and on any theory of liability, whether in contract, strict liability,
|
||||||
|
// or tort (including negligence or otherwise) arising in any way out of
|
||||||
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
|
//M*/
|
||||||
|
|
||||||
|
#include "precomp.hpp"
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#ifdef HAVE_CUDA
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
struct GreedyLabeling
|
||||||
|
{
|
||||||
|
struct dot
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
|
||||||
|
static dot make(int i, int j)
|
||||||
|
{
|
||||||
|
dot d; d.x = i; d.y = j;
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InInterval
|
||||||
|
{
|
||||||
|
InInterval(const int& _lo, const int& _hi) : lo(-_lo), hi(_hi) {};
|
||||||
|
const int lo, hi;
|
||||||
|
|
||||||
|
bool operator() (const unsigned char a, const unsigned char b) const
|
||||||
|
{
|
||||||
|
int d = a - b;
|
||||||
|
return lo <= d && d <= hi;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
GreedyLabeling(cv::Mat img)
|
||||||
|
: image(img), _labels(image.cols, image.rows, CV_32SC1, cv::Scalar::all(-1)) {}
|
||||||
|
|
||||||
|
void operator() (cv::Mat labels) const
|
||||||
|
{
|
||||||
|
InInterval inInt(0, 2);
|
||||||
|
dot* stack = new dot[image.cols * image.rows];
|
||||||
|
|
||||||
|
int cc = -1;
|
||||||
|
|
||||||
|
int* dist_labels = (int*)labels.data;
|
||||||
|
int pitch = labels.step1();
|
||||||
|
|
||||||
|
unsigned char* source = (unsigned char*)image.data;
|
||||||
|
int width = image.cols;
|
||||||
|
int height = image.rows;
|
||||||
|
|
||||||
|
for (int j = 0; j < image.rows; ++j)
|
||||||
|
for(int i = 0; i < image.cols; ++i)
|
||||||
|
{
|
||||||
|
if (dist_labels[j * pitch + i] != -1) continue;
|
||||||
|
|
||||||
|
dot* top = stack;
|
||||||
|
dot p = dot::make(i, j);
|
||||||
|
cc++;
|
||||||
|
|
||||||
|
dist_labels[j * pitch + i] = cc;
|
||||||
|
|
||||||
|
while (top >= stack)
|
||||||
|
{
|
||||||
|
int* dl = &dist_labels[p.y * pitch + p.x];
|
||||||
|
unsigned char* sp = &source[p.y * image.step1() + p.x];
|
||||||
|
|
||||||
|
//right
|
||||||
|
if( p.x < (width - 1) && dl[ +1] == -1 && inInt(sp[0], sp[+1]))
|
||||||
|
{
|
||||||
|
dl[+1] = cc;
|
||||||
|
*top++ = dot::make(p.x + 1, p.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
//left
|
||||||
|
if( p.x > 0 && dl[-1] == -1 && inInt(sp[0], sp[-1]))
|
||||||
|
{
|
||||||
|
dl[-1] = cc;
|
||||||
|
*top++ = dot::make(p.x - 1, p.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
//bottom
|
||||||
|
if( p.y < (height - 1) && dl[+pitch] == -1 && inInt(sp[0], sp[+pitch]))
|
||||||
|
{
|
||||||
|
dl[+pitch] = cc;
|
||||||
|
*top++ = dot::make(p.x, p.y + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//top
|
||||||
|
if( p.y > 0 && dl[-pitch] == -1 && inInt(sp[0], sp[-pitch]))
|
||||||
|
{
|
||||||
|
dl[-pitch] = cc;
|
||||||
|
*top++ = dot::make(p.x, p.y - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
p = *--top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete[] stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
cv::Mat image;
|
||||||
|
cv::Mat _labels;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Labeling : testing::TestWithParam<cv::gpu::DeviceInfo>
|
||||||
|
{
|
||||||
|
cv::gpu::DeviceInfo devInfo;
|
||||||
|
|
||||||
|
virtual void SetUp()
|
||||||
|
{
|
||||||
|
devInfo = GetParam();
|
||||||
|
cv::gpu::setDevice(devInfo.deviceID());
|
||||||
|
}
|
||||||
|
|
||||||
|
cv::Mat loat_image()
|
||||||
|
{
|
||||||
|
return cv::imread(std::string( cvtest::TS::ptr()->get_data_path() ) + "labeling/label.png");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_P(Labeling, ConnectedComponents)
|
||||||
|
{
|
||||||
|
cv::Mat image;
|
||||||
|
cvtColor(loat_image(), image, CV_BGR2GRAY);
|
||||||
|
|
||||||
|
ASSERT_TRUE(image.type() == CV_8UC1);
|
||||||
|
|
||||||
|
GreedyLabeling host(image);
|
||||||
|
host(host._labels);
|
||||||
|
|
||||||
|
cv::gpu::GpuMat mask;
|
||||||
|
mask.create(image.rows, image.cols, CV_8UC1);
|
||||||
|
|
||||||
|
cv::gpu::GpuMat components;
|
||||||
|
components.create(image.rows, image.cols, CV_32SC1);
|
||||||
|
|
||||||
|
cv::gpu::connectivityMask(cv::gpu::GpuMat(image), mask, cv::Scalar::all(0), cv::Scalar::all(2));
|
||||||
|
|
||||||
|
ASSERT_NO_THROW(cv::gpu::labelComponents(mask, components));
|
||||||
|
|
||||||
|
// for (int j = 0; j + 32 < components.rows; j += 32)
|
||||||
|
// for (int i = 0; i + 32 < components.cols; i += 32)
|
||||||
|
// {
|
||||||
|
// std::cout << "Tile: " << i << " " << j << std::endl;
|
||||||
|
// std::cout << cv::Mat(host._labels, cv::Rect(i,j,32,32)) << std::endl;
|
||||||
|
// std::cout << cv::Mat(cv::Mat(components), cv::Rect(i,j,32,32)) << std::endl;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// for debug
|
||||||
|
// cv::imshow("test", image);
|
||||||
|
// cv::waitKey(0);
|
||||||
|
// cv::imshow("test", host._labels * 50);
|
||||||
|
// cv::waitKey(0);
|
||||||
|
// // cv::imshow("test", cv::Mat(mask) * 10);
|
||||||
|
// // cv::waitKey(0);
|
||||||
|
// cv::imshow("test", cv::Mat(components) * 2);
|
||||||
|
// cv::waitKey(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(ConnectedComponents, Labeling, ALL_DEVICES);
|
||||||
|
|
||||||
|
#endif
|
@ -294,7 +294,7 @@ The methods/functions grab the next frame from video file or camera and return t
|
|||||||
|
|
||||||
The primary use of the function is in multi-camera environments, especially when the cameras do not have hardware synchronization. That is, you call ``VideoCapture::grab()`` for each camera and after that call the slower method ``VideoCapture::retrieve()`` to decode and get frame from each camera. This way the overhead on demosaicing or motion jpeg decompression etc. is eliminated and the retrieved frames from different cameras will be closer in time.
|
The primary use of the function is in multi-camera environments, especially when the cameras do not have hardware synchronization. That is, you call ``VideoCapture::grab()`` for each camera and after that call the slower method ``VideoCapture::retrieve()`` to decode and get frame from each camera. This way the overhead on demosaicing or motion jpeg decompression etc. is eliminated and the retrieved frames from different cameras will be closer in time.
|
||||||
|
|
||||||
Also, when a connected camera is multi-head (for example, a stereo camera or a Kinect device), the correct way of retrieving data from it is to call `VideoCapture::grab` first and then call :ocv:func:`VideoCapture::retrieve` one or more times with different values of the ``channel`` parameter. See http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/kinect_maps.cpp
|
Also, when a connected camera is multi-head (for example, a stereo camera or a Kinect device), the correct way of retrieving data from it is to call `VideoCapture::grab` first and then call :ocv:func:`VideoCapture::retrieve` one or more times with different values of the ``channel`` parameter. See http://code.opencv.org/projects/opencv/repository/revisions/master/entry/samples/cpp/kinect_maps.cpp
|
||||||
|
|
||||||
|
|
||||||
VideoCapture::retrieve
|
VideoCapture::retrieve
|
||||||
|
@ -203,7 +203,7 @@ Sets mouse handler for the specified window
|
|||||||
|
|
||||||
:param winname: Window name
|
:param winname: Window name
|
||||||
|
|
||||||
:param onMouse: Mouse callback. See OpenCV samples, such as http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/ffilldemo.cpp, on how to specify and use the callback.
|
:param onMouse: Mouse callback. See OpenCV samples, such as http://code.opencv.org/projects/opencv/repository/revisions/master/entry/samples/cpp/ffilldemo.cpp, on how to specify and use the callback.
|
||||||
|
|
||||||
:param userdata: The optional parameter passed to the callback.
|
:param userdata: The optional parameter passed to the callback.
|
||||||
|
|
||||||
|
@ -202,7 +202,7 @@ Approximates a polygonal curve(s) with the specified precision.
|
|||||||
The functions ``approxPolyDP`` approximate a curve or a polygon with another curve/polygon with less vertices so that the distance between them is less or equal to the specified precision. It uses the Douglas-Peucker algorithm
|
The functions ``approxPolyDP`` approximate a curve or a polygon with another curve/polygon with less vertices so that the distance between them is less or equal to the specified precision. It uses the Douglas-Peucker algorithm
|
||||||
http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm
|
http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm
|
||||||
|
|
||||||
See http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/contours.cpp for the function usage model.
|
See http://code.opencv.org/projects/opencv/repository/revisions/master/entry/samples/cpp/contours.cpp for the function usage model.
|
||||||
|
|
||||||
|
|
||||||
ApproxChains
|
ApproxChains
|
||||||
|
@ -1353,8 +1353,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Mat *temp;
|
|
||||||
Mat *dest;
|
Mat *dest;
|
||||||
|
const Mat *temp;
|
||||||
int radius, maxk, *space_ofs;
|
int radius, maxk, *space_ofs;
|
||||||
float *space_weight, *color_weight;
|
float *space_weight, *color_weight;
|
||||||
};
|
};
|
||||||
|
@ -21,7 +21,7 @@ The word "cascade" in the classifier name means that the resultant classifier co
|
|||||||
The feature used in a particular classifier is specified by its shape (1a, 2b etc.), position within the region of interest and the scale (this scale is not the same as the scale used at the detection stage, though these two scales are multiplied). For example, in the case of the third line feature (2c) the response is calculated as the difference between the sum of image pixels under the rectangle covering the whole feature (including the two white stripes and the black stripe in the middle) and the sum of the image pixels under the black stripe multiplied by 3 in order to compensate for the differences in the size of areas. The sums of pixel values over a rectangular regions are calculated rapidly using integral images (see below and the :ocv:func:`integral` description).
|
The feature used in a particular classifier is specified by its shape (1a, 2b etc.), position within the region of interest and the scale (this scale is not the same as the scale used at the detection stage, though these two scales are multiplied). For example, in the case of the third line feature (2c) the response is calculated as the difference between the sum of image pixels under the rectangle covering the whole feature (including the two white stripes and the black stripe in the middle) and the sum of the image pixels under the black stripe multiplied by 3 in order to compensate for the differences in the size of areas. The sums of pixel values over a rectangular regions are calculated rapidly using integral images (see below and the :ocv:func:`integral` description).
|
||||||
|
|
||||||
To see the object detector at work, have a look at the facedetect demo:
|
To see the object detector at work, have a look at the facedetect demo:
|
||||||
http://code.opencv.org/svn/opencv/trunk/opencv/samples/cpp/facedetect.cpp
|
http://code.opencv.org/projects/opencv/repository/revisions/master/entry/samples/cpp/facedetect.cpp
|
||||||
|
|
||||||
The following reference is for the detection part only. There is a separate application called ``opencv_traincascade`` that can train a cascade of boosted classifiers from a set of samples.
|
The following reference is for the detection part only. There is a separate application called ``opencv_traincascade`` that can train a cascade of boosted classifiers from a set of samples.
|
||||||
|
|
||||||
|
@ -444,7 +444,7 @@ inline int predictCategoricalStump( CascadeClassifier& cascade, Ptr<FeatureEvalu
|
|||||||
CascadeClassifier::Data::Stage* cascadeStages = &cascade.data.stages[0];
|
CascadeClassifier::Data::Stage* cascadeStages = &cascade.data.stages[0];
|
||||||
|
|
||||||
#ifdef HAVE_TEGRA_OPTIMIZATION
|
#ifdef HAVE_TEGRA_OPTIMIZATION
|
||||||
float tmp; // float accumulator -- float operations are quicker
|
float tmp = 0; // float accumulator -- float operations are quicker
|
||||||
#endif
|
#endif
|
||||||
for( int si = 0; si < nstages; si++ )
|
for( int si = 0; si < nstages; si++ )
|
||||||
{
|
{
|
||||||
|
@ -29,6 +29,14 @@ if (HAVE_OPENCL)
|
|||||||
if(OPENCL_INCLUDE_DIR)
|
if(OPENCL_INCLUDE_DIR)
|
||||||
ocv_include_directories(${OPENCL_INCLUDE_DIR})
|
ocv_include_directories(${OPENCL_INCLUDE_DIR})
|
||||||
endif()
|
endif()
|
||||||
|
if (HAVE_CLAMDFFT)
|
||||||
|
set(ocl_link_libs ${ocl_link_libs} ${CLAMDFFT_LIBRARIES})
|
||||||
|
ocv_include_directories(${CLAMDFFT_INCLUDE_DIR})
|
||||||
|
endif()
|
||||||
|
if (HAVE_CLAMDBLAS)
|
||||||
|
set(ocl_link_libs ${ocl_link_libs} ${CLAMDBLAS_LIBRARIES})
|
||||||
|
ocv_include_directories(${CLAMDBLAS_INCLUDE_DIR})
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
ocv_set_module_sources(
|
ocv_set_module_sources(
|
||||||
|
@ -1,19 +1,20 @@
|
|||||||
************************************
|
***************************************
|
||||||
ocl. OpenCL-accelerated Computer Vision
|
ocl. OpenCL-accelerated Computer Vision
|
||||||
************************************
|
***************************************
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
introduction
|
introduction
|
||||||
initalization_and_information
|
structures_and_functions
|
||||||
data_structures
|
.. initalization_and_information
|
||||||
operations_on_matrices
|
.. data_structures
|
||||||
per_element_operations
|
.. operations_on_matrices
|
||||||
image_processing
|
.. per_element_operations
|
||||||
matrix_reductions
|
.. image_processing
|
||||||
object_detection
|
.. matrix_reductions
|
||||||
feature_detection_and_description
|
.. object_detection
|
||||||
image_filtering
|
.. feature_detection_and_description
|
||||||
camera_calibration_and_3d_reconstruction
|
.. image_filtering
|
||||||
video
|
.. camera_calibration_and_3d_reconstruction
|
||||||
|
.. video
|
||||||
|
@ -859,6 +859,71 @@ namespace cv
|
|||||||
void benchmark_copy_offset_stride(const oclMat &src, oclMat &dst);
|
void benchmark_copy_offset_stride(const oclMat &src, oclMat &dst);
|
||||||
void benchmark_ILP();
|
void benchmark_ILP();
|
||||||
|
|
||||||
|
//! computes vertical sum, supports only CV_32FC1 images
|
||||||
|
CV_EXPORTS void columnSum(const oclMat& src, oclMat& sum);
|
||||||
|
|
||||||
|
//! performs linear blending of two images
|
||||||
|
//! to avoid accuracy errors sum of weigths shouldn't be very close to zero
|
||||||
|
// supports only CV_8UC1 source type
|
||||||
|
CV_EXPORTS void blendLinear(const oclMat& img1, const oclMat& img2, const oclMat& weights1, const oclMat& weights2, oclMat& result);
|
||||||
|
|
||||||
|
/////////////////////////////// Pyramid /////////////////////////////////////
|
||||||
|
CV_EXPORTS void pyrDown(const oclMat& src, oclMat& dst);
|
||||||
|
|
||||||
|
//! upsamples the source image and then smoothes it
|
||||||
|
CV_EXPORTS void pyrUp(const cv::ocl::oclMat& src,cv::ocl::oclMat& dst);
|
||||||
|
|
||||||
|
///////////////////////////////////////// match_template /////////////////////////////////////////////////////////////
|
||||||
|
struct CV_EXPORTS MatchTemplateBuf
|
||||||
|
{
|
||||||
|
Size user_block_size;
|
||||||
|
oclMat imagef, templf;
|
||||||
|
std::vector<oclMat> images;
|
||||||
|
std::vector<oclMat> image_sums;
|
||||||
|
std::vector<oclMat> image_sqsums;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//! computes the proximity map for the raster template and the image where the template is searched for
|
||||||
|
// Supports TM_SQDIFF, TM_SQDIFF_NORMED, TM_CCORR, TM_CCORR_NORMED, TM_CCOEFF, TM_CCOEFF_NORMED for type 8UC1 and 8UC4
|
||||||
|
// Supports TM_SQDIFF, TM_CCORR for type 32FC1 and 32FC4
|
||||||
|
CV_EXPORTS void matchTemplate(const oclMat& image, const oclMat& templ, oclMat& result, int method);
|
||||||
|
|
||||||
|
//! computes the proximity map for the raster template and the image where the template is searched for
|
||||||
|
// Supports TM_SQDIFF, TM_SQDIFF_NORMED, TM_CCORR, TM_CCORR_NORMED, TM_CCOEFF, TM_CCOEFF_NORMED for type 8UC1 and 8UC4
|
||||||
|
// Supports TM_SQDIFF, TM_CCORR for type 32FC1 and 32FC4
|
||||||
|
CV_EXPORTS void matchTemplate(const oclMat& image, const oclMat& templ, oclMat& result, int method, MatchTemplateBuf& buf);
|
||||||
|
|
||||||
|
#ifdef HAVE_CLAMDFFT
|
||||||
|
///////////////////////////////////////// clAmdFft related /////////////////////////////////////////
|
||||||
|
// the two functions must be called before/after run any fft library functions.
|
||||||
|
CV_EXPORTS void fft_setup(); // this will be implicitly invoked
|
||||||
|
CV_EXPORTS void fft_teardown(); // you need to teardown fft library manually
|
||||||
|
|
||||||
|
/////////////////////////////////////// DFT /////////////////////////////////////////////////////
|
||||||
|
//! Performs a forward or inverse discrete Fourier transform (1D or 2D) of floating point matrix.
|
||||||
|
//! Param dft_size is the size of DFT transform.
|
||||||
|
//!
|
||||||
|
//! For complex-to-real transform it is assumed that the source matrix is packed in CLFFT's format.
|
||||||
|
// support src type of CV32FC1, CV32FC2
|
||||||
|
// support flags: DFT_INVERSE, DFT_REAL_OUTPUT, DFT_COMPLEX_OUTPUT, DFT_ROWS
|
||||||
|
// dft_size is the size of original input, which is used for transformation from complex to real.
|
||||||
|
// dft_size must be powers of 2, 3 and 5
|
||||||
|
// real to complex dft requires at least v1.8 clAmdFft
|
||||||
|
// real to complex dft output is not the same with cpu version
|
||||||
|
// real to complex and complex to real does not support DFT_ROWS
|
||||||
|
CV_EXPORTS void dft(const oclMat& src, oclMat& dst, Size dft_size = Size(0, 0), int flags = 0);
|
||||||
|
#endif // HAVE_CLAMDFFT
|
||||||
|
|
||||||
|
#ifdef HAVE_CLAMDBLAS
|
||||||
|
//! implements generalized matrix product algorithm GEMM from BLAS
|
||||||
|
// The functionality requires clAmdBlas library
|
||||||
|
// only support type CV_32FC1
|
||||||
|
// flag GEMM_3_T is not supported
|
||||||
|
CV_EXPORTS void gemm(const oclMat& src1, const oclMat& src2, double alpha,
|
||||||
|
const oclMat& src3, double beta, oclMat& dst, int flags = 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#include "opencv2/ocl/matrix_operations.hpp"
|
#include "opencv2/ocl/matrix_operations.hpp"
|
||||||
|
98
modules/ocl/src/blend.cpp
Normal file
98
modules/ocl/src/blend.cpp
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||||
|
//
|
||||||
|
// By downloading, copying, installing or using the software you agree to this license.
|
||||||
|
// If you do not agree to this license, do not download, install,
|
||||||
|
// copy or use the software.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// License Agreement
|
||||||
|
// For Open Source Computer Vision Library
|
||||||
|
//
|
||||||
|
// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
|
||||||
|
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
|
||||||
|
// Third party copyrights are property of their respective owners.
|
||||||
|
//
|
||||||
|
// @Authors
|
||||||
|
// Nathan, liujun@multicorewareinc.com
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
// are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistribution's of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other oclMaterials provided with the distribution.
|
||||||
|
//
|
||||||
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
|
// derived from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// This software is provided by the copyright holders and contributors "as is" and
|
||||||
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
|
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||||
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
|
// indirect, incidental, special, exemplary, or consequential damages
|
||||||
|
// (including, but not limited to, procurement of substitute goods or services;
|
||||||
|
// loss of use, data, or profits; or business interruption) however caused
|
||||||
|
// and on any theory of liability, whether in contract, strict liability,
|
||||||
|
// or tort (including negligence or otherwise) arising in any way out of
|
||||||
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
|
//
|
||||||
|
//M*/
|
||||||
|
|
||||||
|
#include "precomp.hpp"
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
|
using namespace cv;
|
||||||
|
using namespace cv::ocl;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#if !defined (HAVE_OPENCL)
|
||||||
|
void cv::ocl::blendLinear(const oclMat& img1, const oclMat& img2, const oclMat& weights1, const oclMat& weights2,
|
||||||
|
oclMat& result){throw_nogpu();}
|
||||||
|
#else
|
||||||
|
namespace cv
|
||||||
|
{
|
||||||
|
namespace ocl
|
||||||
|
{
|
||||||
|
////////////////////////////////////OpenCL kernel strings//////////////////////////
|
||||||
|
extern const char *blend_linear;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cv::ocl::blendLinear(const oclMat& img1, const oclMat& img2, const oclMat& weights1, const oclMat& weights2,
|
||||||
|
oclMat& result)
|
||||||
|
{
|
||||||
|
cv::ocl::Context *ctx = img1.clCxt;
|
||||||
|
assert(ctx == img2.clCxt && ctx == weights1.clCxt && ctx == weights2.clCxt);
|
||||||
|
int channels = img1.channels();
|
||||||
|
int depth = img1.depth();
|
||||||
|
int rows = img1.rows;
|
||||||
|
int cols = img1.cols;
|
||||||
|
int istep = img1.step;
|
||||||
|
int wstep = weights1.step;
|
||||||
|
size_t globalSize[] = {cols * channels, rows, 1};
|
||||||
|
size_t localSize[] = {16, 16, 1};
|
||||||
|
|
||||||
|
vector< pair<size_t, const void *> > args;
|
||||||
|
|
||||||
|
if(globalSize[0]!=0)
|
||||||
|
{
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data ));
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&img1.data ));
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&img2.data ));
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&weights1.data ));
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&weights2.data ));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&rows ));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&cols ));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&istep ));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&wstep ));
|
||||||
|
std::string kernelName = "BlendLinear";
|
||||||
|
|
||||||
|
openCLExecuteKernel(ctx, &blend_linear, kernelName, globalSize, localSize, args, channels, depth);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
91
modules/ocl/src/columnsum.cpp
Normal file
91
modules/ocl/src/columnsum.cpp
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||||
|
//
|
||||||
|
// By downloading, copying, installing or using the software you agree to this license.
|
||||||
|
// If you do not agree to this license, do not download, install,
|
||||||
|
// copy or use the software.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// License Agreement
|
||||||
|
// For Open Source Computer Vision Library
|
||||||
|
//
|
||||||
|
// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
|
||||||
|
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
|
||||||
|
// Third party copyrights are property of their respective owners.
|
||||||
|
//
|
||||||
|
// @Authors
|
||||||
|
// Chunpeng Zhang, chunpeng@multicorewareinc.com
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
// are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistribution's of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other oclMaterials provided with the distribution.
|
||||||
|
//
|
||||||
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
|
// derived from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// This software is provided by the copyright holders and contributors as is and
|
||||||
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
|
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||||
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
|
// indirect, incidental, special, exemplary, or consequential damages
|
||||||
|
// (including, but not limited to, procurement of substitute goods or services;
|
||||||
|
// loss of use, data, or profits; or business interruption) however caused
|
||||||
|
// and on any theory of liability, whether in contract, strict liability,
|
||||||
|
// or tort (including negligence or otherwise) arising in any way out of
|
||||||
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
|
//
|
||||||
|
//M*/
|
||||||
|
|
||||||
|
#include <iomanip>
|
||||||
|
#include "precomp.hpp"
|
||||||
|
|
||||||
|
using namespace cv;
|
||||||
|
using namespace cv::ocl;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(HAVE_OPENCL)
|
||||||
|
|
||||||
|
void cv::ocl::columnSum(const oclMat& src,oclMat& dst){ throw_nogpu(); }
|
||||||
|
|
||||||
|
#else /*!HAVE_OPENCL */
|
||||||
|
|
||||||
|
namespace cv
|
||||||
|
{
|
||||||
|
namespace ocl
|
||||||
|
{
|
||||||
|
extern const char* imgproc_columnsum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cv::ocl::columnSum(const oclMat& src,oclMat& dst)
|
||||||
|
{
|
||||||
|
CV_Assert(src.type() == CV_32FC1 && dst.type() == CV_32FC1 && src.size() == dst.size());
|
||||||
|
|
||||||
|
Context *clCxt = src.clCxt;
|
||||||
|
|
||||||
|
const std::string kernelName = "columnSum";
|
||||||
|
|
||||||
|
std::vector< pair<size_t, const void *> > args;
|
||||||
|
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&src.data));
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&dst.data));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&src.cols));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&src.rows));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&src.step));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&dst.step));
|
||||||
|
|
||||||
|
size_t globalThreads[3] = {dst.cols, dst.rows, 1};
|
||||||
|
size_t localThreads[3] = {16, 16, 1};
|
||||||
|
|
||||||
|
openCLExecuteKernel(clCxt, &imgproc_columnsum, kernelName, globalThreads, localThreads, args, src.channels(), src.depth());
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
302
modules/ocl/src/fft.cpp
Normal file
302
modules/ocl/src/fft.cpp
Normal file
@ -0,0 +1,302 @@
|
|||||||
|
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||||
|
//
|
||||||
|
// By downloading, copying, installing or using the software you agree to this license.
|
||||||
|
// If you do not agree to this license, do not download, install,
|
||||||
|
// copy or use the software.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// License Agreement
|
||||||
|
// For Open Source Computer Vision Library
|
||||||
|
//
|
||||||
|
// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
|
||||||
|
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
|
||||||
|
// Third party copyrights are property of their respective owners.
|
||||||
|
//
|
||||||
|
// @Authors
|
||||||
|
// Peng Xiao, pengxiao@multicorewareinc.com
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
// are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistribution's of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other oclMaterials provided with the distribution.
|
||||||
|
//
|
||||||
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
|
// derived from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// This software is provided by the copyright holders and contributors as is and
|
||||||
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
|
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||||
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
|
// indirect, incidental, special, exemplary, or consequential damages
|
||||||
|
// (including, but not limited to, procurement of substitute goods or services;
|
||||||
|
// loss of use, data, or profits; or business interruption) however caused
|
||||||
|
// and on any theory of liability, whether in contract, strict liability,
|
||||||
|
// or tort (including negligence or otherwise) arising in any way out of
|
||||||
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
|
//
|
||||||
|
//M*/
|
||||||
|
#include <iomanip>
|
||||||
|
#include "precomp.hpp"
|
||||||
|
|
||||||
|
#ifdef HAVE_CLAMDFFT
|
||||||
|
|
||||||
|
using namespace cv;
|
||||||
|
using namespace cv::ocl;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#if !defined (HAVE_OPENCL)
|
||||||
|
void cv::ocl::dft(const oclMat& src, oclMat& dst, int flags) { throw_nogpu(); }
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <clAmdFft.h>
|
||||||
|
|
||||||
|
namespace cv{ namespace ocl {
|
||||||
|
enum FftType
|
||||||
|
{
|
||||||
|
C2R = 1, // complex to complex
|
||||||
|
R2C = 2, // real to opencl HERMITIAN_INTERLEAVED
|
||||||
|
C2C = 3 // opencl HERMITIAN_INTERLEAVED to real
|
||||||
|
};
|
||||||
|
struct FftPlan
|
||||||
|
{
|
||||||
|
friend void fft_setup();
|
||||||
|
friend void fft_teardown();
|
||||||
|
~FftPlan();
|
||||||
|
protected:
|
||||||
|
FftPlan(Size _dft_size, int _src_step, int _dst_step, int _flags, FftType _type);
|
||||||
|
const Size dft_size;
|
||||||
|
const int src_step, dst_step;
|
||||||
|
const int flags;
|
||||||
|
const FftType type;
|
||||||
|
clAmdFftPlanHandle plHandle;
|
||||||
|
static vector<FftPlan*> planStore;
|
||||||
|
static bool started;
|
||||||
|
static clAmdFftSetupData * setupData;
|
||||||
|
public:
|
||||||
|
// return a baked plan->
|
||||||
|
// if there is one matched plan, return it
|
||||||
|
// if not, bake a new one, put it into the planStore and return it.
|
||||||
|
static clAmdFftPlanHandle getPlan(Size _dft_size, int _src_step, int _dst_step, int _flags, FftType _type);
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
bool cv::ocl::FftPlan::started = false;
|
||||||
|
vector<cv::ocl::FftPlan*> cv::ocl::FftPlan::planStore = vector<cv::ocl::FftPlan*>();
|
||||||
|
clAmdFftSetupData * cv::ocl::FftPlan::setupData = 0;
|
||||||
|
|
||||||
|
void cv::ocl::fft_setup()
|
||||||
|
{
|
||||||
|
if(FftPlan::started)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
FftPlan::setupData = new clAmdFftSetupData;
|
||||||
|
openCLSafeCall(clAmdFftInitSetupData( FftPlan::setupData ));
|
||||||
|
FftPlan::started = true;
|
||||||
|
}
|
||||||
|
void cv::ocl::fft_teardown()
|
||||||
|
{
|
||||||
|
if(!FftPlan::started)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
delete FftPlan::setupData;
|
||||||
|
for(int i = 0; i < FftPlan::planStore.size(); i ++)
|
||||||
|
{
|
||||||
|
delete FftPlan::planStore[i];
|
||||||
|
}
|
||||||
|
FftPlan::planStore.clear();
|
||||||
|
openCLSafeCall( clAmdFftTeardown( ) );
|
||||||
|
FftPlan::started = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// bake a new plan
|
||||||
|
cv::ocl::FftPlan::FftPlan(Size _dft_size, int _src_step, int _dst_step, int _flags, FftType _type)
|
||||||
|
: dft_size(_dft_size), src_step(_src_step), dst_step(_dst_step), flags(_flags), type(_type), plHandle(0)
|
||||||
|
{
|
||||||
|
if(!FftPlan::started)
|
||||||
|
{
|
||||||
|
// implicitly do fft setup
|
||||||
|
fft_setup();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_1d_input = (_dft_size.height == 1);
|
||||||
|
int is_row_dft = flags & DFT_ROWS;
|
||||||
|
int is_scaled_dft = flags & DFT_SCALE;
|
||||||
|
int is_inverse = flags & DFT_INVERSE;
|
||||||
|
|
||||||
|
clAmdFftResultLocation place;
|
||||||
|
clAmdFftLayout inLayout;
|
||||||
|
clAmdFftLayout outLayout;
|
||||||
|
clAmdFftDim dim = is_1d_input||is_row_dft ? CLFFT_1D : CLFFT_2D;
|
||||||
|
|
||||||
|
size_t batchSize = is_row_dft?dft_size.height : 1;
|
||||||
|
size_t clLengthsIn[ 3 ] = {1, 1, 1};
|
||||||
|
size_t clStridesIn[ 3 ] = {1, 1, 1};
|
||||||
|
size_t clLengthsOut[ 3 ] = {1, 1, 1};
|
||||||
|
size_t clStridesOut[ 3 ] = {1, 1, 1};
|
||||||
|
clLengthsIn[0] = dft_size.width;
|
||||||
|
clLengthsIn[1] = is_row_dft ? 1 : dft_size.height;
|
||||||
|
clStridesIn[0] = 1;
|
||||||
|
clStridesOut[0] = 1;
|
||||||
|
|
||||||
|
switch(_type)
|
||||||
|
{
|
||||||
|
case C2C:
|
||||||
|
inLayout = CLFFT_COMPLEX_INTERLEAVED;
|
||||||
|
outLayout = CLFFT_COMPLEX_INTERLEAVED;
|
||||||
|
clStridesIn[1] = src_step / sizeof(std::complex<float>);
|
||||||
|
clStridesOut[1] = clStridesIn[1];
|
||||||
|
break;
|
||||||
|
case R2C:
|
||||||
|
CV_Assert(!is_row_dft); // this is not supported yet
|
||||||
|
inLayout = CLFFT_REAL;
|
||||||
|
outLayout = CLFFT_HERMITIAN_INTERLEAVED;
|
||||||
|
clStridesIn[1] = src_step / sizeof(float);
|
||||||
|
clStridesOut[1] = dst_step / sizeof(std::complex<float>);
|
||||||
|
break;
|
||||||
|
case C2R:
|
||||||
|
CV_Assert(!is_row_dft); // this is not supported yet
|
||||||
|
inLayout = CLFFT_HERMITIAN_INTERLEAVED;
|
||||||
|
outLayout = CLFFT_REAL;
|
||||||
|
clStridesIn[1] = src_step / sizeof(std::complex<float>);
|
||||||
|
clStridesOut[1] = dst_step / sizeof(float);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
//std::runtime_error("does not support this convertion!");
|
||||||
|
cout << "Does not support this convertion!" << endl;
|
||||||
|
throw exception();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
clStridesIn[2] = is_row_dft ? clStridesIn[1] : dft_size.width * clStridesIn[1];
|
||||||
|
clStridesOut[2] = is_row_dft ? clStridesOut[1] : dft_size.width * clStridesOut[1];
|
||||||
|
|
||||||
|
openCLSafeCall( clAmdFftCreateDefaultPlan( &plHandle, Context::getContext()->impl->clContext, dim, clLengthsIn ) );
|
||||||
|
|
||||||
|
openCLSafeCall( clAmdFftSetResultLocation( plHandle, CLFFT_OUTOFPLACE ) );
|
||||||
|
openCLSafeCall( clAmdFftSetLayout( plHandle, inLayout, outLayout ) );
|
||||||
|
openCLSafeCall( clAmdFftSetPlanBatchSize( plHandle, batchSize ) );
|
||||||
|
|
||||||
|
openCLSafeCall( clAmdFftSetPlanInStride ( plHandle, dim, clStridesIn ) );
|
||||||
|
openCLSafeCall( clAmdFftSetPlanOutStride ( plHandle, dim, clStridesOut ) );
|
||||||
|
openCLSafeCall( clAmdFftSetPlanDistance ( plHandle, clStridesIn[ dim ], clStridesIn[ dim ]) );
|
||||||
|
openCLSafeCall( clAmdFftBakePlan( plHandle, 1, &(Context::getContext()->impl->clCmdQueue), NULL, NULL ) );
|
||||||
|
}
|
||||||
|
cv::ocl::FftPlan::~FftPlan()
|
||||||
|
{
|
||||||
|
for(int i = 0; i < planStore.size(); i ++)
|
||||||
|
{
|
||||||
|
if(planStore[i]->plHandle == plHandle)
|
||||||
|
{
|
||||||
|
planStore.erase(planStore.begin()+ i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
openCLSafeCall( clAmdFftDestroyPlan( &plHandle ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
clAmdFftPlanHandle cv::ocl::FftPlan::getPlan(Size _dft_size, int _src_step, int _dst_step, int _flags, FftType _type)
|
||||||
|
{
|
||||||
|
// go through search
|
||||||
|
for(int i = 0; i < planStore.size(); i ++)
|
||||||
|
{
|
||||||
|
FftPlan * plan = planStore[i];
|
||||||
|
if(
|
||||||
|
plan->dft_size.width == _dft_size.width &&
|
||||||
|
plan->dft_size.height == _dft_size.height &&
|
||||||
|
plan->flags == _flags &&
|
||||||
|
plan->src_step == _src_step &&
|
||||||
|
plan->dst_step == _dst_step &&
|
||||||
|
plan->type == _type
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return plan->plHandle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// no baked plan is found
|
||||||
|
FftPlan *newPlan = new FftPlan(_dft_size, _src_step, _dst_step, _flags, _type);
|
||||||
|
planStore.push_back(newPlan);
|
||||||
|
return newPlan->plHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cv::ocl::dft(const oclMat& src, oclMat& dst, Size dft_size, int flags)
|
||||||
|
{
|
||||||
|
if(dft_size == Size(0,0))
|
||||||
|
{
|
||||||
|
dft_size = src.size();
|
||||||
|
}
|
||||||
|
// check if the given dft size is of optimal dft size
|
||||||
|
CV_Assert(dft_size.area() == getOptimalDFTSize(dft_size.area()));
|
||||||
|
|
||||||
|
// similar assertions with cuda module
|
||||||
|
CV_Assert(src.type() == CV_32F || src.type() == CV_32FC2);
|
||||||
|
|
||||||
|
// we don't support DFT_SCALE flag
|
||||||
|
CV_Assert(!(DFT_SCALE & flags));
|
||||||
|
|
||||||
|
bool is_1d_input = (src.rows == 1);
|
||||||
|
int is_row_dft = flags & DFT_ROWS;
|
||||||
|
int is_scaled_dft = flags & DFT_SCALE;
|
||||||
|
int is_inverse = flags & DFT_INVERSE;
|
||||||
|
bool is_complex_input = src.channels() == 2;
|
||||||
|
bool is_complex_output = !(flags & DFT_REAL_OUTPUT);
|
||||||
|
|
||||||
|
// We don't support real-to-real transform
|
||||||
|
CV_Assert(is_complex_input || is_complex_output);
|
||||||
|
FftType type = (FftType)(is_complex_input << 0 | is_complex_output << 1);
|
||||||
|
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case C2C:
|
||||||
|
dst.create(src.rows, src.cols, CV_32FC2);
|
||||||
|
break;
|
||||||
|
case R2C:
|
||||||
|
CV_Assert(!is_row_dft); // this is not supported yet
|
||||||
|
dst.create(src.rows, src.cols/2 + 1, CV_32FC2);
|
||||||
|
break;
|
||||||
|
case C2R:
|
||||||
|
CV_Assert(dft_size.width / 2 + 1 == src.cols && dft_size.height == src.rows);
|
||||||
|
CV_Assert(!is_row_dft); // this is not supported yet
|
||||||
|
dst.create(src.rows, dft_size.width, CV_32FC1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
//std::runtime_error("does not support this convertion!");
|
||||||
|
cout << "Does not support this convertion!" << endl;
|
||||||
|
throw exception();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
clAmdFftPlanHandle plHandle = FftPlan::getPlan(dft_size, src.step, dst.step, flags, type);
|
||||||
|
|
||||||
|
//get the buffersize
|
||||||
|
size_t buffersize=0;
|
||||||
|
openCLSafeCall( clAmdFftGetTmpBufSize(plHandle, &buffersize ) );
|
||||||
|
|
||||||
|
//allocate the intermediate buffer
|
||||||
|
cl_mem clMedBuffer=NULL;
|
||||||
|
if (buffersize)
|
||||||
|
{
|
||||||
|
cl_int medstatus;
|
||||||
|
clMedBuffer = clCreateBuffer ( src.clCxt->impl->clContext, CL_MEM_READ_WRITE, buffersize, 0, &medstatus);
|
||||||
|
openCLSafeCall( medstatus );
|
||||||
|
}
|
||||||
|
openCLSafeCall( clAmdFftEnqueueTransform( plHandle,
|
||||||
|
is_inverse?CLFFT_BACKWARD:CLFFT_FORWARD,
|
||||||
|
1,
|
||||||
|
&src.clCxt->impl->clCmdQueue,
|
||||||
|
0, NULL, NULL,
|
||||||
|
(cl_mem*)&src.data, (cl_mem*)&dst.data, clMedBuffer ) );
|
||||||
|
openCLSafeCall( clFinish(src.clCxt->impl->clCmdQueue) );
|
||||||
|
if(clMedBuffer)
|
||||||
|
{
|
||||||
|
openCLFree(clMedBuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif //HAVE_CLAMDFFT
|
161
modules/ocl/src/gemm.cpp
Normal file
161
modules/ocl/src/gemm.cpp
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||||
|
//
|
||||||
|
// By downloading, copying, installing or using the software you agree to this license.
|
||||||
|
// If you do not agree to this license, do not download, install,
|
||||||
|
// copy or use the software.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// License Agreement
|
||||||
|
// For Open Source Computer Vision Library
|
||||||
|
//
|
||||||
|
// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
|
||||||
|
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
|
||||||
|
// Third party copyrights are property of their respective owners.
|
||||||
|
//
|
||||||
|
// @Authors
|
||||||
|
// Peng Xiao, pengxiao@multicorewareinc.com
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
// are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistribution's of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other oclMaterials provided with the distribution.
|
||||||
|
//
|
||||||
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
|
// derived from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// This software is provided by the copyright holders and contributors as is and
|
||||||
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
|
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||||
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
|
// indirect, incidental, special, exemplary, or consequential damages
|
||||||
|
// (including, but not limited to, procurement of substitute goods or services;
|
||||||
|
// loss of use, data, or profits; or business interruption) however caused
|
||||||
|
// and on any theory of liability, whether in contract, strict liability,
|
||||||
|
// or tort (including negligence or otherwise) arising in any way out of
|
||||||
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
|
//
|
||||||
|
//M*/
|
||||||
|
|
||||||
|
#include <iomanip>
|
||||||
|
#include "precomp.hpp"
|
||||||
|
|
||||||
|
#ifdef HAVE_CLAMDBLAS
|
||||||
|
|
||||||
|
#include "clAmdBlas.h"
|
||||||
|
|
||||||
|
#if !defined (HAVE_OPENCL)
|
||||||
|
void cv::ocl::dft(const oclMat& src, oclMat& dst, int flags) { throw_nogpu(); }
|
||||||
|
#else
|
||||||
|
|
||||||
|
using namespace cv;
|
||||||
|
|
||||||
|
void cv::ocl::gemm(const oclMat& src1, const oclMat& src2, double alpha,
|
||||||
|
const oclMat& src3, double beta, oclMat& dst, int flags)
|
||||||
|
{
|
||||||
|
CV_Assert(src1.cols == src2.rows &&
|
||||||
|
(src3.empty() || src1.rows == src3.rows && src2.cols == src3.cols));
|
||||||
|
CV_Assert(!(cv::GEMM_3_T & flags)); // cv::GEMM_3_T is not supported
|
||||||
|
if(!src3.empty())
|
||||||
|
{
|
||||||
|
src3.copyTo(dst);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dst.create(src1.rows, src2.cols, src1.type());
|
||||||
|
dst.setTo(Scalar::all(0));
|
||||||
|
}
|
||||||
|
openCLSafeCall( clAmdBlasSetup() );
|
||||||
|
|
||||||
|
const clAmdBlasTranspose transA = (cv::GEMM_1_T & flags)?clAmdBlasTrans:clAmdBlasNoTrans;
|
||||||
|
const clAmdBlasTranspose transB = (cv::GEMM_2_T & flags)?clAmdBlasTrans:clAmdBlasNoTrans;
|
||||||
|
const clAmdBlasOrder order = clAmdBlasRowMajor;
|
||||||
|
|
||||||
|
const int M = src1.rows;
|
||||||
|
const int N = src2.cols;
|
||||||
|
const int K = src1.cols;
|
||||||
|
int lda = src1.step;
|
||||||
|
int ldb = src2.step;
|
||||||
|
int ldc = dst.step;
|
||||||
|
int offa = src1.offset;
|
||||||
|
int offb = src2.offset;
|
||||||
|
int offc = dst.offset;
|
||||||
|
|
||||||
|
|
||||||
|
switch(src1.type())
|
||||||
|
{
|
||||||
|
case CV_32FC1:
|
||||||
|
lda /= sizeof(float);
|
||||||
|
ldb /= sizeof(float);
|
||||||
|
ldc /= sizeof(float);
|
||||||
|
offa /= sizeof(float);
|
||||||
|
offb /= sizeof(float);
|
||||||
|
offc /= sizeof(float);
|
||||||
|
openCLSafeCall
|
||||||
|
(
|
||||||
|
clAmdBlasSgemmEx(order, transA, transB, M, N, K,
|
||||||
|
alpha, (const cl_mem)src1.data, offa, lda, (const cl_mem)src2.data, offb, ldb,
|
||||||
|
beta, (cl_mem)dst.data, offc, ldc, 1, &src1.clCxt->impl->clCmdQueue, 0, NULL, NULL)
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case CV_64FC1:
|
||||||
|
lda /= sizeof(double);
|
||||||
|
ldb /= sizeof(double);
|
||||||
|
ldc /= sizeof(double);
|
||||||
|
offa /= sizeof(double);
|
||||||
|
offb /= sizeof(double);
|
||||||
|
offc /= sizeof(double);
|
||||||
|
openCLSafeCall
|
||||||
|
(
|
||||||
|
clAmdBlasDgemmEx(order, transA, transB, M, N, K,
|
||||||
|
alpha, (const cl_mem)src1.data, offa, lda, (const cl_mem)src2.data, offb, ldb,
|
||||||
|
beta, (cl_mem)dst.data, offc, ldc, 1, &src1.clCxt->impl->clCmdQueue, 0, NULL, NULL)
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case CV_32FC2:
|
||||||
|
{
|
||||||
|
lda /= sizeof(std::complex<float>);
|
||||||
|
ldb /= sizeof(std::complex<float>);
|
||||||
|
ldc /= sizeof(std::complex<float>);
|
||||||
|
offa /= sizeof(std::complex<float>);
|
||||||
|
offb /= sizeof(std::complex<float>);
|
||||||
|
offc /= sizeof(std::complex<float>);
|
||||||
|
cl_float2 alpha_2 = {{alpha, 0}};
|
||||||
|
cl_float2 beta_2 = {{beta, 0}};
|
||||||
|
openCLSafeCall
|
||||||
|
(
|
||||||
|
clAmdBlasCgemmEx(order, transA, transB, M, N, K,
|
||||||
|
alpha_2, (const cl_mem)src1.data, offa, lda, (const cl_mem)src2.data, offb, ldb,
|
||||||
|
beta_2, (cl_mem)dst.data, offc, ldc, 1, &src1.clCxt->impl->clCmdQueue, 0, NULL, NULL)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CV_64FC2:
|
||||||
|
{
|
||||||
|
lda /= sizeof(std::complex<double>);
|
||||||
|
ldb /= sizeof(std::complex<double>);
|
||||||
|
ldc /= sizeof(std::complex<double>);
|
||||||
|
offa /= sizeof(std::complex<double>);
|
||||||
|
offb /= sizeof(std::complex<double>);
|
||||||
|
offc /= sizeof(std::complex<double>);
|
||||||
|
cl_double2 alpha_2 = {{alpha, 0}};
|
||||||
|
cl_double2 beta_2 = {{beta, 0}};
|
||||||
|
openCLSafeCall
|
||||||
|
(
|
||||||
|
clAmdBlasZgemmEx(order, transA, transB, M, N, K,
|
||||||
|
alpha_2, (const cl_mem)src1.data, offa, lda, (const cl_mem)src2.data, offb, ldb,
|
||||||
|
beta_2, (cl_mem)dst.data, offc, ldc, 1, &src1.clCxt->impl->clCmdQueue, 0, NULL, NULL)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
clAmdBlasTeardown();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
196
modules/ocl/src/kernels/blend_linear.cl
Normal file
196
modules/ocl/src/kernels/blend_linear.cl
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||||
|
//
|
||||||
|
// By downloading, copying, installing or using the software you agree to this license.
|
||||||
|
// If you do not agree to this license, do not download, install,
|
||||||
|
// copy or use the software.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// License Agreement
|
||||||
|
// For Open Source Computer Vision Library
|
||||||
|
//
|
||||||
|
// Copyright (C) 2010-2012, MulticoreWare Inc., all rights reserved.
|
||||||
|
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
|
||||||
|
// Third party copyrights are property of their respective owners.
|
||||||
|
//
|
||||||
|
// @Authors
|
||||||
|
// Liu Liujun, liujun@multicorewareinc.com
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
// are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistribution's of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other GpuMaterials provided with the distribution.
|
||||||
|
//
|
||||||
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
|
// derived from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// This software is provided by the copyright holders and contributors as is and
|
||||||
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
|
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||||
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
|
// indirect, incidental, special, exemplary, or consequential damages
|
||||||
|
// (including, but not limited to, procurement of substitute goods or services;
|
||||||
|
// loss of use, data, or profits; or business interruption) however caused
|
||||||
|
// and on any theory of liability, whether in contract, strict liability,
|
||||||
|
// or tort (including negligence or otherwise) arising in any way out of
|
||||||
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
|
//
|
||||||
|
//M*/
|
||||||
|
__kernel void BlendLinear_C1_D0(
|
||||||
|
__global uchar *dst,
|
||||||
|
__global uchar *img1,
|
||||||
|
__global uchar *img2,
|
||||||
|
__global float *weight1,
|
||||||
|
__global float *weight2,
|
||||||
|
int rows,
|
||||||
|
int cols,
|
||||||
|
int istep,
|
||||||
|
int wstep
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int idx = get_global_id(0);
|
||||||
|
int idy = get_global_id(1);
|
||||||
|
if (idx < cols && idy < rows)
|
||||||
|
{
|
||||||
|
int pos = idy * istep + idx;
|
||||||
|
int wpos = idy * (wstep /sizeof(float)) + idx;
|
||||||
|
float w1 = weight1[wpos];
|
||||||
|
float w2 = weight2[wpos];
|
||||||
|
dst[pos] = (img1[pos] * w1 + img2[pos] * w2) / (w1 + w2 + 1e-5f);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel void BlendLinear_C3_D0(
|
||||||
|
__global uchar *dst,
|
||||||
|
__global uchar *img1,
|
||||||
|
__global uchar *img2,
|
||||||
|
__global float *weight1,
|
||||||
|
__global float *weight2,
|
||||||
|
int rows,
|
||||||
|
int cols,
|
||||||
|
int istep,
|
||||||
|
int wstep
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int idx = get_global_id(0);
|
||||||
|
int idy = get_global_id(1);
|
||||||
|
int x = idx / 3;
|
||||||
|
int y = idy;
|
||||||
|
if (x < cols && y < rows)
|
||||||
|
{
|
||||||
|
int pos = idy * istep + idx;
|
||||||
|
int wpos = idy * (wstep /sizeof(float)) + x;
|
||||||
|
float w1 = weight1[wpos];
|
||||||
|
float w2 = weight2[wpos];
|
||||||
|
dst[pos] = (img1[pos] * w1 + img2[pos] * w2) / (w1 + w2 + 1e-5f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel void BlendLinear_C4_D0(
|
||||||
|
__global uchar *dst,
|
||||||
|
__global uchar *img1,
|
||||||
|
__global uchar *img2,
|
||||||
|
__global float *weight1,
|
||||||
|
__global float *weight2,
|
||||||
|
int rows,
|
||||||
|
int cols,
|
||||||
|
int istep,
|
||||||
|
int wstep
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int idx = get_global_id(0);
|
||||||
|
int idy = get_global_id(1);
|
||||||
|
int x = idx / 4;
|
||||||
|
int y = idy;
|
||||||
|
if (x < cols && y < rows)
|
||||||
|
{
|
||||||
|
int pos = idy * istep + idx;
|
||||||
|
int wpos = idy * (wstep /sizeof(float)) + x;
|
||||||
|
float w1 = weight1[wpos];
|
||||||
|
float w2 = weight2[wpos];
|
||||||
|
dst[pos] = (img1[pos] * w1 + img2[pos] * w2) / (w1 + w2 + 1e-5f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel void BlendLinear_C1_D5(
|
||||||
|
__global float *dst,
|
||||||
|
__global float *img1,
|
||||||
|
__global float *img2,
|
||||||
|
__global float *weight1,
|
||||||
|
__global float *weight2,
|
||||||
|
int rows,
|
||||||
|
int cols,
|
||||||
|
int istep,
|
||||||
|
int wstep
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int idx = get_global_id(0);
|
||||||
|
int idy = get_global_id(1);
|
||||||
|
if (idx < cols && idy < rows)
|
||||||
|
{
|
||||||
|
int pos = idy * (istep / sizeof(float)) + idx;
|
||||||
|
int wpos = idy * (wstep /sizeof(float)) + idx;
|
||||||
|
float w1 = weight1[wpos];
|
||||||
|
float w2 = weight2[wpos];
|
||||||
|
dst[pos] = (img1[pos] * w1 + img2[pos] * w2) / (w1 + w2 + 1e-5f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel void BlendLinear_C3_D5(
|
||||||
|
__global float *dst,
|
||||||
|
__global float *img1,
|
||||||
|
__global float *img2,
|
||||||
|
__global float *weight1,
|
||||||
|
__global float *weight2,
|
||||||
|
int rows,
|
||||||
|
int cols,
|
||||||
|
int istep,
|
||||||
|
int wstep
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int idx = get_global_id(0);
|
||||||
|
int idy = get_global_id(1);
|
||||||
|
int x = idx / 3;
|
||||||
|
int y = idy;
|
||||||
|
if (x < cols && y < rows)
|
||||||
|
{
|
||||||
|
int pos = idy * (istep / sizeof(float)) + idx;
|
||||||
|
int wpos = idy * (wstep /sizeof(float)) + x;
|
||||||
|
float w1 = weight1[wpos];
|
||||||
|
float w2 = weight2[wpos];
|
||||||
|
dst[pos] = (img1[pos] * w1 + img2[pos] * w2) / (w1 + w2 + 1e-5f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel void BlendLinear_C4_D5(
|
||||||
|
__global float *dst,
|
||||||
|
__global float *img1,
|
||||||
|
__global float *img2,
|
||||||
|
__global float *weight1,
|
||||||
|
__global float *weight2,
|
||||||
|
int rows,
|
||||||
|
int cols,
|
||||||
|
int istep,
|
||||||
|
int wstep
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int idx = get_global_id(0);
|
||||||
|
int idy = get_global_id(1);
|
||||||
|
int x = idx / 4;
|
||||||
|
int y = idy;
|
||||||
|
if (x < cols && y < rows)
|
||||||
|
{
|
||||||
|
int pos = idy * (istep / sizeof(float)) + idx;
|
||||||
|
int wpos = idy * (wstep /sizeof(float)) + x;
|
||||||
|
float w1 = weight1[wpos];
|
||||||
|
float w2 = weight2[wpos];
|
||||||
|
dst[pos] = (img1[pos] * w1 + img2[pos] * w2) / (w1 + w2 + 1e-5f);
|
||||||
|
}
|
||||||
|
}
|
80
modules/ocl/src/kernels/imgproc_columnsum.cl
Normal file
80
modules/ocl/src/kernels/imgproc_columnsum.cl
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||||
|
//
|
||||||
|
// By downloading, copying, installing or using the software you agree to this license.
|
||||||
|
// If you do not agree to this license, do not download, install,
|
||||||
|
// copy or use the software.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// License Agreement
|
||||||
|
// For Open Source Computer Vision Library
|
||||||
|
//
|
||||||
|
// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
|
||||||
|
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
|
||||||
|
// Third party copyrights are property of their respective owners.
|
||||||
|
//
|
||||||
|
// @Authors
|
||||||
|
// Chunpeng Zhang chunpeng@multicorewareinc.com
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
// are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistribution's of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other oclMaterials provided with the distribution.
|
||||||
|
//
|
||||||
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
|
// derived from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// This software is provided by the copyright holders and contributors as is and
|
||||||
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
|
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||||
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
|
// indirect, incidental, special, exemplary, or consequential damages
|
||||||
|
// (including, but not limited to, procurement of substitute goods or services;
|
||||||
|
// loss of use, data, or profits; or business interruption) however caused
|
||||||
|
// and on any theory of liability, whether in contract, strict liability,
|
||||||
|
// or tort (including negligence or otherwise) arising in any way out of
|
||||||
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
|
//
|
||||||
|
//M*/
|
||||||
|
|
||||||
|
#pragma OPENCL EXTENSION cl_amd_printf : enable
|
||||||
|
#if defined (__ATI__)
|
||||||
|
#pragma OPENCL EXTENSION cl_amd_fp64:enable
|
||||||
|
|
||||||
|
#elif defined (__NVIDIA__)
|
||||||
|
#pragma OPENCL EXTENSION cl_khr_fp64:enable
|
||||||
|
#endif
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
///////////////////////// columnSum ////////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
/// CV_32FC1
|
||||||
|
__kernel void columnSum_C1_D5(__global float* src,__global float* dst,int srcCols,int srcRows,int srcStep,int dstStep)
|
||||||
|
{
|
||||||
|
const int x = get_global_id(0);
|
||||||
|
|
||||||
|
srcStep >>= 2;
|
||||||
|
dstStep >>= 2;
|
||||||
|
|
||||||
|
if (x < srcCols)
|
||||||
|
{
|
||||||
|
int srcIdx = x ;
|
||||||
|
int dstIdx = x ;
|
||||||
|
|
||||||
|
float sum = 0;
|
||||||
|
|
||||||
|
for (int y = 0; y < srcRows; ++y)
|
||||||
|
{
|
||||||
|
sum += src[srcIdx];
|
||||||
|
dst[dstIdx] = sum;
|
||||||
|
srcIdx += srcStep;
|
||||||
|
dstIdx += dstStep;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
824
modules/ocl/src/kernels/match_template.cl
Normal file
824
modules/ocl/src/kernels/match_template.cl
Normal file
@ -0,0 +1,824 @@
|
|||||||
|
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||||
|
//
|
||||||
|
// By downloading, copying, installing or using the software you agree to this license.
|
||||||
|
// If you do not agree to this license, do not download, install,
|
||||||
|
// copy or use the software.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// License Agreement
|
||||||
|
// For Open Source Computer Vision Library
|
||||||
|
//
|
||||||
|
// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
|
||||||
|
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
|
||||||
|
// Third party copyrights are property of their respective owners.
|
||||||
|
//
|
||||||
|
// @Authors
|
||||||
|
// Peng Xiao, pengxiao@multicorewareinc.com
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
// are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistribution's of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other oclMaterials provided with the distribution.
|
||||||
|
//
|
||||||
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
|
// derived from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// This software is provided by the copyright holders and contributors as is and
|
||||||
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
|
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||||
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
|
// indirect, incidental, special, exemplary, or consequential damages
|
||||||
|
// (including, but not limited to, procurement of substitute goods or services;
|
||||||
|
// loss of use, data, or profits; or business interruption) however caused
|
||||||
|
// and on any theory of liability, whether in contract, strict liability,
|
||||||
|
// or tort (including negligence or otherwise) arising in any way out of
|
||||||
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
|
//
|
||||||
|
//M*/
|
||||||
|
|
||||||
|
#pragma OPENCL EXTENSION cl_amd_printf : enable
|
||||||
|
|
||||||
|
#if defined (__ATI__)
|
||||||
|
#pragma OPENCL EXTENSION cl_amd_fp64:enable
|
||||||
|
|
||||||
|
#elif defined (__NVIDIA__)
|
||||||
|
#pragma OPENCL EXTENSION cl_khr_fp64:enable
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(USE_SQR_INTEGRAL) && (defined (__ATI__) || defined (__NVIDIA__))
|
||||||
|
#define TYPE_IMAGE_SQSUM double
|
||||||
|
#else
|
||||||
|
#define TYPE_IMAGE_SQSUM ulong
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////
|
||||||
|
// utilities
|
||||||
|
#define SQSUMS_PTR(ox, oy) mad24(gidy + oy, img_sqsums_step, gidx + img_sqsums_offset + ox)
|
||||||
|
#define SUMS_PTR(ox, oy) mad24(gidy + oy, img_sums_step, gidx + img_sums_offset + ox)
|
||||||
|
// normAcc* are accurate normalization routines which make GPU matchTemplate
|
||||||
|
// consistent with CPU one
|
||||||
|
float normAcc(float num, float denum)
|
||||||
|
{
|
||||||
|
if(fabs(num) < denum)
|
||||||
|
{
|
||||||
|
return num / denum;
|
||||||
|
}
|
||||||
|
if(fabs(num) < denum * 1.125f)
|
||||||
|
{
|
||||||
|
return num > 0 ? 1 : -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
float normAcc_SQDIFF(float num, float denum)
|
||||||
|
{
|
||||||
|
if(fabs(num) < denum)
|
||||||
|
{
|
||||||
|
return num / denum;
|
||||||
|
}
|
||||||
|
if(fabs(num) < denum * 1.125f)
|
||||||
|
{
|
||||||
|
return num > 0 ? 1 : -1;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
// normalize
|
||||||
|
|
||||||
|
__kernel
|
||||||
|
void normalizeKernel_C1_D0
|
||||||
|
(
|
||||||
|
__global const TYPE_IMAGE_SQSUM * img_sqsums,
|
||||||
|
__global float * res,
|
||||||
|
ulong tpl_sqsum,
|
||||||
|
int res_rows,
|
||||||
|
int res_cols,
|
||||||
|
int tpl_rows,
|
||||||
|
int tpl_cols,
|
||||||
|
int img_sqsums_offset,
|
||||||
|
int img_sqsums_step,
|
||||||
|
int res_offset,
|
||||||
|
int res_step
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int gidx = get_global_id(0);
|
||||||
|
int gidy = get_global_id(1);
|
||||||
|
|
||||||
|
res_step /= sizeof(*res);
|
||||||
|
res_offset /= sizeof(*res);
|
||||||
|
img_sqsums_step /= sizeof(*img_sqsums);
|
||||||
|
img_sqsums_offset /= sizeof(*img_sqsums);
|
||||||
|
int res_idx = mad24(gidy, res_step, res_offset + gidx);
|
||||||
|
if(gidx < res_cols && gidy < res_rows)
|
||||||
|
{
|
||||||
|
float image_sqsum_ = (float)(
|
||||||
|
(img_sqsums[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums[SQSUMS_PTR(tpl_cols, 0)]) -
|
||||||
|
(img_sqsums[SQSUMS_PTR(0, tpl_rows)] - img_sqsums[SQSUMS_PTR(0, 0)]));
|
||||||
|
res[res_idx] = normAcc(res[res_idx], sqrt(image_sqsum_ * tpl_sqsum));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel
|
||||||
|
void matchTemplate_Prepared_SQDIFF_C1_D0
|
||||||
|
(
|
||||||
|
__global const TYPE_IMAGE_SQSUM * img_sqsums,
|
||||||
|
__global float * res,
|
||||||
|
ulong tpl_sqsum,
|
||||||
|
int res_rows,
|
||||||
|
int res_cols,
|
||||||
|
int tpl_rows,
|
||||||
|
int tpl_cols,
|
||||||
|
int img_sqsums_offset,
|
||||||
|
int img_sqsums_step,
|
||||||
|
int res_offset,
|
||||||
|
int res_step
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int gidx = get_global_id(0);
|
||||||
|
int gidy = get_global_id(1);
|
||||||
|
|
||||||
|
res_step /= sizeof(*res);
|
||||||
|
res_offset /= sizeof(*res);
|
||||||
|
img_sqsums_step /= sizeof(*img_sqsums);
|
||||||
|
img_sqsums_offset /= sizeof(*img_sqsums);
|
||||||
|
int res_idx = mad24(gidy, res_step, res_offset + gidx);
|
||||||
|
if(gidx < res_cols && gidy < res_rows)
|
||||||
|
{
|
||||||
|
float image_sqsum_ = (float)(
|
||||||
|
(img_sqsums[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums[SQSUMS_PTR(tpl_cols, 0)]) -
|
||||||
|
(img_sqsums[SQSUMS_PTR(0, tpl_rows)] - img_sqsums[SQSUMS_PTR(0, 0)]));
|
||||||
|
res[res_idx] = image_sqsum_ - 2.f * res[res_idx] + tpl_sqsum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel
|
||||||
|
void matchTemplate_Prepared_SQDIFF_NORMED_C1_D0
|
||||||
|
(
|
||||||
|
__global const TYPE_IMAGE_SQSUM * img_sqsums,
|
||||||
|
__global float * res,
|
||||||
|
ulong tpl_sqsum,
|
||||||
|
int res_rows,
|
||||||
|
int res_cols,
|
||||||
|
int tpl_rows,
|
||||||
|
int tpl_cols,
|
||||||
|
int img_sqsums_offset,
|
||||||
|
int img_sqsums_step,
|
||||||
|
int res_offset,
|
||||||
|
int res_step
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int gidx = get_global_id(0);
|
||||||
|
int gidy = get_global_id(1);
|
||||||
|
|
||||||
|
res_step /= sizeof(*res);
|
||||||
|
res_offset /= sizeof(*res);
|
||||||
|
img_sqsums_step /= sizeof(*img_sqsums);
|
||||||
|
img_sqsums_offset /= sizeof(*img_sqsums);
|
||||||
|
int res_idx = mad24(gidy, res_step, res_offset + gidx);
|
||||||
|
if(gidx < res_cols && gidy < res_rows)
|
||||||
|
{
|
||||||
|
float image_sqsum_ = (float)(
|
||||||
|
(img_sqsums[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums[SQSUMS_PTR(tpl_cols, 0)]) -
|
||||||
|
(img_sqsums[SQSUMS_PTR(0, tpl_rows)] - img_sqsums[SQSUMS_PTR(0, 0)]));
|
||||||
|
res[res_idx] = normAcc_SQDIFF(image_sqsum_ - 2.f * res[res_idx] + tpl_sqsum,
|
||||||
|
sqrt(image_sqsum_ * tpl_sqsum));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////
|
||||||
|
// SQDIFF
|
||||||
|
__kernel
|
||||||
|
void matchTemplate_Naive_SQDIFF_C1_D0
|
||||||
|
(
|
||||||
|
__global const uchar * img,
|
||||||
|
__global const uchar * tpl,
|
||||||
|
__global float * res,
|
||||||
|
int img_rows,
|
||||||
|
int img_cols,
|
||||||
|
int tpl_rows,
|
||||||
|
int tpl_cols,
|
||||||
|
int res_rows,
|
||||||
|
int res_cols,
|
||||||
|
int img_offset,
|
||||||
|
int tpl_offset,
|
||||||
|
int res_offset,
|
||||||
|
int img_step,
|
||||||
|
int tpl_step,
|
||||||
|
int res_step
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int gidx = get_global_id(0);
|
||||||
|
int gidy = get_global_id(1);
|
||||||
|
int i,j;
|
||||||
|
int delta;
|
||||||
|
int sum = 0;
|
||||||
|
res_step /= sizeof(*res);
|
||||||
|
res_offset /= sizeof(*res);
|
||||||
|
int res_idx = mad24(gidy, res_step, res_offset + gidx);
|
||||||
|
|
||||||
|
if(gidx < res_cols && gidy < res_rows)
|
||||||
|
{
|
||||||
|
for(i = 0; i < tpl_rows; i ++)
|
||||||
|
{
|
||||||
|
// get specific rows of img data
|
||||||
|
__global const uchar * img_ptr = img + mad24(gidy + i, img_step, gidx + img_offset);
|
||||||
|
__global const uchar * tpl_ptr = tpl + mad24(i, tpl_step, tpl_offset);
|
||||||
|
for(j = 0; j < tpl_cols; j ++)
|
||||||
|
{
|
||||||
|
delta = img_ptr[j] - tpl_ptr[j];
|
||||||
|
sum = mad24(delta, delta, sum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res[res_idx] = sum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel
|
||||||
|
void matchTemplate_Naive_SQDIFF_C1_D5
|
||||||
|
(
|
||||||
|
__global const float * img,
|
||||||
|
__global const float * tpl,
|
||||||
|
__global float * res,
|
||||||
|
int img_rows,
|
||||||
|
int img_cols,
|
||||||
|
int tpl_rows,
|
||||||
|
int tpl_cols,
|
||||||
|
int res_rows,
|
||||||
|
int res_cols,
|
||||||
|
int img_offset,
|
||||||
|
int tpl_offset,
|
||||||
|
int res_offset,
|
||||||
|
int img_step,
|
||||||
|
int tpl_step,
|
||||||
|
int res_step
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int gidx = get_global_id(0);
|
||||||
|
int gidy = get_global_id(1);
|
||||||
|
int i,j;
|
||||||
|
float delta;
|
||||||
|
float sum = 0;
|
||||||
|
img_step /= sizeof(*img);
|
||||||
|
img_offset /= sizeof(*img);
|
||||||
|
tpl_step /= sizeof(*tpl);
|
||||||
|
tpl_offset /= sizeof(*tpl);
|
||||||
|
res_step /= sizeof(*res);
|
||||||
|
res_offset /= sizeof(*res);
|
||||||
|
|
||||||
|
int res_idx = mad24(gidy, res_step, res_offset + gidx);
|
||||||
|
|
||||||
|
if(gidx < res_cols && gidy < res_rows)
|
||||||
|
{
|
||||||
|
for(i = 0; i < tpl_rows; i ++)
|
||||||
|
{
|
||||||
|
// get specific rows of img data
|
||||||
|
__global const float * img_ptr = img + mad24(gidy + i, img_step, gidx + img_offset);
|
||||||
|
__global const float * tpl_ptr = tpl + mad24(i, tpl_step, tpl_offset);
|
||||||
|
for(j = 0; j < tpl_cols; j ++)
|
||||||
|
{
|
||||||
|
delta = img_ptr[j] - tpl_ptr[j];
|
||||||
|
sum = mad(delta, delta, sum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res[res_idx] = sum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel
|
||||||
|
void matchTemplate_Naive_SQDIFF_C4_D0
|
||||||
|
(
|
||||||
|
__global const uchar4 * img,
|
||||||
|
__global const uchar4 * tpl,
|
||||||
|
__global float * res,
|
||||||
|
int img_rows,
|
||||||
|
int img_cols,
|
||||||
|
int tpl_rows,
|
||||||
|
int tpl_cols,
|
||||||
|
int res_rows,
|
||||||
|
int res_cols,
|
||||||
|
int img_offset,
|
||||||
|
int tpl_offset,
|
||||||
|
int res_offset,
|
||||||
|
int img_step,
|
||||||
|
int tpl_step,
|
||||||
|
int res_step
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int gidx = get_global_id(0);
|
||||||
|
int gidy = get_global_id(1);
|
||||||
|
int i,j;
|
||||||
|
int4 delta;
|
||||||
|
int4 sum = (int4)(0, 0, 0, 0);
|
||||||
|
img_step /= sizeof(*img);
|
||||||
|
img_offset /= sizeof(*img);
|
||||||
|
tpl_step /= sizeof(*tpl);
|
||||||
|
tpl_offset /= sizeof(*tpl);
|
||||||
|
res_step /= sizeof(*res);
|
||||||
|
res_offset /= sizeof(*res);
|
||||||
|
|
||||||
|
int res_idx = mad24(gidy, res_step, res_offset + gidx);
|
||||||
|
|
||||||
|
if(gidx < res_cols && gidy < res_rows)
|
||||||
|
{
|
||||||
|
for(i = 0; i < tpl_rows; i ++)
|
||||||
|
{
|
||||||
|
// get specific rows of img data
|
||||||
|
__global const uchar4 * img_ptr = img + mad24(gidy + i, img_step, gidx + img_offset);
|
||||||
|
__global const uchar4 * tpl_ptr = tpl + mad24(i, tpl_step, tpl_offset);
|
||||||
|
for(j = 0; j < tpl_cols; j ++)
|
||||||
|
{
|
||||||
|
//delta = convert_int4(img_ptr[j] - tpl_ptr[j]); // this alternative is incorrect
|
||||||
|
delta.x = img_ptr[j].x - tpl_ptr[j].x;
|
||||||
|
delta.y = img_ptr[j].y - tpl_ptr[j].y;
|
||||||
|
delta.z = img_ptr[j].z - tpl_ptr[j].z;
|
||||||
|
delta.w = img_ptr[j].w - tpl_ptr[j].w;
|
||||||
|
sum = mad24(delta, delta, sum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res[res_idx] = sum.x + sum.y + sum.z + sum.w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel
|
||||||
|
void matchTemplate_Naive_SQDIFF_C4_D5
|
||||||
|
(
|
||||||
|
__global const float4 * img,
|
||||||
|
__global const float4 * tpl,
|
||||||
|
__global float * res,
|
||||||
|
int img_rows,
|
||||||
|
int img_cols,
|
||||||
|
int tpl_rows,
|
||||||
|
int tpl_cols,
|
||||||
|
int res_rows,
|
||||||
|
int res_cols,
|
||||||
|
int img_offset,
|
||||||
|
int tpl_offset,
|
||||||
|
int res_offset,
|
||||||
|
int img_step,
|
||||||
|
int tpl_step,
|
||||||
|
int res_step
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int gidx = get_global_id(0);
|
||||||
|
int gidy = get_global_id(1);
|
||||||
|
int i,j;
|
||||||
|
float4 delta;
|
||||||
|
float4 sum = (float4)(0, 0, 0, 0);
|
||||||
|
img_step /= sizeof(*img);
|
||||||
|
img_offset /= sizeof(*img);
|
||||||
|
tpl_step /= sizeof(*tpl);
|
||||||
|
tpl_offset /= sizeof(*tpl);
|
||||||
|
res_step /= sizeof(*res);
|
||||||
|
res_offset /= sizeof(*res);
|
||||||
|
|
||||||
|
int res_idx = mad24(gidy, res_step, res_offset + gidx);
|
||||||
|
|
||||||
|
if(gidx < res_cols && gidy < res_rows)
|
||||||
|
{
|
||||||
|
for(i = 0; i < tpl_rows; i ++)
|
||||||
|
{
|
||||||
|
// get specific rows of img data
|
||||||
|
__global const float4 * img_ptr = img + mad24(gidy + i, img_step, gidx + img_offset);
|
||||||
|
__global const float4 * tpl_ptr = tpl + mad24(i, tpl_step, tpl_offset);
|
||||||
|
for(j = 0; j < tpl_cols; j ++)
|
||||||
|
{
|
||||||
|
//delta = convert_int4(img_ptr[j] - tpl_ptr[j]); // this alternative is incorrect
|
||||||
|
delta.x = img_ptr[j].x - tpl_ptr[j].x;
|
||||||
|
delta.y = img_ptr[j].y - tpl_ptr[j].y;
|
||||||
|
delta.z = img_ptr[j].z - tpl_ptr[j].z;
|
||||||
|
delta.w = img_ptr[j].w - tpl_ptr[j].w;
|
||||||
|
sum = mad(delta, delta, sum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res[res_idx] = sum.x + sum.y + sum.z + sum.w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////
|
||||||
|
// CCORR
|
||||||
|
__kernel
|
||||||
|
void matchTemplate_Naive_CCORR_C1_D0
|
||||||
|
(
|
||||||
|
__global const uchar * img,
|
||||||
|
__global const uchar * tpl,
|
||||||
|
__global float * res,
|
||||||
|
int img_rows,
|
||||||
|
int img_cols,
|
||||||
|
int tpl_rows,
|
||||||
|
int tpl_cols,
|
||||||
|
int res_rows,
|
||||||
|
int res_cols,
|
||||||
|
int img_offset,
|
||||||
|
int tpl_offset,
|
||||||
|
int res_offset,
|
||||||
|
int img_step,
|
||||||
|
int tpl_step,
|
||||||
|
int res_step
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int gidx = get_global_id(0);
|
||||||
|
int gidy = get_global_id(1);
|
||||||
|
int i,j;
|
||||||
|
int sum = 0;
|
||||||
|
res_step /= sizeof(*res);
|
||||||
|
res_offset /= sizeof(*res);
|
||||||
|
|
||||||
|
int res_idx = mad24(gidy, res_step, res_offset + gidx);
|
||||||
|
|
||||||
|
if(gidx < res_cols && gidy < res_rows)
|
||||||
|
{
|
||||||
|
for(i = 0; i < tpl_rows; i ++)
|
||||||
|
{
|
||||||
|
// get specific rows of img data
|
||||||
|
__global const uchar * img_ptr = img + mad24(gidy + i, img_step, gidx + img_offset);
|
||||||
|
__global const uchar * tpl_ptr = tpl + mad24(i, tpl_step, tpl_offset);
|
||||||
|
for(j = 0; j < tpl_cols; j ++)
|
||||||
|
{
|
||||||
|
sum = mad24(img_ptr[j], tpl_ptr[j], sum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res[res_idx] = sum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel
|
||||||
|
void matchTemplate_Naive_CCORR_C1_D5
|
||||||
|
(
|
||||||
|
__global const float * img,
|
||||||
|
__global const float * tpl,
|
||||||
|
__global float * res,
|
||||||
|
int img_rows,
|
||||||
|
int img_cols,
|
||||||
|
int tpl_rows,
|
||||||
|
int tpl_cols,
|
||||||
|
int res_rows,
|
||||||
|
int res_cols,
|
||||||
|
int img_offset,
|
||||||
|
int tpl_offset,
|
||||||
|
int res_offset,
|
||||||
|
int img_step,
|
||||||
|
int tpl_step,
|
||||||
|
int res_step
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int gidx = get_global_id(0);
|
||||||
|
int gidy = get_global_id(1);
|
||||||
|
int i,j;
|
||||||
|
float sum = 0;
|
||||||
|
img_step /= sizeof(*img);
|
||||||
|
img_offset /= sizeof(*img);
|
||||||
|
tpl_step /= sizeof(*tpl);
|
||||||
|
tpl_offset /= sizeof(*tpl);
|
||||||
|
res_step /= sizeof(*res);
|
||||||
|
res_offset /= sizeof(*res);
|
||||||
|
|
||||||
|
int res_idx = mad24(gidy, res_step, res_offset + gidx);
|
||||||
|
|
||||||
|
if(gidx < res_cols && gidy < res_rows)
|
||||||
|
{
|
||||||
|
for(i = 0; i < tpl_rows; i ++)
|
||||||
|
{
|
||||||
|
// get specific rows of img data
|
||||||
|
__global const float * img_ptr = img + mad24(gidy + i, img_step, gidx + img_offset);
|
||||||
|
__global const float * tpl_ptr = tpl + mad24(i, tpl_step, tpl_offset);
|
||||||
|
for(j = 0; j < tpl_cols; j ++)
|
||||||
|
{
|
||||||
|
sum = mad(img_ptr[j], tpl_ptr[j], sum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res[res_idx] = sum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel
|
||||||
|
void matchTemplate_Naive_CCORR_C4_D0
|
||||||
|
(
|
||||||
|
__global const uchar4 * img,
|
||||||
|
__global const uchar4 * tpl,
|
||||||
|
__global float * res,
|
||||||
|
int img_rows,
|
||||||
|
int img_cols,
|
||||||
|
int tpl_rows,
|
||||||
|
int tpl_cols,
|
||||||
|
int res_rows,
|
||||||
|
int res_cols,
|
||||||
|
int img_offset,
|
||||||
|
int tpl_offset,
|
||||||
|
int res_offset,
|
||||||
|
int img_step,
|
||||||
|
int tpl_step,
|
||||||
|
int res_step
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int gidx = get_global_id(0);
|
||||||
|
int gidy = get_global_id(1);
|
||||||
|
int i,j;
|
||||||
|
int4 sum = (int4)(0, 0, 0, 0);
|
||||||
|
img_step /= sizeof(*img);
|
||||||
|
img_offset /= sizeof(*img);
|
||||||
|
tpl_step /= sizeof(*tpl);
|
||||||
|
tpl_offset /= sizeof(*tpl);
|
||||||
|
res_step /= sizeof(*res);
|
||||||
|
res_offset /= sizeof(*res);
|
||||||
|
|
||||||
|
int res_idx = mad24(gidy, res_step, res_offset + gidx);
|
||||||
|
|
||||||
|
if(gidx < res_cols && gidy < res_rows)
|
||||||
|
{
|
||||||
|
for(i = 0; i < tpl_rows; i ++)
|
||||||
|
{
|
||||||
|
// get specific rows of img data
|
||||||
|
__global const uchar4 * img_ptr = img + mad24(gidy + i, img_step, gidx + img_offset);
|
||||||
|
__global const uchar4 * tpl_ptr = tpl + mad24(i, tpl_step, tpl_offset);
|
||||||
|
for(j = 0; j < tpl_cols; j ++)
|
||||||
|
{
|
||||||
|
sum = mad24(convert_int4(img_ptr[j]), convert_int4(tpl_ptr[j]), sum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res[res_idx] = sum.x + sum.y + sum.z + sum.w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel
|
||||||
|
void matchTemplate_Naive_CCORR_C4_D5
|
||||||
|
(
|
||||||
|
__global const float4 * img,
|
||||||
|
__global const float4 * tpl,
|
||||||
|
__global float * res,
|
||||||
|
int img_rows,
|
||||||
|
int img_cols,
|
||||||
|
int tpl_rows,
|
||||||
|
int tpl_cols,
|
||||||
|
int res_rows,
|
||||||
|
int res_cols,
|
||||||
|
int img_offset,
|
||||||
|
int tpl_offset,
|
||||||
|
int res_offset,
|
||||||
|
int img_step,
|
||||||
|
int tpl_step,
|
||||||
|
int res_step
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int gidx = get_global_id(0);
|
||||||
|
int gidy = get_global_id(1);
|
||||||
|
int i,j;
|
||||||
|
float4 sum = (float4)(0, 0, 0, 0);
|
||||||
|
img_step /= sizeof(*img);
|
||||||
|
img_offset /= sizeof(*img);
|
||||||
|
tpl_step /= sizeof(*tpl);
|
||||||
|
tpl_offset /= sizeof(*tpl);
|
||||||
|
res_step /= sizeof(*res);
|
||||||
|
res_offset /= sizeof(*res);
|
||||||
|
|
||||||
|
int res_idx = mad24(gidy, res_step, res_offset + gidx);
|
||||||
|
|
||||||
|
if(gidx < res_cols && gidy < res_rows)
|
||||||
|
{
|
||||||
|
for(i = 0; i < tpl_rows; i ++)
|
||||||
|
{
|
||||||
|
// get specific rows of img data
|
||||||
|
__global const float4 * img_ptr = img + mad24(gidy + i, img_step, gidx + img_offset);
|
||||||
|
__global const float4 * tpl_ptr = tpl + mad24(i, tpl_step, tpl_offset);
|
||||||
|
for(j = 0; j < tpl_cols; j ++)
|
||||||
|
{
|
||||||
|
sum = mad(convert_float4(img_ptr[j]), convert_float4(tpl_ptr[j]), sum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res[res_idx] = sum.x + sum.y + sum.z + sum.w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////
|
||||||
|
// CCOFF
|
||||||
|
__kernel
|
||||||
|
void matchTemplate_Prepared_CCOFF_C1_D0
|
||||||
|
(
|
||||||
|
__global float * res,
|
||||||
|
int img_rows,
|
||||||
|
int img_cols,
|
||||||
|
int tpl_rows,
|
||||||
|
int tpl_cols,
|
||||||
|
int res_rows,
|
||||||
|
int res_cols,
|
||||||
|
int res_offset,
|
||||||
|
int res_step,
|
||||||
|
__global const uint * img_sums,
|
||||||
|
int img_sums_offset,
|
||||||
|
int img_sums_step,
|
||||||
|
float tpl_sum
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int gidx = get_global_id(0);
|
||||||
|
int gidy = get_global_id(1);
|
||||||
|
|
||||||
|
img_sums_offset /= sizeof(*img_sums);
|
||||||
|
img_sums_step /= sizeof(*img_sums);
|
||||||
|
res_step /= sizeof(*res);
|
||||||
|
res_offset /= sizeof(*res);
|
||||||
|
|
||||||
|
int res_idx = mad24(gidy, res_step, res_offset + gidx);
|
||||||
|
|
||||||
|
if(gidx < res_cols && gidy < res_rows)
|
||||||
|
{
|
||||||
|
float sum = (float)(
|
||||||
|
(img_sums[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums[SUMS_PTR(tpl_cols, 0)])
|
||||||
|
- (img_sums[SUMS_PTR(0, tpl_rows)] - img_sums[SUMS_PTR(0, 0)]));
|
||||||
|
res[res_idx] -= sum * tpl_sum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
__kernel
|
||||||
|
void matchTemplate_Prepared_CCOFF_C4_D0
|
||||||
|
(
|
||||||
|
__global float * res,
|
||||||
|
int img_rows,
|
||||||
|
int img_cols,
|
||||||
|
int tpl_rows,
|
||||||
|
int tpl_cols,
|
||||||
|
int res_rows,
|
||||||
|
int res_cols,
|
||||||
|
int res_offset,
|
||||||
|
int res_step,
|
||||||
|
__global const uint * img_sums_c0,
|
||||||
|
__global const uint * img_sums_c1,
|
||||||
|
__global const uint * img_sums_c2,
|
||||||
|
__global const uint * img_sums_c3,
|
||||||
|
int img_sums_offset,
|
||||||
|
int img_sums_step,
|
||||||
|
float tpl_sum_c0,
|
||||||
|
float tpl_sum_c1,
|
||||||
|
float tpl_sum_c2,
|
||||||
|
float tpl_sum_c3
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int gidx = get_global_id(0);
|
||||||
|
int gidy = get_global_id(1);
|
||||||
|
|
||||||
|
img_sums_offset /= sizeof(*img_sums_c0);
|
||||||
|
img_sums_step /= sizeof(*img_sums_c0);
|
||||||
|
res_step /= sizeof(*res);
|
||||||
|
res_offset /= sizeof(*res);
|
||||||
|
|
||||||
|
int res_idx = mad24(gidy, res_step, res_offset + gidx);
|
||||||
|
|
||||||
|
if(gidx < res_cols && gidy < res_rows)
|
||||||
|
{
|
||||||
|
float ccorr = res[res_idx];
|
||||||
|
ccorr -= tpl_sum_c0*(float)(
|
||||||
|
(img_sums_c0[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c0[SUMS_PTR(tpl_cols, 0)])
|
||||||
|
- (img_sums_c0[SUMS_PTR(0, tpl_rows)] - img_sums_c0[SUMS_PTR(0, 0)]));
|
||||||
|
ccorr -= tpl_sum_c1*(float)(
|
||||||
|
(img_sums_c1[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c1[SUMS_PTR(tpl_cols, 0)])
|
||||||
|
- (img_sums_c1[SUMS_PTR(0, tpl_rows)] - img_sums_c1[SUMS_PTR(0, 0)]));
|
||||||
|
ccorr -= tpl_sum_c2*(float)(
|
||||||
|
(img_sums_c2[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c2[SUMS_PTR(tpl_cols, 0)])
|
||||||
|
- (img_sums_c2[SUMS_PTR(0, tpl_rows)] - img_sums_c2[SUMS_PTR(0, 0)]));
|
||||||
|
ccorr -= tpl_sum_c3*(float)(
|
||||||
|
(img_sums_c3[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c3[SUMS_PTR(tpl_cols, 0)])
|
||||||
|
- (img_sums_c3[SUMS_PTR(0, tpl_rows)] - img_sums_c3[SUMS_PTR(0, 0)]));
|
||||||
|
res[res_idx] = ccorr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel
|
||||||
|
void matchTemplate_Prepared_CCOFF_NORMED_C1_D0
|
||||||
|
(
|
||||||
|
__global float * res,
|
||||||
|
int img_rows,
|
||||||
|
int img_cols,
|
||||||
|
int tpl_rows,
|
||||||
|
int tpl_cols,
|
||||||
|
int res_rows,
|
||||||
|
int res_cols,
|
||||||
|
int res_offset,
|
||||||
|
int res_step,
|
||||||
|
float weight,
|
||||||
|
__global const uint * img_sums,
|
||||||
|
int img_sums_offset,
|
||||||
|
int img_sums_step,
|
||||||
|
__global const TYPE_IMAGE_SQSUM * img_sqsums,
|
||||||
|
int img_sqsums_offset,
|
||||||
|
int img_sqsums_step,
|
||||||
|
float tpl_sum,
|
||||||
|
float tpl_sqsum
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int gidx = get_global_id(0);
|
||||||
|
int gidy = get_global_id(1);
|
||||||
|
|
||||||
|
img_sqsums_step /= sizeof(*img_sqsums);
|
||||||
|
img_sqsums_offset /= sizeof(*img_sqsums);
|
||||||
|
img_sums_offset /= sizeof(*img_sums);
|
||||||
|
img_sums_step /= sizeof(*img_sums);
|
||||||
|
res_step /= sizeof(*res);
|
||||||
|
res_offset /= sizeof(*res);
|
||||||
|
|
||||||
|
|
||||||
|
int res_idx = mad24(gidy, res_step, res_offset + gidx);
|
||||||
|
|
||||||
|
if(gidx < res_cols && gidy < res_rows)
|
||||||
|
{
|
||||||
|
float image_sum_ = (float)(
|
||||||
|
(img_sums[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums[SUMS_PTR(tpl_cols, 0)])
|
||||||
|
- (img_sums[SUMS_PTR(0, tpl_rows)] - img_sums[SUMS_PTR(0, 0)]));
|
||||||
|
|
||||||
|
float image_sqsum_ = (float)(
|
||||||
|
(img_sqsums[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums[SQSUMS_PTR(tpl_cols, 0)]) -
|
||||||
|
(img_sqsums[SQSUMS_PTR(0, tpl_rows)] - img_sqsums[SQSUMS_PTR(0, 0)]));
|
||||||
|
res[res_idx] = normAcc(res[res_idx] - image_sum_ * tpl_sum,
|
||||||
|
sqrt(tpl_sqsum * (image_sqsum_ - weight * image_sum_ * image_sum_)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
__kernel
|
||||||
|
void matchTemplate_Prepared_CCOFF_NORMED_C4_D0
|
||||||
|
(
|
||||||
|
__global float * res,
|
||||||
|
int img_rows,
|
||||||
|
int img_cols,
|
||||||
|
int tpl_rows,
|
||||||
|
int tpl_cols,
|
||||||
|
int res_rows,
|
||||||
|
int res_cols,
|
||||||
|
int res_offset,
|
||||||
|
int res_step,
|
||||||
|
float weight,
|
||||||
|
__global const uint * img_sums_c0,
|
||||||
|
__global const uint * img_sums_c1,
|
||||||
|
__global const uint * img_sums_c2,
|
||||||
|
__global const uint * img_sums_c3,
|
||||||
|
int img_sums_offset,
|
||||||
|
int img_sums_step,
|
||||||
|
__global const TYPE_IMAGE_SQSUM * img_sqsums_c0,
|
||||||
|
__global const TYPE_IMAGE_SQSUM * img_sqsums_c1,
|
||||||
|
__global const TYPE_IMAGE_SQSUM * img_sqsums_c2,
|
||||||
|
__global const TYPE_IMAGE_SQSUM * img_sqsums_c3,
|
||||||
|
int img_sqsums_offset,
|
||||||
|
int img_sqsums_step,
|
||||||
|
float tpl_sum_c0,
|
||||||
|
float tpl_sum_c1,
|
||||||
|
float tpl_sum_c2,
|
||||||
|
float tpl_sum_c3,
|
||||||
|
float tpl_sqsum
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int gidx = get_global_id(0);
|
||||||
|
int gidy = get_global_id(1);
|
||||||
|
|
||||||
|
img_sqsums_step /= sizeof(*img_sqsums_c0);
|
||||||
|
img_sqsums_offset /= sizeof(*img_sqsums_c0);
|
||||||
|
img_sums_offset /= sizeof(*img_sums_c0);
|
||||||
|
img_sums_step /= sizeof(*img_sums_c0);
|
||||||
|
res_step /= sizeof(*res);
|
||||||
|
res_offset /= sizeof(*res);
|
||||||
|
|
||||||
|
int res_idx = mad24(gidy, res_step, res_offset + gidx);
|
||||||
|
|
||||||
|
if(gidx < res_cols && gidy < res_rows)
|
||||||
|
{
|
||||||
|
float image_sum_c0 = (float)(
|
||||||
|
(img_sums_c0[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c0[SUMS_PTR(tpl_cols, 0)])
|
||||||
|
- (img_sums_c0[SUMS_PTR(0, tpl_rows)] - img_sums_c0[SUMS_PTR(0, 0)]));
|
||||||
|
float image_sum_c1 = (float)(
|
||||||
|
(img_sums_c1[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c1[SUMS_PTR(tpl_cols, 0)])
|
||||||
|
- (img_sums_c1[SUMS_PTR(0, tpl_rows)] - img_sums_c1[SUMS_PTR(0, 0)]));
|
||||||
|
float image_sum_c2 = (float)(
|
||||||
|
(img_sums_c2[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c2[SUMS_PTR(tpl_cols, 0)])
|
||||||
|
- (img_sums_c2[SUMS_PTR(0, tpl_rows)] - img_sums_c2[SUMS_PTR(0, 0)]));
|
||||||
|
float image_sum_c3 = (float)(
|
||||||
|
(img_sums_c3[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c3[SUMS_PTR(tpl_cols, 0)])
|
||||||
|
- (img_sums_c3[SUMS_PTR(0, tpl_rows)] - img_sums_c3[SUMS_PTR(0, 0)]));
|
||||||
|
|
||||||
|
float image_sqsum_c0 = (float)(
|
||||||
|
(img_sqsums_c0[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums_c0[SQSUMS_PTR(tpl_cols, 0)]) -
|
||||||
|
(img_sqsums_c0[SQSUMS_PTR(0, tpl_rows)] - img_sqsums_c0[SQSUMS_PTR(0, 0)]));
|
||||||
|
float image_sqsum_c1 = (float)(
|
||||||
|
(img_sqsums_c1[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums_c1[SQSUMS_PTR(tpl_cols, 0)]) -
|
||||||
|
(img_sqsums_c1[SQSUMS_PTR(0, tpl_rows)] - img_sqsums_c1[SQSUMS_PTR(0, 0)]));
|
||||||
|
float image_sqsum_c2 = (float)(
|
||||||
|
(img_sqsums_c2[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums_c2[SQSUMS_PTR(tpl_cols, 0)]) -
|
||||||
|
(img_sqsums_c2[SQSUMS_PTR(0, tpl_rows)] - img_sqsums_c2[SQSUMS_PTR(0, 0)]));
|
||||||
|
float image_sqsum_c3 = (float)(
|
||||||
|
(img_sqsums_c3[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums_c3[SQSUMS_PTR(tpl_cols, 0)]) -
|
||||||
|
(img_sqsums_c3[SQSUMS_PTR(0, tpl_rows)] - img_sqsums_c3[SQSUMS_PTR(0, 0)]));
|
||||||
|
|
||||||
|
float num = res[res_idx] -
|
||||||
|
image_sum_c0 * tpl_sum_c0 -
|
||||||
|
image_sum_c1 * tpl_sum_c1 -
|
||||||
|
image_sum_c2 * tpl_sum_c2 -
|
||||||
|
image_sum_c3 * tpl_sum_c3;
|
||||||
|
float denum = sqrt( tpl_sqsum * (
|
||||||
|
image_sqsum_c0 - weight * image_sum_c0 * image_sum_c0 +
|
||||||
|
image_sqsum_c1 - weight * image_sum_c1 * image_sum_c1 +
|
||||||
|
image_sqsum_c2 - weight * image_sum_c2 * image_sum_c2 +
|
||||||
|
image_sqsum_c3 - weight * image_sum_c0 * image_sum_c3)
|
||||||
|
);
|
||||||
|
res[res_idx] = normAcc(num, denum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
500
modules/ocl/src/kernels/pyr_down.cl
Normal file
500
modules/ocl/src/kernels/pyr_down.cl
Normal file
@ -0,0 +1,500 @@
|
|||||||
|
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||||
|
//
|
||||||
|
// By downloading, copying, installing or using the software you agree to this license.
|
||||||
|
// If you do not agree to this license, do not download, install,
|
||||||
|
// copy or use the software.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// License Agreement
|
||||||
|
// For Open Source Computer Vision Library
|
||||||
|
//
|
||||||
|
// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
|
||||||
|
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
|
||||||
|
// Third party copyrights are property of their respective owners.
|
||||||
|
//
|
||||||
|
// @Authors
|
||||||
|
// Dachuan Zhao, dachuan@multicorewareinc.com
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
// are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistribution's of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other oclMaterials provided with the distribution.
|
||||||
|
//
|
||||||
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
|
// derived from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// This software is provided by the copyright holders and contributors as is and
|
||||||
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
|
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||||
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
|
// indirect, incidental, special, exemplary, or consequential damages
|
||||||
|
// (including, but not limited to, procurement of substitute goods or services;
|
||||||
|
// loss of use, data, or profits; or business interruption) however caused
|
||||||
|
// and on any theory of liability, whether in contract, strict liability,
|
||||||
|
// or tort (including negligence or otherwise) arising in any way out of
|
||||||
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
|
//
|
||||||
|
//M*/
|
||||||
|
|
||||||
|
#pragma OPENCL EXTENSION cl_amd_printf : enable
|
||||||
|
|
||||||
|
|
||||||
|
uchar round_uchar_uchar(uchar v)
|
||||||
|
{
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
uchar round_uchar_int(int v)
|
||||||
|
{
|
||||||
|
return (uchar)((uint)v <= 255 ? v : v > 0 ? 255 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
uchar round_uchar_float(float v)
|
||||||
|
{
|
||||||
|
if(v - convert_int_sat_rte(v) > 1e-6 || v - convert_int_sat_rte(v) < -1e-6)
|
||||||
|
{
|
||||||
|
if(((int)v + 1) - (v + 0.5f) < 1e-6 && ((int)v + 1) - (v + 0.5f) > -1e-6)
|
||||||
|
{
|
||||||
|
v = (int)v + 0.51f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int iv = convert_int_sat_rte(v);
|
||||||
|
return round_uchar_int(iv);
|
||||||
|
}
|
||||||
|
|
||||||
|
uchar4 round_uchar4_uchar4(uchar4 v)
|
||||||
|
{
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
uchar4 round_uchar4_int4(int4 v)
|
||||||
|
{
|
||||||
|
uchar4 result;
|
||||||
|
result.x = (uchar)(v.x <= 255 ? v.x : v.x > 0 ? 255 : 0);
|
||||||
|
result.y = (uchar)(v.y <= 255 ? v.y : v.y > 0 ? 255 : 0);
|
||||||
|
result.z = (uchar)(v.z <= 255 ? v.z : v.z > 0 ? 255 : 0);
|
||||||
|
result.w = (uchar)(v.w <= 255 ? v.w : v.w > 0 ? 255 : 0);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
uchar4 round_uchar4_float4(float4 v)
|
||||||
|
{
|
||||||
|
if(v.x - convert_int_sat_rte(v.x) > 1e-6 || v.x - convert_int_sat_rte(v.x) < -1e-6)
|
||||||
|
{
|
||||||
|
if(((int)(v.x) + 1) - (v.x + 0.5f) < 1e-6 && ((int)(v.x) + 1) - (v.x + 0.5f) > -1e-6)
|
||||||
|
{
|
||||||
|
v.x = (int)(v.x) + 0.51f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(v.y - convert_int_sat_rte(v.y) > 1e-6 || v.y - convert_int_sat_rte(v.y) < -1e-6)
|
||||||
|
{
|
||||||
|
if(((int)(v.y) + 1) - (v.y + 0.5f) < 1e-6 && ((int)(v.y) + 1) - (v.y + 0.5f) > -1e-6)
|
||||||
|
{
|
||||||
|
v.y = (int)(v.y) + 0.51f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(v.z - convert_int_sat_rte(v.z) > 1e-6 || v.z - convert_int_sat_rte(v.z) < -1e-6)
|
||||||
|
{
|
||||||
|
if(((int)(v.z) + 1) - (v.z + 0.5f) < 1e-6 && ((int)(v.z) + 1) - (v.z + 0.5f) > -1e-6)
|
||||||
|
{
|
||||||
|
v.z = (int)(v.z) + 0.51f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(v.w - convert_int_sat_rte(v.w) > 1e-6 || v.w - convert_int_sat_rte(v.w) < -1e-6)
|
||||||
|
{
|
||||||
|
if(((int)(v.w) + 1) - (v.w + 0.5f) < 1e-6 && ((int)(v.w) + 1) - (v.w + 0.5f) > -1e-6)
|
||||||
|
{
|
||||||
|
v.w = (int)(v.w) + 0.51f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int4 iv = convert_int4_sat_rte(v);
|
||||||
|
return round_uchar4_int4(iv);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int idx_row_low(int y, int last_row)
|
||||||
|
{
|
||||||
|
if(y < 0)
|
||||||
|
{
|
||||||
|
y = -y;
|
||||||
|
}
|
||||||
|
return y % (last_row + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int idx_row_high(int y, int last_row)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int j;
|
||||||
|
if(last_row - y < 0)
|
||||||
|
{
|
||||||
|
i = (y - last_row);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i = (last_row - y);
|
||||||
|
}
|
||||||
|
if(last_row - i < 0)
|
||||||
|
{
|
||||||
|
j = i - last_row;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
j = last_row - i;
|
||||||
|
}
|
||||||
|
return j % (last_row + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int idx_row(int y, int last_row)
|
||||||
|
{
|
||||||
|
return idx_row_low(idx_row_high(y, last_row), last_row);
|
||||||
|
}
|
||||||
|
|
||||||
|
int idx_col_low(int x, int last_col)
|
||||||
|
{
|
||||||
|
if(x < 0)
|
||||||
|
{
|
||||||
|
x = -x;
|
||||||
|
}
|
||||||
|
return x % (last_col + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int idx_col_high(int x, int last_col)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int j;
|
||||||
|
if(last_col - x < 0)
|
||||||
|
{
|
||||||
|
i = (x - last_col);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i = (last_col - x);
|
||||||
|
}
|
||||||
|
if(last_col - i < 0)
|
||||||
|
{
|
||||||
|
j = i - last_col;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
j = last_col - i;
|
||||||
|
}
|
||||||
|
return j % (last_col + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int idx_col(int x, int last_col)
|
||||||
|
{
|
||||||
|
return idx_col_low(idx_col_high(x, last_col), last_col);
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel void pyrDown_C1_D0(__global uchar * srcData, int srcStep, int srcOffset, int srcRows, int srcCols, __global uchar *dst, int dstStep, int dstOffset, int dstCols)
|
||||||
|
{
|
||||||
|
const int x = get_group_id(0) * get_local_size(0) + get_local_id(0);
|
||||||
|
const int y = get_group_id(1);
|
||||||
|
|
||||||
|
__local float smem[256 + 4];
|
||||||
|
|
||||||
|
float sum;
|
||||||
|
|
||||||
|
const int src_y = 2*y;
|
||||||
|
const int last_row = srcRows - 1;
|
||||||
|
const int last_col = srcCols - 1;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
sum = sum + 0.0625f * round_uchar_uchar(((__global uchar*)((__global char*)srcData + idx_row(src_y - 2, last_row) * srcStep))[idx_col(x, last_col)]);
|
||||||
|
sum = sum + 0.25f * round_uchar_uchar(((__global uchar*)((__global char*)srcData + idx_row(src_y - 1, last_row) * srcStep))[idx_col(x, last_col)]);
|
||||||
|
sum = sum + 0.375f * round_uchar_uchar(((__global uchar*)((__global char*)srcData + idx_row(src_y , last_row) * srcStep))[idx_col(x, last_col)]);
|
||||||
|
sum = sum + 0.25f * round_uchar_uchar(((__global uchar*)((__global char*)srcData + idx_row(src_y + 1, last_row) * srcStep))[idx_col(x, last_col)]);
|
||||||
|
sum = sum + 0.0625f * round_uchar_uchar(((__global uchar*)((__global char*)srcData + idx_row(src_y + 2, last_row) * srcStep))[idx_col(x, last_col)]);
|
||||||
|
|
||||||
|
smem[2 + get_local_id(0)] = sum;
|
||||||
|
|
||||||
|
if (get_local_id(0) < 2)
|
||||||
|
{
|
||||||
|
const int left_x = x - 2;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
sum = sum + 0.0625f * round_uchar_uchar(((__global uchar*)((__global char*)srcData + idx_row(src_y - 2, last_row) * srcStep))[idx_col(left_x, last_col)]);
|
||||||
|
sum = sum + 0.25f * round_uchar_uchar(((__global uchar*)((__global char*)srcData + idx_row(src_y - 1, last_row) * srcStep))[idx_col(left_x, last_col)]);
|
||||||
|
sum = sum + 0.375f * round_uchar_uchar(((__global uchar*)((__global char*)srcData + idx_row(src_y , last_row) * srcStep))[idx_col(left_x, last_col)]);
|
||||||
|
sum = sum + 0.25f * round_uchar_uchar(((__global uchar*)((__global char*)srcData + idx_row(src_y + 1, last_row) * srcStep))[idx_col(left_x, last_col)]);
|
||||||
|
sum = sum + 0.0625f * round_uchar_uchar(((__global uchar*)((__global char*)srcData + idx_row(src_y + 2, last_row) * srcStep))[idx_col(left_x, last_col)]);
|
||||||
|
|
||||||
|
smem[get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (get_local_id(0) > 253)
|
||||||
|
{
|
||||||
|
const int right_x = x + 2;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
sum = sum + 0.0625f * round_uchar_uchar(((__global uchar*)((__global char*)srcData + idx_row(src_y - 2, last_row) * srcStep))[idx_col(right_x, last_col)]);
|
||||||
|
sum = sum + 0.25f * round_uchar_uchar(((__global uchar*)((__global char*)srcData + idx_row(src_y - 1, last_row) * srcStep))[idx_col(right_x, last_col)]);
|
||||||
|
sum = sum + 0.375f * round_uchar_uchar(((__global uchar*)((__global char*)srcData + idx_row(src_y , last_row) * srcStep))[idx_col(right_x, last_col)]);
|
||||||
|
sum = sum + 0.25f * round_uchar_uchar(((__global uchar*)((__global char*)srcData + idx_row(src_y + 1, last_row) * srcStep))[idx_col(right_x, last_col)]);
|
||||||
|
sum = sum + 0.0625f * round_uchar_uchar(((__global uchar*)((__global char*)srcData + idx_row(src_y + 2, last_row) * srcStep))[idx_col(right_x, last_col)]);
|
||||||
|
|
||||||
|
smem[4 + get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if (get_local_id(0) < 128)
|
||||||
|
{
|
||||||
|
const int tid2 = get_local_id(0) * 2;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
sum = sum + 0.0625f * smem[2 + tid2 - 2];
|
||||||
|
sum = sum + 0.25f * smem[2 + tid2 - 1];
|
||||||
|
sum = sum + 0.375f * smem[2 + tid2 ];
|
||||||
|
sum = sum + 0.25f * smem[2 + tid2 + 1];
|
||||||
|
sum = sum + 0.0625f * smem[2 + tid2 + 2];
|
||||||
|
|
||||||
|
const int dst_x = (get_group_id(0) * get_local_size(0) + tid2) / 2;
|
||||||
|
|
||||||
|
if (dst_x < dstCols)
|
||||||
|
dst[y * dstStep + dst_x] = round_uchar_float(sum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel void pyrDown_C4_D0(__global uchar4 * srcData, int srcStep, int srcOffset, int srcRows, int srcCols, __global uchar4 *dst, int dstStep, int dstOffset, int dstCols)
|
||||||
|
{
|
||||||
|
const int x = get_group_id(0) * get_local_size(0) + get_local_id(0);
|
||||||
|
const int y = get_group_id(1);
|
||||||
|
|
||||||
|
__local float4 smem[256 + 4];
|
||||||
|
|
||||||
|
float4 sum;
|
||||||
|
|
||||||
|
const int src_y = 2*y;
|
||||||
|
const int last_row = srcRows - 1;
|
||||||
|
const int last_col = srcCols - 1;
|
||||||
|
|
||||||
|
float4 co1 = (float4)(0.375f, 0.375f, 0.375f, 0.375f);
|
||||||
|
float4 co2 = (float4)(0.25f, 0.25f, 0.25f, 0.25f);
|
||||||
|
float4 co3 = (float4)(0.0625f, 0.0625f, 0.0625f, 0.0625f);
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
sum = sum + co3 * convert_float4(round_uchar4_uchar4(((__global uchar4*)((__global char4*)srcData + idx_row(src_y - 2, last_row) * srcStep / 4))[idx_col(x, last_col)]));
|
||||||
|
sum = sum + co2 * convert_float4(round_uchar4_uchar4(((__global uchar4*)((__global char4*)srcData + idx_row(src_y - 1, last_row) * srcStep / 4))[idx_col(x, last_col)]));
|
||||||
|
sum = sum + co1 * convert_float4(round_uchar4_uchar4(((__global uchar4*)((__global char4*)srcData + idx_row(src_y , last_row) * srcStep / 4))[idx_col(x, last_col)]));
|
||||||
|
sum = sum + co2 * convert_float4(round_uchar4_uchar4(((__global uchar4*)((__global char4*)srcData + idx_row(src_y + 1, last_row) * srcStep / 4))[idx_col(x, last_col)]));
|
||||||
|
sum = sum + co3 * convert_float4(round_uchar4_uchar4(((__global uchar4*)((__global char4*)srcData + idx_row(src_y + 2, last_row) * srcStep / 4))[idx_col(x, last_col)]));
|
||||||
|
|
||||||
|
smem[2 + get_local_id(0)] = sum;
|
||||||
|
|
||||||
|
if (get_local_id(0) < 2)
|
||||||
|
{
|
||||||
|
const int left_x = x - 2;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
sum = sum + co3 * convert_float4(round_uchar4_uchar4(((__global uchar4*)((__global char4*)srcData + idx_row(src_y - 2, last_row) * srcStep / 4))[idx_col(left_x, last_col)]));
|
||||||
|
sum = sum + co2 * convert_float4(round_uchar4_uchar4(((__global uchar4*)((__global char4*)srcData + idx_row(src_y - 1, last_row) * srcStep / 4))[idx_col(left_x, last_col)]));
|
||||||
|
sum = sum + co1 * convert_float4(round_uchar4_uchar4(((__global uchar4*)((__global char4*)srcData + idx_row(src_y , last_row) * srcStep / 4))[idx_col(left_x, last_col)]));
|
||||||
|
sum = sum + co2 * convert_float4(round_uchar4_uchar4(((__global uchar4*)((__global char4*)srcData + idx_row(src_y + 1, last_row) * srcStep / 4))[idx_col(left_x, last_col)]));
|
||||||
|
sum = sum + co3 * convert_float4(round_uchar4_uchar4(((__global uchar4*)((__global char4*)srcData + idx_row(src_y + 2, last_row) * srcStep / 4))[idx_col(left_x, last_col)]));
|
||||||
|
|
||||||
|
smem[get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (get_local_id(0) > 253)
|
||||||
|
{
|
||||||
|
const int right_x = x + 2;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
sum = sum + co3 * convert_float4(round_uchar4_uchar4(((__global uchar4*)((__global char4*)srcData + idx_row(src_y - 2, last_row) * srcStep / 4))[idx_col(right_x, last_col)]));
|
||||||
|
sum = sum + co2 * convert_float4(round_uchar4_uchar4(((__global uchar4*)((__global char4*)srcData + idx_row(src_y - 1, last_row) * srcStep / 4))[idx_col(right_x, last_col)]));
|
||||||
|
sum = sum + co1 * convert_float4(round_uchar4_uchar4(((__global uchar4*)((__global char4*)srcData + idx_row(src_y , last_row) * srcStep / 4))[idx_col(right_x, last_col)]));
|
||||||
|
sum = sum + co2 * convert_float4(round_uchar4_uchar4(((__global uchar4*)((__global char4*)srcData + idx_row(src_y + 1, last_row) * srcStep / 4))[idx_col(right_x, last_col)]));
|
||||||
|
sum = sum + co3 * convert_float4(round_uchar4_uchar4(((__global uchar4*)((__global char4*)srcData + idx_row(src_y + 2, last_row) * srcStep / 4))[idx_col(right_x, last_col)]));
|
||||||
|
|
||||||
|
smem[4 + get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if (get_local_id(0) < 128)
|
||||||
|
{
|
||||||
|
const int tid2 = get_local_id(0) * 2;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
sum = sum + co3 * smem[2 + tid2 - 2];
|
||||||
|
sum = sum + co2 * smem[2 + tid2 - 1];
|
||||||
|
sum = sum + co1 * smem[2 + tid2 ];
|
||||||
|
sum = sum + co2 * smem[2 + tid2 + 1];
|
||||||
|
sum = sum + co3 * smem[2 + tid2 + 2];
|
||||||
|
|
||||||
|
const int dst_x = (get_group_id(0) * get_local_size(0) + tid2) / 2;
|
||||||
|
|
||||||
|
if (dst_x < dstCols)
|
||||||
|
dst[y * dstStep / 4 + dst_x] = round_uchar4_float4(sum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel void pyrDown_C1_D5(__global float * srcData, int srcStep, int srcOffset, int srcRows, int srcCols, __global float *dst, int dstStep, int dstOffset, int dstCols)
|
||||||
|
{
|
||||||
|
const int x = get_group_id(0) * get_local_size(0) + get_local_id(0);
|
||||||
|
const int y = get_group_id(1);
|
||||||
|
|
||||||
|
__local float smem[256 + 4];
|
||||||
|
|
||||||
|
float sum;
|
||||||
|
|
||||||
|
const int src_y = 2*y;
|
||||||
|
const int last_row = srcRows - 1;
|
||||||
|
const int last_col = srcCols - 1;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
sum = sum + 0.0625f * ((__global float*)((__global char*)srcData + idx_row(src_y - 2, last_row) * srcStep))[idx_col(x, last_col)];
|
||||||
|
sum = sum + 0.25f * ((__global float*)((__global char*)srcData + idx_row(src_y - 1, last_row) * srcStep))[idx_col(x, last_col)];
|
||||||
|
sum = sum + 0.375f * ((__global float*)((__global char*)srcData + idx_row(src_y , last_row) * srcStep))[idx_col(x, last_col)];
|
||||||
|
sum = sum + 0.25f * ((__global float*)((__global char*)srcData + idx_row(src_y + 1, last_row) * srcStep))[idx_col(x, last_col)];
|
||||||
|
sum = sum + 0.0625f * ((__global float*)((__global char*)srcData + idx_row(src_y + 2, last_row) * srcStep))[idx_col(x, last_col)];
|
||||||
|
|
||||||
|
smem[2 + get_local_id(0)] = sum;
|
||||||
|
|
||||||
|
if (get_local_id(0) < 2)
|
||||||
|
{
|
||||||
|
const int left_x = x - 2;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
sum = sum + 0.0625f * ((__global float*)((__global char*)srcData + idx_row(src_y - 2, last_row) * srcStep))[idx_col(left_x, last_col)];
|
||||||
|
sum = sum + 0.25f * ((__global float*)((__global char*)srcData + idx_row(src_y - 1, last_row) * srcStep))[idx_col(left_x, last_col)];
|
||||||
|
sum = sum + 0.375f * ((__global float*)((__global char*)srcData + idx_row(src_y , last_row) * srcStep))[idx_col(left_x, last_col)];
|
||||||
|
sum = sum + 0.25f * ((__global float*)((__global char*)srcData + idx_row(src_y + 1, last_row) * srcStep))[idx_col(left_x, last_col)];
|
||||||
|
sum = sum + 0.0625f * ((__global float*)((__global char*)srcData + idx_row(src_y + 2, last_row) * srcStep))[idx_col(left_x, last_col)];
|
||||||
|
|
||||||
|
smem[get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (get_local_id(0) > 253)
|
||||||
|
{
|
||||||
|
const int right_x = x + 2;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
sum = sum + 0.0625f * ((__global float*)((__global char*)srcData + idx_row(src_y - 2, last_row) * srcStep))[idx_col(right_x, last_col)];
|
||||||
|
sum = sum + 0.25f * ((__global float*)((__global char*)srcData + idx_row(src_y - 1, last_row) * srcStep))[idx_col(right_x, last_col)];
|
||||||
|
sum = sum + 0.375f * ((__global float*)((__global char*)srcData + idx_row(src_y , last_row) * srcStep))[idx_col(right_x, last_col)];
|
||||||
|
sum = sum + 0.25f * ((__global float*)((__global char*)srcData + idx_row(src_y + 1, last_row) * srcStep))[idx_col(right_x, last_col)];
|
||||||
|
sum = sum + 0.0625f * ((__global float*)((__global char*)srcData + idx_row(src_y + 2, last_row) * srcStep))[idx_col(right_x, last_col)];
|
||||||
|
|
||||||
|
smem[4 + get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if (get_local_id(0) < 128)
|
||||||
|
{
|
||||||
|
const int tid2 = get_local_id(0) * 2;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
sum = sum + 0.0625f * smem[2 + tid2 - 2];
|
||||||
|
sum = sum + 0.25f * smem[2 + tid2 - 1];
|
||||||
|
sum = sum + 0.375f * smem[2 + tid2 ];
|
||||||
|
sum = sum + 0.25f * smem[2 + tid2 + 1];
|
||||||
|
sum = sum + 0.0625f * smem[2 + tid2 + 2];
|
||||||
|
|
||||||
|
const int dst_x = (get_group_id(0) * get_local_size(0) + tid2) / 2;
|
||||||
|
|
||||||
|
if (dst_x < dstCols)
|
||||||
|
dst[y * dstStep / 4 + dst_x] = sum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel void pyrDown_C4_D5(__global float4 * srcData, int srcStep, int srcOffset, int srcRows, int srcCols, __global float4 *dst, int dstStep, int dstOffset, int dstCols)
|
||||||
|
{
|
||||||
|
const int x = get_group_id(0) * get_local_size(0) + get_local_id(0);
|
||||||
|
const int y = get_group_id(1);
|
||||||
|
|
||||||
|
__local float4 smem[256 + 4];
|
||||||
|
|
||||||
|
float4 sum;
|
||||||
|
|
||||||
|
const int src_y = 2*y;
|
||||||
|
const int last_row = srcRows - 1;
|
||||||
|
const int last_col = srcCols - 1;
|
||||||
|
|
||||||
|
float4 co1 = (float4)(0.375f, 0.375f, 0.375f, 0.375f);
|
||||||
|
float4 co2 = (float4)(0.25f, 0.25f, 0.25f, 0.25f);
|
||||||
|
float4 co3 = (float4)(0.0625f, 0.0625f, 0.0625f, 0.0625f);
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
sum = sum + co3 * ((__global float4*)((__global char4*)srcData + idx_row(src_y - 2, last_row) * srcStep / 4))[idx_col(x, last_col)];
|
||||||
|
sum = sum + co2 * ((__global float4*)((__global char4*)srcData + idx_row(src_y - 1, last_row) * srcStep / 4))[idx_col(x, last_col)];
|
||||||
|
sum = sum + co1 * ((__global float4*)((__global char4*)srcData + idx_row(src_y , last_row) * srcStep / 4))[idx_col(x, last_col)];
|
||||||
|
sum = sum + co2 * ((__global float4*)((__global char4*)srcData + idx_row(src_y + 1, last_row) * srcStep / 4))[idx_col(x, last_col)];
|
||||||
|
sum = sum + co3 * ((__global float4*)((__global char4*)srcData + idx_row(src_y + 2, last_row) * srcStep / 4))[idx_col(x, last_col)];
|
||||||
|
|
||||||
|
smem[2 + get_local_id(0)] = sum;
|
||||||
|
|
||||||
|
if (get_local_id(0) < 2)
|
||||||
|
{
|
||||||
|
const int left_x = x - 2;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
sum = sum + co3 * ((__global float4*)((__global char4*)srcData + idx_row(src_y - 2, last_row) * srcStep / 4))[idx_col(left_x, last_col)];
|
||||||
|
sum = sum + co2 * ((__global float4*)((__global char4*)srcData + idx_row(src_y - 1, last_row) * srcStep / 4))[idx_col(left_x, last_col)];
|
||||||
|
sum = sum + co1 * ((__global float4*)((__global char4*)srcData + idx_row(src_y , last_row) * srcStep / 4))[idx_col(left_x, last_col)];
|
||||||
|
sum = sum + co2 * ((__global float4*)((__global char4*)srcData + idx_row(src_y + 1, last_row) * srcStep / 4))[idx_col(left_x, last_col)];
|
||||||
|
sum = sum + co3 * ((__global float4*)((__global char4*)srcData + idx_row(src_y + 2, last_row) * srcStep / 4))[idx_col(left_x, last_col)];
|
||||||
|
|
||||||
|
smem[get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (get_local_id(0) > 253)
|
||||||
|
{
|
||||||
|
const int right_x = x + 2;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
sum = sum + co3 * ((__global float4*)((__global char4*)srcData + idx_row(src_y - 2, last_row) * srcStep / 4))[idx_col(right_x, last_col)];
|
||||||
|
sum = sum + co2 * ((__global float4*)((__global char4*)srcData + idx_row(src_y - 1, last_row) * srcStep / 4))[idx_col(right_x, last_col)];
|
||||||
|
sum = sum + co1 * ((__global float4*)((__global char4*)srcData + idx_row(src_y , last_row) * srcStep / 4))[idx_col(right_x, last_col)];
|
||||||
|
sum = sum + co2 * ((__global float4*)((__global char4*)srcData + idx_row(src_y + 1, last_row) * srcStep / 4))[idx_col(right_x, last_col)];
|
||||||
|
sum = sum + co3 * ((__global float4*)((__global char4*)srcData + idx_row(src_y + 2, last_row) * srcStep / 4))[idx_col(right_x, last_col)];
|
||||||
|
|
||||||
|
smem[4 + get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if (get_local_id(0) < 128)
|
||||||
|
{
|
||||||
|
const int tid2 = get_local_id(0) * 2;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
sum = sum + co3 * smem[2 + tid2 - 2];
|
||||||
|
sum = sum + co2 * smem[2 + tid2 - 1];
|
||||||
|
sum = sum + co1 * smem[2 + tid2 ];
|
||||||
|
sum = sum + co2 * smem[2 + tid2 + 1];
|
||||||
|
sum = sum + co3 * smem[2 + tid2 + 2];
|
||||||
|
|
||||||
|
const int dst_x = (get_group_id(0) * get_local_size(0) + tid2) / 2;
|
||||||
|
|
||||||
|
if (dst_x < dstCols)
|
||||||
|
dst[y * dstStep / 16 + dst_x] = sum;
|
||||||
|
}
|
||||||
|
}
|
750
modules/ocl/src/kernels/pyr_up.cl
Normal file
750
modules/ocl/src/kernels/pyr_up.cl
Normal file
@ -0,0 +1,750 @@
|
|||||||
|
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||||
|
//
|
||||||
|
// By downloading, copying, installing or using the software you agree to this license.
|
||||||
|
// If you do not agree to this license, do not download, install,
|
||||||
|
// copy or use the software.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// License Agreement
|
||||||
|
// For Open Source Computer Vision Library
|
||||||
|
//
|
||||||
|
// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
|
||||||
|
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
|
||||||
|
// Third party copyrights are property of their respective owners.
|
||||||
|
//
|
||||||
|
// @Authors
|
||||||
|
// Zhang Chunpeng chunpeng@multicorewareinc.com
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
// are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistribution's of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other oclMaterials provided with the distribution.
|
||||||
|
//
|
||||||
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
|
// derived from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// This software is provided by the copyright holders and contributors as is and
|
||||||
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
|
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||||
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
|
// indirect, incidental, special, exemplary, or consequential damages
|
||||||
|
// (including, but not limited to, procurement of substitute goods or services;
|
||||||
|
// loss of use, data, or profits; or business interruption) however caused
|
||||||
|
// and on any theory of liability, whether in contract, strict liability,
|
||||||
|
// or tort (including negligence or otherwise) arising in any way out of
|
||||||
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
|
//
|
||||||
|
//M*/
|
||||||
|
|
||||||
|
//#pragma OPENCL EXTENSION cl_amd_printf : enable
|
||||||
|
|
||||||
|
uchar get_valid_uchar(uchar data)
|
||||||
|
{
|
||||||
|
return (uchar)(data <= 255 ? data : data > 0 ? 255 : 0);
|
||||||
|
}
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
////////////////////////// CV_8UC1 //////////////////////////////////
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
__kernel void pyrUp_C1_D0(__global uchar* src,__global uchar* dst,
|
||||||
|
int srcRows,int dstRows,int srcCols,int dstCols,
|
||||||
|
int srcOffset,int dstOffset,int srcStep,int dstStep)
|
||||||
|
{
|
||||||
|
const int x = get_global_id(0);
|
||||||
|
const int y = get_global_id(1);
|
||||||
|
|
||||||
|
__local float s_srcPatch[10][10];
|
||||||
|
__local float s_dstPatch[20][16];
|
||||||
|
|
||||||
|
|
||||||
|
if( get_local_id(0) < 10 && get_local_id(1) < 10 )
|
||||||
|
{
|
||||||
|
int srcx = (int)(get_group_id(0) * get_local_size(0) / 2 + get_local_id(0)) - 1;
|
||||||
|
int srcy = (int)(get_group_id(1) * get_local_size(1) / 2 + get_local_id(1)) - 1;
|
||||||
|
|
||||||
|
srcx = abs(srcx);
|
||||||
|
srcx = min(srcCols - 1,srcx);
|
||||||
|
|
||||||
|
srcy = abs(srcy);
|
||||||
|
srcy = min(srcRows -1 ,srcy);
|
||||||
|
|
||||||
|
s_srcPatch[get_local_id(1)][get_local_id(0)] = (float)(src[srcx + srcy * srcStep]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
float sum = 0;
|
||||||
|
const int evenFlag = (int)((get_local_id(0) & 1) == 0);
|
||||||
|
const int oddFlag = (int)((get_local_id(0) & 1) != 0);
|
||||||
|
const bool eveny = ((get_local_id(1) & 1) == 0);
|
||||||
|
const int tidx = get_local_id(0);
|
||||||
|
|
||||||
|
if(eveny)
|
||||||
|
{
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 2) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.375f ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx ) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 2) >> 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
s_dstPatch[2 + get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
|
||||||
|
if (get_local_id(1) < 2)
|
||||||
|
{
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
if (eveny)
|
||||||
|
{
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[0][1 + ((tidx - 2) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[0][1 + ((tidx - 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.375f ) * s_srcPatch[0][1 + ((tidx ) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[0][1 + ((tidx + 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[0][1 + ((tidx + 2) >> 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
s_dstPatch[get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (get_local_id(1) > 13)
|
||||||
|
{
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
if (eveny)
|
||||||
|
{
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[9][1 + ((tidx - 2) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[9][1 + ((tidx - 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.375f ) * s_srcPatch[9][1 + ((tidx ) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[9][1 + ((tidx + 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[9][1 + ((tidx + 2) >> 1)];
|
||||||
|
}
|
||||||
|
s_dstPatch[4 + get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
const int tidy = get_local_id(1);
|
||||||
|
|
||||||
|
sum = sum + 0.0625f * s_dstPatch[2 + tidy - 2][get_local_id(0)];
|
||||||
|
sum = sum + 0.25f * s_dstPatch[2 + tidy - 1][get_local_id(0)];
|
||||||
|
sum = sum + 0.375f * s_dstPatch[2 + tidy ][get_local_id(0)];
|
||||||
|
sum = sum + 0.25f * s_dstPatch[2 + tidy + 1][get_local_id(0)];
|
||||||
|
sum = sum + 0.0625f * s_dstPatch[2 + tidy + 2][get_local_id(0)];
|
||||||
|
|
||||||
|
if ((x < dstCols) && (y < dstRows))
|
||||||
|
dst[x + y * dstStep] = (float)(4.0f * sum);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
////////////////////////// CV_16UC1 /////////////////////////////////
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
__kernel void pyrUp_C1_D2(__global ushort* src,__global ushort* dst,
|
||||||
|
int srcRows,int dstRows,int srcCols,int dstCols,
|
||||||
|
int srcOffset,int dstOffset,int srcStep,int dstStep)
|
||||||
|
{
|
||||||
|
const int x = get_global_id(0);
|
||||||
|
const int y = get_global_id(1);
|
||||||
|
|
||||||
|
__local float s_srcPatch[10][10];
|
||||||
|
__local float s_dstPatch[20][16];
|
||||||
|
|
||||||
|
srcStep = srcStep >> 1;
|
||||||
|
dstStep = dstStep >> 1;
|
||||||
|
srcOffset = srcOffset >> 1;
|
||||||
|
dstOffset = dstOffset >> 1;
|
||||||
|
|
||||||
|
|
||||||
|
if( get_local_id(0) < 10 && get_local_id(1) < 10 )
|
||||||
|
{
|
||||||
|
int srcx = (int)(get_group_id(0) * get_local_size(0) / 2 + get_local_id(0)) - 1;
|
||||||
|
int srcy = (int)(get_group_id(1) * get_local_size(1) / 2 + get_local_id(1)) - 1;
|
||||||
|
|
||||||
|
srcx = abs(srcx);
|
||||||
|
srcx = min(srcCols - 1,srcx);
|
||||||
|
|
||||||
|
srcy = abs(srcy);
|
||||||
|
srcy = min(srcRows -1 ,srcy);
|
||||||
|
|
||||||
|
s_srcPatch[get_local_id(1)][get_local_id(0)] = (float)(src[srcx + srcy * srcStep]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
float sum = 0;
|
||||||
|
|
||||||
|
const int evenFlag = (int)((get_local_id(0) & 1) == 0);
|
||||||
|
const int oddFlag = (int)((get_local_id(0) & 1) != 0);
|
||||||
|
const bool eveny = ((get_local_id(1) & 1) == 0);
|
||||||
|
const int tidx = get_local_id(0);
|
||||||
|
|
||||||
|
if(eveny)
|
||||||
|
{
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 2) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.375f ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx ) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 2) >> 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
s_dstPatch[2 + get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
|
||||||
|
if (get_local_id(1) < 2)
|
||||||
|
{
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
if (eveny)
|
||||||
|
{
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[0][1 + ((tidx - 2) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[0][1 + ((tidx - 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.375f ) * s_srcPatch[0][1 + ((tidx ) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[0][1 + ((tidx + 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[0][1 + ((tidx + 2) >> 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
s_dstPatch[get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (get_local_id(1) > 13)
|
||||||
|
{
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
if (eveny)
|
||||||
|
{
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[9][1 + ((tidx - 2) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[9][1 + ((tidx - 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.375f ) * s_srcPatch[9][1 + ((tidx ) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[9][1 + ((tidx + 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[9][1 + ((tidx + 2) >> 1)];
|
||||||
|
}
|
||||||
|
s_dstPatch[4 + get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
const int tidy = get_local_id(1);
|
||||||
|
|
||||||
|
sum = sum + 0.0625f * s_dstPatch[2 + tidy - 2][get_local_id(0)];
|
||||||
|
sum = sum + 0.25f * s_dstPatch[2 + tidy - 1][get_local_id(0)];
|
||||||
|
sum = sum + 0.375f * s_dstPatch[2 + tidy ][get_local_id(0)];
|
||||||
|
sum = sum + 0.25f * s_dstPatch[2 + tidy + 1][get_local_id(0)];
|
||||||
|
sum = sum + 0.0625f * s_dstPatch[2 + tidy + 2][get_local_id(0)];
|
||||||
|
|
||||||
|
if ((x < dstCols) && (y < dstRows))
|
||||||
|
dst[x + y * dstStep] = (float)(4.0f * sum);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
////////////////////////// CV_32FC1 /////////////////////////////////
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
__kernel void pyrUp_C1_D5(__global float* src,__global float* dst,
|
||||||
|
int srcRows,int dstRows,int srcCols,int dstCols,
|
||||||
|
int srcOffset,int dstOffset,int srcStep,int dstStep)
|
||||||
|
{
|
||||||
|
const int x = get_global_id(0);
|
||||||
|
const int y = get_global_id(1);
|
||||||
|
|
||||||
|
__local float s_srcPatch[10][10];
|
||||||
|
__local float s_dstPatch[20][16];
|
||||||
|
|
||||||
|
srcOffset = srcOffset >> 2;
|
||||||
|
dstOffset = dstOffset >> 2;
|
||||||
|
srcStep = srcStep >> 2;
|
||||||
|
dstStep = dstStep >> 2;
|
||||||
|
|
||||||
|
|
||||||
|
if( get_local_id(0) < 10 && get_local_id(1) < 10 )
|
||||||
|
{
|
||||||
|
int srcx = (int)(get_group_id(0) * get_local_size(0) / 2 + get_local_id(0)) - 1;
|
||||||
|
int srcy = (int)(get_group_id(1) * get_local_size(1) / 2 + get_local_id(1)) - 1;
|
||||||
|
|
||||||
|
srcx = abs(srcx);
|
||||||
|
srcx = min(srcCols - 1,srcx);
|
||||||
|
|
||||||
|
srcy = abs(srcy);
|
||||||
|
srcy = min(srcRows -1 ,srcy);
|
||||||
|
|
||||||
|
s_srcPatch[get_local_id(1)][get_local_id(0)] = (float)(src[srcx + srcy * srcStep]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
float sum = 0;
|
||||||
|
const int evenFlag = (int)((get_local_id(0) & 1) == 0);
|
||||||
|
const int oddFlag = (int)((get_local_id(0) & 1) != 0);
|
||||||
|
const bool eveny = ((get_local_id(1) & 1) == 0);
|
||||||
|
const int tidx = get_local_id(0);
|
||||||
|
|
||||||
|
if(eveny)
|
||||||
|
{
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 2) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.375f ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx ) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 2) >> 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
s_dstPatch[2 + get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
|
||||||
|
if (get_local_id(1) < 2)
|
||||||
|
{
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
if (eveny)
|
||||||
|
{
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[0][1 + ((tidx - 2) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[0][1 + ((tidx - 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.375f ) * s_srcPatch[0][1 + ((tidx ) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[0][1 + ((tidx + 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[0][1 + ((tidx + 2) >> 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
s_dstPatch[get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (get_local_id(1) > 13)
|
||||||
|
{
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
if (eveny)
|
||||||
|
{
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[9][1 + ((tidx - 2) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[9][1 + ((tidx - 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.375f ) * s_srcPatch[9][1 + ((tidx ) >> 1)];
|
||||||
|
sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[9][1 + ((tidx + 1) >> 1)];
|
||||||
|
sum = sum + (evenFlag * 0.0625f) * s_srcPatch[9][1 + ((tidx + 2) >> 1)];
|
||||||
|
}
|
||||||
|
s_dstPatch[4 + get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
const int tidy = get_local_id(1);
|
||||||
|
|
||||||
|
sum = sum + 0.0625f * s_dstPatch[2 + tidy - 2][get_local_id(0)];
|
||||||
|
sum = sum + 0.25f * s_dstPatch[2 + tidy - 1][get_local_id(0)];
|
||||||
|
sum = sum + 0.375f * s_dstPatch[2 + tidy ][get_local_id(0)];
|
||||||
|
sum = sum + 0.25f * s_dstPatch[2 + tidy + 1][get_local_id(0)];
|
||||||
|
sum = sum + 0.0625f * s_dstPatch[2 + tidy + 2][get_local_id(0)];
|
||||||
|
|
||||||
|
if ((x < dstCols) && (y < dstRows))
|
||||||
|
dst[x + y * dstStep] = (float)(4.0f * sum);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
////////////////////////// CV_8UC4 //////////////////////////////////
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
float4 covert_uchar4_to_float4(uchar4 data)
|
||||||
|
{
|
||||||
|
float4 f4Data = {0,0,0,0};
|
||||||
|
|
||||||
|
f4Data.x = (float)data.x;
|
||||||
|
f4Data.y = (float)data.y;
|
||||||
|
f4Data.z = (float)data.z;
|
||||||
|
f4Data.w = (float)data.w;
|
||||||
|
|
||||||
|
return f4Data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uchar4 convert_float4_to_uchar4(float4 data)
|
||||||
|
{
|
||||||
|
uchar4 u4Data;
|
||||||
|
|
||||||
|
u4Data.x = get_valid_uchar(data.x);
|
||||||
|
u4Data.y = get_valid_uchar(data.y);
|
||||||
|
u4Data.z = get_valid_uchar(data.z);
|
||||||
|
u4Data.w = get_valid_uchar(data.w);
|
||||||
|
|
||||||
|
return u4Data;
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 int_x_float4(int leftOpr,float4 rightOpr)
|
||||||
|
{
|
||||||
|
float4 result = {0,0,0,0};
|
||||||
|
|
||||||
|
result.x = rightOpr.x * leftOpr;
|
||||||
|
result.y = rightOpr.y * leftOpr;
|
||||||
|
result.z = rightOpr.z * leftOpr;
|
||||||
|
result.w = rightOpr.w * leftOpr;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 float4_x_float4(float4 leftOpr,float4 rightOpr)
|
||||||
|
{
|
||||||
|
float4 result;
|
||||||
|
|
||||||
|
result.x = leftOpr.x * rightOpr.x;
|
||||||
|
result.y = leftOpr.y * rightOpr.y;
|
||||||
|
result.z = leftOpr.z * rightOpr.z;
|
||||||
|
result.w = leftOpr.w * rightOpr.w;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
__kernel void pyrUp_C4_D0(__global uchar4* src,__global uchar4* dst,
|
||||||
|
int srcRows,int dstRows,int srcCols,int dstCols,
|
||||||
|
int srcOffset,int dstOffset,int srcStep,int dstStep)
|
||||||
|
{
|
||||||
|
const int x = get_global_id(0);
|
||||||
|
const int y = get_global_id(1);
|
||||||
|
|
||||||
|
__local float4 s_srcPatch[10][10];
|
||||||
|
__local float4 s_dstPatch[20][16];
|
||||||
|
|
||||||
|
srcOffset >>= 2;
|
||||||
|
dstOffset >>= 2;
|
||||||
|
srcStep >>= 2;
|
||||||
|
dstStep >>= 2;
|
||||||
|
|
||||||
|
|
||||||
|
if( get_local_id(0) < 10 && get_local_id(1) < 10 )
|
||||||
|
{
|
||||||
|
int srcx = (int)(get_group_id(0) * get_local_size(0) / 2 + get_local_id(0)) - 1;
|
||||||
|
int srcy = (int)(get_group_id(1) * get_local_size(1) / 2 + get_local_id(1)) - 1;
|
||||||
|
|
||||||
|
srcx = abs(srcx);
|
||||||
|
srcx = min(srcCols - 1,srcx);
|
||||||
|
|
||||||
|
srcy = abs(srcy);
|
||||||
|
srcy = min(srcRows -1 ,srcy);
|
||||||
|
|
||||||
|
s_srcPatch[get_local_id(1)][get_local_id(0)] = covert_uchar4_to_float4(src[srcx + srcy * srcStep]);
|
||||||
|
}
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
float4 sum = (float4)(0,0,0,0);
|
||||||
|
|
||||||
|
const int evenFlag = (int)((get_local_id(0) & 1) == 0);
|
||||||
|
const int oddFlag = (int)((get_local_id(0) & 1) != 0);
|
||||||
|
const bool eveny = ((get_local_id(1) & 1) == 0);
|
||||||
|
const int tidx = get_local_id(0);
|
||||||
|
|
||||||
|
float4 co1 = (float4)(0.375f, 0.375f, 0.375f, 0.375f);
|
||||||
|
float4 co2 = (float4)(0.25f, 0.25f, 0.25f, 0.25f);
|
||||||
|
float4 co3 = (float4)(0.0625f, 0.0625f, 0.0625f, 0.0625f);
|
||||||
|
|
||||||
|
|
||||||
|
if(eveny)
|
||||||
|
{
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( evenFlag, co3 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 2) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( evenFlag, co1 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx ) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( evenFlag, co3 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 2) >> 1)]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
s_dstPatch[2 + get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
|
||||||
|
if (get_local_id(1) < 2)
|
||||||
|
{
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
if (eveny)
|
||||||
|
{
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[0][1 + ((tidx - 2) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[0][1 + ((tidx - 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co1 ) , s_srcPatch[0][1 + ((tidx ) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[0][1 + ((tidx + 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[0][1 + ((tidx + 2) >> 1)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
s_dstPatch[get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (get_local_id(1) > 13)
|
||||||
|
{
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
if (eveny)
|
||||||
|
{
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[9][1 + ((tidx - 2) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2) , s_srcPatch[9][1 + ((tidx - 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co1) , s_srcPatch[9][1 + ((tidx ) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2) , s_srcPatch[9][1 + ((tidx + 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[9][1 + ((tidx + 2) >> 1)]);
|
||||||
|
|
||||||
|
}
|
||||||
|
s_dstPatch[4 + get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
const int tidy = get_local_id(1);
|
||||||
|
|
||||||
|
sum = sum + float4_x_float4(co3 , s_dstPatch[2 + tidy - 2][get_local_id(0)]);
|
||||||
|
sum = sum + float4_x_float4(co2 , s_dstPatch[2 + tidy - 1][get_local_id(0)]);
|
||||||
|
sum = sum + float4_x_float4(co1 , s_dstPatch[2 + tidy ][get_local_id(0)]);
|
||||||
|
sum = sum + float4_x_float4(co2 , s_dstPatch[2 + tidy + 1][get_local_id(0)]);
|
||||||
|
sum = sum + float4_x_float4(co3 , s_dstPatch[2 + tidy + 2][get_local_id(0)]);
|
||||||
|
|
||||||
|
if ((x < dstCols) && (y < dstRows))
|
||||||
|
{
|
||||||
|
dst[x + y * dstStep] = convert_float4_to_uchar4(int_x_float4(4.0f,sum));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
////////////////////////// CV_16UC4 //////////////////////////////////
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
float4 covert_ushort4_to_float4(ushort4 data)
|
||||||
|
{
|
||||||
|
float4 f4Data = {0,0,0,0};
|
||||||
|
|
||||||
|
f4Data.x = (float)data.x;
|
||||||
|
f4Data.y = (float)data.y;
|
||||||
|
f4Data.z = (float)data.z;
|
||||||
|
f4Data.w = (float)data.w;
|
||||||
|
|
||||||
|
return f4Data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ushort4 convert_float4_to_ushort4(float4 data)
|
||||||
|
{
|
||||||
|
ushort4 u4Data;
|
||||||
|
|
||||||
|
u4Data.x = (float)data.x;
|
||||||
|
u4Data.y = (float)data.y;
|
||||||
|
u4Data.z = (float)data.z;
|
||||||
|
u4Data.w = (float)data.w;
|
||||||
|
|
||||||
|
return u4Data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
__kernel void pyrUp_C4_D2(__global ushort4* src,__global ushort4* dst,
|
||||||
|
int srcRows,int dstRows,int srcCols,int dstCols,
|
||||||
|
int srcOffset,int dstOffset,int srcStep,int dstStep)
|
||||||
|
{
|
||||||
|
const int x = get_global_id(0);
|
||||||
|
const int y = get_global_id(1);
|
||||||
|
|
||||||
|
__local float4 s_srcPatch[10][10];
|
||||||
|
__local float4 s_dstPatch[20][16];
|
||||||
|
|
||||||
|
srcOffset >>= 3;
|
||||||
|
dstOffset >>= 3;
|
||||||
|
srcStep >>= 3;
|
||||||
|
dstStep >>= 3;
|
||||||
|
|
||||||
|
|
||||||
|
if( get_local_id(0) < 10 && get_local_id(1) < 10 )
|
||||||
|
{
|
||||||
|
int srcx = (int)(get_group_id(0) * get_local_size(0) / 2 + get_local_id(0)) - 1;
|
||||||
|
int srcy = (int)(get_group_id(1) * get_local_size(1) / 2 + get_local_id(1)) - 1;
|
||||||
|
|
||||||
|
srcx = abs(srcx);
|
||||||
|
srcx = min(srcCols - 1,srcx);
|
||||||
|
|
||||||
|
srcy = abs(srcy);
|
||||||
|
srcy = min(srcRows -1 ,srcy);
|
||||||
|
|
||||||
|
s_srcPatch[get_local_id(1)][get_local_id(0)] = covert_ushort4_to_float4(src[srcx + srcy * srcStep]);
|
||||||
|
}
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
float4 sum = (float4)(0,0,0,0);
|
||||||
|
|
||||||
|
const int evenFlag = (int)((get_local_id(0) & 1) == 0);
|
||||||
|
const int oddFlag = (int)((get_local_id(0) & 1) != 0);
|
||||||
|
const bool eveny = ((get_local_id(1) & 1) == 0);
|
||||||
|
const int tidx = get_local_id(0);
|
||||||
|
|
||||||
|
float4 co1 = (float4)(0.375f, 0.375f, 0.375f, 0.375f);
|
||||||
|
float4 co2 = (float4)(0.25f, 0.25f, 0.25f, 0.25f);
|
||||||
|
float4 co3 = (float4)(0.0625f, 0.0625f, 0.0625f, 0.0625f);
|
||||||
|
|
||||||
|
|
||||||
|
if(eveny)
|
||||||
|
{
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( evenFlag, co3 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 2) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( evenFlag, co1 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx ) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( evenFlag, co3 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 2) >> 1)]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
s_dstPatch[2 + get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
|
||||||
|
if (get_local_id(1) < 2)
|
||||||
|
{
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
if (eveny)
|
||||||
|
{
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[0][1 + ((tidx - 2) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[0][1 + ((tidx - 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co1 ) , s_srcPatch[0][1 + ((tidx ) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[0][1 + ((tidx + 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[0][1 + ((tidx + 2) >> 1)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
s_dstPatch[get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (get_local_id(1) > 13)
|
||||||
|
{
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
if (eveny)
|
||||||
|
{
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[9][1 + ((tidx - 2) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2) , s_srcPatch[9][1 + ((tidx - 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co1) , s_srcPatch[9][1 + ((tidx ) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2) , s_srcPatch[9][1 + ((tidx + 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[9][1 + ((tidx + 2) >> 1)]);
|
||||||
|
|
||||||
|
}
|
||||||
|
s_dstPatch[4 + get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
const int tidy = get_local_id(1);
|
||||||
|
|
||||||
|
sum = sum + float4_x_float4(co3 , s_dstPatch[2 + tidy - 2][get_local_id(0)]);
|
||||||
|
sum = sum + float4_x_float4(co2 , s_dstPatch[2 + tidy - 1][get_local_id(0)]);
|
||||||
|
sum = sum + float4_x_float4(co1 , s_dstPatch[2 + tidy ][get_local_id(0)]);
|
||||||
|
sum = sum + float4_x_float4(co2 , s_dstPatch[2 + tidy + 1][get_local_id(0)]);
|
||||||
|
sum = sum + float4_x_float4(co3 , s_dstPatch[2 + tidy + 2][get_local_id(0)]);
|
||||||
|
|
||||||
|
if ((x < dstCols) && (y < dstRows))
|
||||||
|
{
|
||||||
|
dst[x + y * dstStep] = convert_float4_to_ushort4(int_x_float4(4.0f,sum));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
////////////////////////// CV_32FC4 //////////////////////////////////
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
__kernel void pyrUp_C4_D5(__global float4* src,__global float4* dst,
|
||||||
|
int srcRows,int dstRows,int srcCols,int dstCols,
|
||||||
|
int srcOffset,int dstOffset,int srcStep,int dstStep)
|
||||||
|
{
|
||||||
|
const int x = get_global_id(0);
|
||||||
|
const int y = get_global_id(1);
|
||||||
|
|
||||||
|
__local float4 s_srcPatch[10][10];
|
||||||
|
__local float4 s_dstPatch[20][16];
|
||||||
|
|
||||||
|
srcOffset >>= 4;
|
||||||
|
dstOffset >>= 4;
|
||||||
|
srcStep >>= 4;
|
||||||
|
dstStep >>= 4;
|
||||||
|
|
||||||
|
|
||||||
|
if( get_local_id(0) < 10 && get_local_id(1) < 10 )
|
||||||
|
{
|
||||||
|
int srcx = (int)(get_group_id(0) * get_local_size(0) / 2 + get_local_id(0)) - 1;
|
||||||
|
int srcy = (int)(get_group_id(1) * get_local_size(1) / 2 + get_local_id(1)) - 1;
|
||||||
|
|
||||||
|
srcx = abs(srcx);
|
||||||
|
srcx = min(srcCols - 1,srcx);
|
||||||
|
|
||||||
|
srcy = abs(srcy);
|
||||||
|
srcy = min(srcRows -1 ,srcy);
|
||||||
|
|
||||||
|
s_srcPatch[get_local_id(1)][get_local_id(0)] = (float4)(src[srcx + srcy * srcStep]);
|
||||||
|
}
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
float4 sum = (float4)(0,0,0,0);
|
||||||
|
|
||||||
|
const int evenFlag = (int)((get_local_id(0) & 1) == 0);
|
||||||
|
const int oddFlag = (int)((get_local_id(0) & 1) != 0);
|
||||||
|
const bool eveny = ((get_local_id(1) & 1) == 0);
|
||||||
|
const int tidx = get_local_id(0);
|
||||||
|
|
||||||
|
float4 co1 = (float4)(0.375f, 0.375f, 0.375f, 0.375f);
|
||||||
|
float4 co2 = (float4)(0.25f, 0.25f, 0.25f, 0.25f);
|
||||||
|
float4 co3 = (float4)(0.0625f, 0.0625f, 0.0625f, 0.0625f);
|
||||||
|
|
||||||
|
|
||||||
|
if(eveny)
|
||||||
|
{
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( evenFlag, co3 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 2) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( evenFlag, co1 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx ) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( evenFlag, co3 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 2) >> 1)]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
s_dstPatch[2 + get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
|
||||||
|
if (get_local_id(1) < 2)
|
||||||
|
{
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
if (eveny)
|
||||||
|
{
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[0][1 + ((tidx - 2) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[0][1 + ((tidx - 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co1 ) , s_srcPatch[0][1 + ((tidx ) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[0][1 + ((tidx + 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[0][1 + ((tidx + 2) >> 1)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
s_dstPatch[get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (get_local_id(1) > 13)
|
||||||
|
{
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
if (eveny)
|
||||||
|
{
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[9][1 + ((tidx - 2) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2) , s_srcPatch[9][1 + ((tidx - 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co1) , s_srcPatch[9][1 + ((tidx ) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4( oddFlag , co2) , s_srcPatch[9][1 + ((tidx + 1) >> 1)]);
|
||||||
|
sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[9][1 + ((tidx + 2) >> 1)]);
|
||||||
|
|
||||||
|
}
|
||||||
|
s_dstPatch[4 + get_local_id(1)][get_local_id(0)] = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
|
||||||
|
const int tidy = get_local_id(1);
|
||||||
|
|
||||||
|
sum = sum + float4_x_float4(co3 , s_dstPatch[2 + tidy - 2][get_local_id(0)]);
|
||||||
|
sum = sum + float4_x_float4(co2 , s_dstPatch[2 + tidy - 1][get_local_id(0)]);
|
||||||
|
sum = sum + float4_x_float4(co1 , s_dstPatch[2 + tidy ][get_local_id(0)]);
|
||||||
|
sum = sum + float4_x_float4(co2 , s_dstPatch[2 + tidy + 1][get_local_id(0)]);
|
||||||
|
sum = sum + float4_x_float4(co3 , s_dstPatch[2 + tidy + 2][get_local_id(0)]);
|
||||||
|
|
||||||
|
if ((x < dstCols) && (y < dstRows))
|
||||||
|
{
|
||||||
|
dst[x + y * dstStep] = 4.0f * sum;
|
||||||
|
}
|
||||||
|
}
|
560
modules/ocl/src/match_template.cpp
Normal file
560
modules/ocl/src/match_template.cpp
Normal file
@ -0,0 +1,560 @@
|
|||||||
|
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||||
|
//
|
||||||
|
// By downloading, copying, installing or using the software you agree to this license.
|
||||||
|
// If you do not agree to this license, do not download, install,
|
||||||
|
// copy or use the software.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// License Agreement
|
||||||
|
// For Open Source Computer Vision Library
|
||||||
|
//
|
||||||
|
// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
|
||||||
|
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
|
||||||
|
// Third party copyrights are property of their respective owners.
|
||||||
|
//
|
||||||
|
// @Authors
|
||||||
|
// Peng Xiao, pengxiao@multicorewareinc.com
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
// are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistribution's of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other oclMaterials provided with the distribution.
|
||||||
|
//
|
||||||
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
|
// derived from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// This software is provided by the copyright holders and contributors as is and
|
||||||
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
|
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||||
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
|
// indirect, incidental, special, exemplary, or consequential damages
|
||||||
|
// (including, but not limited to, procurement of substitute goods or services;
|
||||||
|
// loss of use, data, or profits; or business interruption) however caused
|
||||||
|
// and on any theory of liability, whether in contract, strict liability,
|
||||||
|
// or tort (including negligence or otherwise) arising in any way out of
|
||||||
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
|
//
|
||||||
|
//M*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <iomanip>
|
||||||
|
#include "precomp.hpp"
|
||||||
|
|
||||||
|
using namespace cv;
|
||||||
|
using namespace cv::ocl;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#define EXT_FP64 0
|
||||||
|
|
||||||
|
#if !defined (HAVE_OPENCL)
|
||||||
|
void cv::ocl::matchTemplate(const oclMat&, const oclMat&, oclMat&) { throw_nogpu(); }
|
||||||
|
#else
|
||||||
|
//helper routines
|
||||||
|
namespace cv
|
||||||
|
{
|
||||||
|
namespace ocl
|
||||||
|
{
|
||||||
|
///////////////////////////OpenCL kernel strings///////////////////////////
|
||||||
|
extern const char *match_template;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace cv { namespace ocl
|
||||||
|
{
|
||||||
|
void matchTemplate_SQDIFF(
|
||||||
|
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf);
|
||||||
|
|
||||||
|
void matchTemplate_SQDIFF_NORMED(
|
||||||
|
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf);
|
||||||
|
|
||||||
|
void matchTemplate_CCORR(
|
||||||
|
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf);
|
||||||
|
|
||||||
|
void matchTemplate_CCORR_NORMED(
|
||||||
|
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf);
|
||||||
|
|
||||||
|
void matchTemplate_CCOFF(
|
||||||
|
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf);
|
||||||
|
|
||||||
|
void matchTemplate_CCOFF_NORMED(
|
||||||
|
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf);
|
||||||
|
|
||||||
|
|
||||||
|
void matchTemplateNaive_SQDIFF(
|
||||||
|
const oclMat& image, const oclMat& templ, oclMat& result, int cn);
|
||||||
|
|
||||||
|
void matchTemplateNaive_CCORR(
|
||||||
|
const oclMat& image, const oclMat& templ, oclMat& result, int cn);
|
||||||
|
|
||||||
|
// Evaluates optimal template's area threshold. If
|
||||||
|
// template's area is less than the threshold, we use naive match
|
||||||
|
// template version, otherwise FFT-based (if available)
|
||||||
|
int getTemplateThreshold(int method, int depth)
|
||||||
|
{
|
||||||
|
switch (method)
|
||||||
|
{
|
||||||
|
case CV_TM_CCORR:
|
||||||
|
if (depth == CV_32F) return 250;
|
||||||
|
if (depth == CV_8U) return 300;
|
||||||
|
break;
|
||||||
|
case CV_TM_SQDIFF:
|
||||||
|
if (depth == CV_32F) return MAXSHORT; // do naive SQDIFF for CV_32F
|
||||||
|
if (depth == CV_8U) return 300;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
CV_Error(CV_StsBadArg, "getTemplateThreshold: unsupported match template mode");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
// SQDIFF
|
||||||
|
void matchTemplate_SQDIFF(
|
||||||
|
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf)
|
||||||
|
{
|
||||||
|
result.create(image.rows - templ.rows + 1, image.cols - templ.cols + 1, CV_32F);
|
||||||
|
if (templ.size().area() < getTemplateThreshold(CV_TM_SQDIFF, image.depth()))
|
||||||
|
{
|
||||||
|
matchTemplateNaive_SQDIFF(image, templ, result, image.channels());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
CV_Error(CV_StsBadArg, "Not supported yet for this size template");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void matchTemplate_SQDIFF_NORMED(
|
||||||
|
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf)
|
||||||
|
{
|
||||||
|
matchTemplate_CCORR(image,templ,result,buf);
|
||||||
|
buf.image_sums.resize(1);
|
||||||
|
buf.image_sqsums.resize(1);
|
||||||
|
|
||||||
|
integral(image.reshape(1), buf.image_sums[0], buf.image_sqsums[0]);
|
||||||
|
|
||||||
|
#if EXT_FP64 && SQRSUM_FIXED
|
||||||
|
unsigned long long templ_sqsum = (unsigned long long)sqrSum(templ.reshape(1))[0];
|
||||||
|
#else
|
||||||
|
Mat sqr_mat = templ.reshape(1);
|
||||||
|
unsigned long long templ_sqsum = (unsigned long long)sum(sqr_mat.mul(sqr_mat))[0];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Context *clCxt = image.clCxt;
|
||||||
|
string kernelName = "matchTemplate_Prepared_SQDIFF_NORMED";
|
||||||
|
vector< pair<size_t, const void *> > args;
|
||||||
|
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data));
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data));
|
||||||
|
args.push_back( make_pair( sizeof(cl_ulong), (void *)&templ_sqsum));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.step));
|
||||||
|
|
||||||
|
size_t globalThreads[3] = {result.cols, result.rows, 1};
|
||||||
|
size_t localThreads[3] = {32, 8, 1};
|
||||||
|
openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, 1, CV_8U);
|
||||||
|
}
|
||||||
|
|
||||||
|
void matchTemplateNaive_SQDIFF(
|
||||||
|
const oclMat& image, const oclMat& templ, oclMat& result, int cn)
|
||||||
|
{
|
||||||
|
CV_Assert((image.depth() == CV_8U && templ.depth() == CV_8U )
|
||||||
|
|| (image.depth() == CV_32F && templ.depth() == CV_32F) && result.depth() == CV_32F);
|
||||||
|
CV_Assert(image.channels() == templ.channels() && (image.channels() == 1 || image.channels() == 4) && result.channels() == 1);
|
||||||
|
CV_Assert(result.rows == image.rows - templ.rows + 1 && result.cols == image.cols - templ.cols + 1);
|
||||||
|
|
||||||
|
Context *clCxt = image.clCxt;
|
||||||
|
string kernelName = "matchTemplate_Naive_SQDIFF";
|
||||||
|
|
||||||
|
vector< pair<size_t, const void *> > args;
|
||||||
|
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&image.data));
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&templ.data));
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&image.rows));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&image.cols));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&image.offset));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&templ.offset));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&image.step));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&templ.step));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.step));
|
||||||
|
|
||||||
|
size_t globalThreads[3] = {result.cols, result.rows, 1};
|
||||||
|
size_t localThreads[3] = {32, 8, 1};
|
||||||
|
openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.channels(), image.depth());
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
// CCORR
|
||||||
|
void matchTemplate_CCORR(
|
||||||
|
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf)
|
||||||
|
{
|
||||||
|
result.create(image.rows - templ.rows + 1, image.cols - templ.cols + 1, CV_32F);
|
||||||
|
if (templ.size().area() < getTemplateThreshold(CV_TM_SQDIFF, image.depth()))
|
||||||
|
{
|
||||||
|
matchTemplateNaive_CCORR(image, templ, result, image.channels());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CV_Error(CV_StsBadArg, "Not supported yet for this size template");
|
||||||
|
if(image.depth() == CV_8U && templ.depth() == CV_8U)
|
||||||
|
{
|
||||||
|
image.convertTo(buf.imagef, CV_32F);
|
||||||
|
templ.convertTo(buf.templf, CV_32F);
|
||||||
|
}
|
||||||
|
CV_Assert(image.channels() == 1);
|
||||||
|
oclMat o_result(image.size(), CV_MAKETYPE(CV_32F, image.channels()));
|
||||||
|
filter2D(buf.imagef,o_result,CV_32F,buf.templf, Point(0,0));
|
||||||
|
result = o_result(Rect(0,0,image.rows - templ.rows + 1, image.cols - templ.cols + 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void matchTemplate_CCORR_NORMED(
|
||||||
|
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf)
|
||||||
|
{
|
||||||
|
matchTemplate_CCORR(image,templ,result,buf);
|
||||||
|
buf.image_sums.resize(1);
|
||||||
|
buf.image_sqsums.resize(1);
|
||||||
|
|
||||||
|
integral(image.reshape(1), buf.image_sums[0], buf.image_sqsums[0]);
|
||||||
|
#if EXT_FP64 && SQRSUM_FIXED
|
||||||
|
unsigned long long templ_sqsum = (unsigned long long)sqrSum(templ.reshape(1))[0];
|
||||||
|
#elif EXT_FP64
|
||||||
|
oclMat templ_c1 = templ.reshape(1);
|
||||||
|
multiply(templ_c1, templ_c1, templ_c1);
|
||||||
|
unsigned long long templ_sqsum = (unsigned long long)sum(templ_c1)[0];
|
||||||
|
#else
|
||||||
|
Mat m_templ_c1 = templ.reshape(1);
|
||||||
|
multiply(m_templ_c1, m_templ_c1, m_templ_c1);
|
||||||
|
unsigned long long templ_sqsum = (unsigned long long)sum(m_templ_c1)[0];
|
||||||
|
#endif
|
||||||
|
Context *clCxt = image.clCxt;
|
||||||
|
string kernelName = "normalizeKernel";
|
||||||
|
vector< pair<size_t, const void *> > args;
|
||||||
|
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[0].data));
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data));
|
||||||
|
args.push_back( make_pair( sizeof(cl_ulong), (void *)&templ_sqsum));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].offset));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].step));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.step));
|
||||||
|
|
||||||
|
size_t globalThreads[3] = {result.cols, result.rows, 1};
|
||||||
|
size_t localThreads[3] = {32, 8, 1};
|
||||||
|
openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, 1, CV_8U);
|
||||||
|
}
|
||||||
|
|
||||||
|
void matchTemplateNaive_CCORR(
|
||||||
|
const oclMat& image, const oclMat& templ, oclMat& result, int cn)
|
||||||
|
{
|
||||||
|
CV_Assert((image.depth() == CV_8U && templ.depth() == CV_8U )
|
||||||
|
|| (image.depth() == CV_32F && templ.depth() == CV_32F) && result.depth() == CV_32F);
|
||||||
|
CV_Assert(image.channels() == templ.channels() && (image.channels() == 1 || image.channels() == 4) && result.channels() == 1);
|
||||||
|
CV_Assert(result.rows == image.rows - templ.rows + 1 && result.cols == image.cols - templ.cols + 1);
|
||||||
|
|
||||||
|
Context *clCxt = image.clCxt;
|
||||||
|
string kernelName = "matchTemplate_Naive_CCORR";
|
||||||
|
|
||||||
|
vector< pair<size_t, const void *> > args;
|
||||||
|
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&image.data));
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&templ.data));
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&image.rows));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&image.cols));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&image.offset));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&templ.offset));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&image.step));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&templ.step));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.step));
|
||||||
|
|
||||||
|
size_t globalThreads[3] = {result.cols, result.rows, 1};
|
||||||
|
size_t localThreads[3] = {32, 8, 1};
|
||||||
|
openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.channels(), image.depth());
|
||||||
|
}
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
// CCOFF
|
||||||
|
void matchTemplate_CCOFF(
|
||||||
|
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf)
|
||||||
|
{
|
||||||
|
CV_Assert(image.depth() == CV_8U && templ.depth() == CV_8U);
|
||||||
|
|
||||||
|
matchTemplate_CCORR(image,templ,result,buf);
|
||||||
|
|
||||||
|
Context *clCxt = image.clCxt;
|
||||||
|
string kernelName;
|
||||||
|
|
||||||
|
kernelName = "matchTemplate_Prepared_CCOFF";
|
||||||
|
size_t globalThreads[3] = {result.cols, result.rows, 1};
|
||||||
|
size_t localThreads[3] = {32, 8, 1};
|
||||||
|
|
||||||
|
vector< pair<size_t, const void *> > args;
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&image.rows) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&image.cols) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.step));
|
||||||
|
// to be continued in the following section
|
||||||
|
if(image.channels() == 1)
|
||||||
|
{
|
||||||
|
buf.image_sums.resize(1);
|
||||||
|
// FIXME: temp fix for incorrect integral kernel
|
||||||
|
oclMat tmp_oclmat;
|
||||||
|
integral(image, buf.image_sums[0], tmp_oclmat);
|
||||||
|
|
||||||
|
float templ_sum = 0;
|
||||||
|
#if EXT_FP64
|
||||||
|
templ_sum = (float)sum(templ)[0] / templ.size().area();
|
||||||
|
#else
|
||||||
|
Mat o_templ = templ;
|
||||||
|
templ_sum = (float)sum(o_templ)[0] / o_templ.size().area(); // temp fix for non-double supported machine
|
||||||
|
#endif
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Vec4f templ_sum = Vec4f::all(0);
|
||||||
|
#if EXT_FP64
|
||||||
|
split(image,buf.images);
|
||||||
|
templ_sum = sum(templ) / templ.size().area();
|
||||||
|
#else
|
||||||
|
// temp fix for non-double supported machine
|
||||||
|
Mat o_templ = templ, o_image = image;
|
||||||
|
vector<Mat> o_mat_vector;
|
||||||
|
o_mat_vector.resize(image.channels());
|
||||||
|
buf.images.resize(image.channels());
|
||||||
|
split(o_image, o_mat_vector);
|
||||||
|
for(int i = 0; i < o_mat_vector.size(); i ++)
|
||||||
|
{
|
||||||
|
buf.images[i] = oclMat(o_mat_vector[i]);
|
||||||
|
}
|
||||||
|
templ_sum = sum(o_templ) / templ.size().area();
|
||||||
|
#endif
|
||||||
|
buf.image_sums.resize(buf.images.size());
|
||||||
|
|
||||||
|
for(int i = 0; i < image.channels(); i ++)
|
||||||
|
{
|
||||||
|
// FIXME: temp fix for incorrect integral kernel
|
||||||
|
oclMat omat_temp;
|
||||||
|
integral(buf.images[i], buf.image_sums[i], omat_temp);
|
||||||
|
}
|
||||||
|
switch(image.channels())
|
||||||
|
{
|
||||||
|
case 4:
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[1].data) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[2].data) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[3].data) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[0]) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[1]) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[2]) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[3]) );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
CV_Error(CV_StsBadArg, "matchTemplate: unsupported number of channels");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.channels(), image.depth());
|
||||||
|
}
|
||||||
|
|
||||||
|
void matchTemplate_CCOFF_NORMED(
|
||||||
|
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf)
|
||||||
|
{
|
||||||
|
image.convertTo(buf.imagef, CV_32F);
|
||||||
|
templ.convertTo(buf.templf, CV_32F);
|
||||||
|
|
||||||
|
matchTemplate_CCORR(buf.imagef, buf.templf, result, buf);
|
||||||
|
float scale = 1.f/templ.size().area();
|
||||||
|
|
||||||
|
Context *clCxt = image.clCxt;
|
||||||
|
string kernelName;
|
||||||
|
|
||||||
|
kernelName = "matchTemplate_Prepared_CCOFF_NORMED";
|
||||||
|
size_t globalThreads[3] = {result.cols, result.rows, 1};
|
||||||
|
size_t localThreads[3] = {32, 8, 1};
|
||||||
|
|
||||||
|
vector< pair<size_t, const void *> > args;
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&image.rows) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&image.cols) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset));
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&result.step));
|
||||||
|
args.push_back( make_pair( sizeof(cl_float),(void *)&scale) );
|
||||||
|
// to be continued in the following section
|
||||||
|
if(image.channels() == 1)
|
||||||
|
{
|
||||||
|
buf.image_sums.resize(1);
|
||||||
|
buf.image_sqsums.resize(1);
|
||||||
|
integral(image, buf.image_sums[0], buf.image_sqsums[0]);
|
||||||
|
float templ_sum = 0;
|
||||||
|
float templ_sqsum = 0;
|
||||||
|
#if EXT_FP64
|
||||||
|
templ_sum = (float)sum(templ)[0];
|
||||||
|
#if SQRSUM_FIXED
|
||||||
|
templ_sqsum = sqrSum(templ);
|
||||||
|
#else
|
||||||
|
oclMat templ_sqr = templ;
|
||||||
|
multiply(templ,templ, templ_sqr);
|
||||||
|
templ_sqsum = sum(templ_sqr)[0];
|
||||||
|
#endif //SQRSUM_FIXED
|
||||||
|
templ_sqsum -= scale * templ_sum * templ_sum;
|
||||||
|
templ_sum *= scale;
|
||||||
|
#else
|
||||||
|
// temp fix for non-double supported machine
|
||||||
|
Mat o_templ = templ;
|
||||||
|
templ_sum = (float)sum(o_templ)[0];
|
||||||
|
templ_sqsum = sum(o_templ.mul(o_templ))[0] - scale * templ_sum * templ_sum;
|
||||||
|
templ_sum *= scale;
|
||||||
|
#endif
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[0].data) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].offset) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].step) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sqsum) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Vec4f templ_sum = Vec4f::all(0);
|
||||||
|
Vec4f templ_sqsum = Vec4f::all(0);
|
||||||
|
#if EXT_FP64
|
||||||
|
split(image,buf.images);
|
||||||
|
templ_sum = sum(templ);
|
||||||
|
#if SQRSUM_FIXED
|
||||||
|
templ_sqsum = sqrSum(templ);
|
||||||
|
#else
|
||||||
|
oclMat templ_sqr = templ;
|
||||||
|
multiply(templ,templ, templ_sqr);
|
||||||
|
templ_sqsum = sum(templ_sqr);
|
||||||
|
#endif //SQRSUM_FIXED
|
||||||
|
templ_sqsum -= scale * templ_sum * templ_sum;
|
||||||
|
|
||||||
|
#else
|
||||||
|
// temp fix for non-double supported machine
|
||||||
|
Mat o_templ = templ, o_image = image;
|
||||||
|
|
||||||
|
vector<Mat> o_mat_vector;
|
||||||
|
o_mat_vector.resize(image.channels());
|
||||||
|
buf.images.resize(image.channels());
|
||||||
|
split(o_image, o_mat_vector);
|
||||||
|
for(int i = 0; i < o_mat_vector.size(); i ++)
|
||||||
|
{
|
||||||
|
buf.images[i] = oclMat(o_mat_vector[i]);
|
||||||
|
}
|
||||||
|
templ_sum = sum(o_templ);
|
||||||
|
templ_sqsum = sum(o_templ.mul(o_templ));
|
||||||
|
#endif
|
||||||
|
float templ_sqsum_sum = 0;
|
||||||
|
for(int i = 0; i < image.channels(); i ++)
|
||||||
|
{
|
||||||
|
templ_sqsum_sum += templ_sqsum[i] - scale * templ_sum[i] * templ_sum[i];
|
||||||
|
}
|
||||||
|
templ_sum *= scale;
|
||||||
|
buf.image_sums.resize(buf.images.size());
|
||||||
|
buf.image_sqsums.resize(buf.images.size());
|
||||||
|
|
||||||
|
for(int i = 0; i < image.channels(); i ++)
|
||||||
|
{
|
||||||
|
integral(buf.images[i], buf.image_sums[i], buf.image_sqsums[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(image.channels())
|
||||||
|
{
|
||||||
|
case 4:
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[1].data) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[2].data) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[3].data) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[0].data) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[1].data) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[2].data) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[3].data) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].offset) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].step) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[0]) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[1]) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[2]) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[3]) );
|
||||||
|
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sqsum_sum) );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
CV_Error(CV_StsBadArg, "matchTemplate: unsupported number of channels");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.channels(), image.depth());
|
||||||
|
}
|
||||||
|
|
||||||
|
}/*ocl*/} /*cv*/
|
||||||
|
|
||||||
|
void cv::ocl::matchTemplate(const oclMat& image, const oclMat& templ, oclMat& result, int method)
|
||||||
|
{
|
||||||
|
MatchTemplateBuf buf;
|
||||||
|
matchTemplate(image,templ, result, method,buf);
|
||||||
|
}
|
||||||
|
void cv::ocl::matchTemplate(const oclMat& image, const oclMat& templ, oclMat& result, int method, MatchTemplateBuf& buf)
|
||||||
|
{
|
||||||
|
CV_Assert(image.type() == templ.type());
|
||||||
|
CV_Assert(image.cols >= templ.cols && image.rows >= templ.rows);
|
||||||
|
|
||||||
|
typedef void (*Caller)(const oclMat&, const oclMat&, oclMat&, MatchTemplateBuf&);
|
||||||
|
|
||||||
|
const Caller callers[] = {
|
||||||
|
::matchTemplate_SQDIFF, ::matchTemplate_SQDIFF_NORMED,
|
||||||
|
::matchTemplate_CCORR, ::matchTemplate_CCORR_NORMED,
|
||||||
|
::matchTemplate_CCOFF, ::matchTemplate_CCOFF_NORMED
|
||||||
|
};
|
||||||
|
|
||||||
|
Caller caller = callers[method];
|
||||||
|
CV_Assert(caller);
|
||||||
|
caller(image, templ, result, buf);
|
||||||
|
}
|
||||||
|
#endif //
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user