mirror of
https://github.com/opencv/opencv.git
synced 2025-06-10 11:03:03 +08:00
Merge branch '2.4'
This commit is contained in:
commit
67073daf19
25
3rdparty/tbb/CMakeLists.txt
vendored
25
3rdparty/tbb/CMakeLists.txt
vendored
@ -122,15 +122,32 @@ file(GLOB lib_srcs "${tbb_src_dir}/src/tbb/*.cpp")
|
|||||||
file(GLOB lib_hdrs "${tbb_src_dir}/src/tbb/*.h")
|
file(GLOB lib_hdrs "${tbb_src_dir}/src/tbb/*.h")
|
||||||
list(APPEND lib_srcs "${tbb_src_dir}/src/rml/client/rml_tbb.cpp")
|
list(APPEND lib_srcs "${tbb_src_dir}/src/rml/client/rml_tbb.cpp")
|
||||||
|
|
||||||
add_definitions(-D__TBB_DYNAMIC_LOAD_ENABLED=0 #required
|
if (WIN32)
|
||||||
|
add_definitions(-D__TBB_DYNAMIC_LOAD_ENABLED=0
|
||||||
|
-D__TBB_BUILD=1
|
||||||
|
-D_UNICODE
|
||||||
|
-DUNICODE
|
||||||
|
-DWINAPI_FAMILY=WINAPI_FAMILY_APP
|
||||||
|
-DDO_ITT_NOTIFY=0
|
||||||
|
) # defines were copied from windows.cl.inc
|
||||||
|
set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} /APPCONTAINER")
|
||||||
|
else()
|
||||||
|
add_definitions(-D__TBB_DYNAMIC_LOAD_ENABLED=0 #required
|
||||||
-D__TBB_BUILD=1 #required
|
-D__TBB_BUILD=1 #required
|
||||||
-D__TBB_SURVIVE_THREAD_SWITCH=0 #no cilk support
|
-D__TBB_SURVIVE_THREAD_SWITCH=0 #no cilk support
|
||||||
-DUSE_PTHREAD #required for Unix
|
|
||||||
-DTBB_USE_GCC_BUILTINS=1 #required for ARM GCC
|
|
||||||
-DTBB_USE_DEBUG=0 #just to be sure
|
-DTBB_USE_DEBUG=0 #just to be sure
|
||||||
-DTBB_NO_LEGACY=1 #don't need backward compatibility
|
-DTBB_NO_LEGACY=1 #don't need backward compatibility
|
||||||
-DDO_ITT_NOTIFY=0 #it seems that we don't need these notifications
|
-DDO_ITT_NOTIFY=0 #it seems that we don't need these notifications
|
||||||
)
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (HAVE_LIBPTHREAD)
|
||||||
|
add_definitions(-DUSE_PTHREAD) #required for Unix
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (CMAKE_COMPILER_IS_GNUCXX)
|
||||||
|
add_definitions(-DTBB_USE_GCC_BUILTINS=1) #required for ARM GCC
|
||||||
|
endif()
|
||||||
|
|
||||||
if(ANDROID_COMPILER_IS_CLANG)
|
if(ANDROID_COMPILER_IS_CLANG)
|
||||||
add_definitions(-D__TBB_GCC_BUILTIN_ATOMICS_PRESENT=1)
|
add_definitions(-D__TBB_GCC_BUILTIN_ATOMICS_PRESENT=1)
|
||||||
@ -145,7 +162,7 @@ endif()
|
|||||||
|
|
||||||
set(TBB_SOURCE_FILES ${lib_srcs} ${lib_hdrs})
|
set(TBB_SOURCE_FILES ${lib_srcs} ${lib_hdrs})
|
||||||
|
|
||||||
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm")
|
if (ARM AND NOT WIN32)
|
||||||
if (NOT ANDROID)
|
if (NOT ANDROID)
|
||||||
set(TBB_SOURCE_FILES ${TBB_SOURCE_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/arm_linux_stub.cpp")
|
set(TBB_SOURCE_FILES ${TBB_SOURCE_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/arm_linux_stub.cpp")
|
||||||
endif()
|
endif()
|
||||||
|
@ -118,6 +118,7 @@ OCV_OPTION(WITH_CUFFT "Include NVidia Cuda Fast Fourier Transform (FFT)
|
|||||||
OCV_OPTION(WITH_CUBLAS "Include NVidia Cuda Basic Linear Algebra Subprograms (BLAS) library support" OFF IF (CMAKE_VERSION VERSION_GREATER "2.8" AND NOT ANDROID AND NOT IOS) )
|
OCV_OPTION(WITH_CUBLAS "Include NVidia Cuda Basic Linear Algebra Subprograms (BLAS) library support" OFF IF (CMAKE_VERSION VERSION_GREATER "2.8" AND NOT ANDROID AND NOT IOS) )
|
||||||
OCV_OPTION(WITH_NVCUVID "Include NVidia Video Decoding library support" OFF IF (CMAKE_VERSION VERSION_GREATER "2.8" AND NOT ANDROID AND NOT IOS AND NOT APPLE) )
|
OCV_OPTION(WITH_NVCUVID "Include NVidia Video Decoding library support" OFF IF (CMAKE_VERSION VERSION_GREATER "2.8" AND NOT ANDROID AND NOT IOS AND NOT APPLE) )
|
||||||
OCV_OPTION(WITH_EIGEN "Include Eigen2/Eigen3 support" ON)
|
OCV_OPTION(WITH_EIGEN "Include Eigen2/Eigen3 support" ON)
|
||||||
|
OCV_OPTION(WITH_VFW "Include Video for Windows support" ON IF WIN32 )
|
||||||
OCV_OPTION(WITH_FFMPEG "Include FFMPEG support" ON IF (NOT ANDROID AND NOT IOS))
|
OCV_OPTION(WITH_FFMPEG "Include FFMPEG support" ON IF (NOT ANDROID AND NOT IOS))
|
||||||
OCV_OPTION(WITH_GSTREAMER "Include Gstreamer support" ON IF (UNIX AND NOT APPLE AND NOT ANDROID) )
|
OCV_OPTION(WITH_GSTREAMER "Include Gstreamer support" ON IF (UNIX AND NOT APPLE AND NOT ANDROID) )
|
||||||
OCV_OPTION(WITH_GSTREAMER_1_X "Include Gstreamer 1.x support" OFF)
|
OCV_OPTION(WITH_GSTREAMER_1_X "Include Gstreamer 1.x support" OFF)
|
||||||
@ -133,13 +134,15 @@ OCV_OPTION(WITH_PNG "Include PNG support" ON)
|
|||||||
OCV_OPTION(WITH_PVAPI "Include Prosilica GigE support" ON IF (NOT ANDROID AND NOT IOS) )
|
OCV_OPTION(WITH_PVAPI "Include Prosilica GigE support" ON IF (NOT ANDROID AND NOT IOS) )
|
||||||
OCV_OPTION(WITH_GIGEAPI "Include Smartek GigE support" ON IF (NOT ANDROID AND NOT IOS) )
|
OCV_OPTION(WITH_GIGEAPI "Include Smartek GigE support" ON IF (NOT ANDROID AND NOT IOS) )
|
||||||
OCV_OPTION(WITH_QT "Build with Qt Backend support" OFF IF (NOT ANDROID AND NOT IOS) )
|
OCV_OPTION(WITH_QT "Build with Qt Backend support" OFF IF (NOT ANDROID AND NOT IOS) )
|
||||||
|
OCV_OPTION(WITH_WIN32UI "Build with Win32 UI Backend support" ON IF WIN32 )
|
||||||
OCV_OPTION(WITH_QUICKTIME "Use QuickTime for Video I/O insted of QTKit" OFF IF APPLE )
|
OCV_OPTION(WITH_QUICKTIME "Use QuickTime for Video I/O insted of QTKit" OFF IF APPLE )
|
||||||
OCV_OPTION(WITH_TBB "Include Intel TBB support" OFF IF (NOT IOS) )
|
OCV_OPTION(WITH_TBB "Include Intel TBB support" OFF IF (NOT IOS) )
|
||||||
OCV_OPTION(WITH_CSTRIPES "Include C= support" OFF IF WIN32 )
|
OCV_OPTION(WITH_CSTRIPES "Include C= support" OFF IF WIN32 )
|
||||||
OCV_OPTION(WITH_TIFF "Include TIFF support" ON IF (NOT IOS) )
|
OCV_OPTION(WITH_TIFF "Include TIFF support" ON IF (NOT IOS) )
|
||||||
OCV_OPTION(WITH_UNICAP "Include Unicap support (GPL)" OFF IF (UNIX AND NOT APPLE AND NOT ANDROID) )
|
OCV_OPTION(WITH_UNICAP "Include Unicap support (GPL)" OFF IF (UNIX AND NOT APPLE AND NOT ANDROID) )
|
||||||
OCV_OPTION(WITH_V4L "Include Video 4 Linux support" ON IF (UNIX AND NOT ANDROID) )
|
OCV_OPTION(WITH_V4L "Include Video 4 Linux support" ON IF (UNIX AND NOT ANDROID) )
|
||||||
OCV_OPTION(WITH_VIDEOINPUT "Build HighGUI with DirectShow support" ON IF WIN32 )
|
OCV_OPTION(WITH_DSHOW "Build HighGUI with DirectShow support" ON IF (WIN32 AND NOT ARM) )
|
||||||
|
OCV_OPTION(WITH_MSMF "Build HighGUI with Media Foundation support" OFF IF WIN32 )
|
||||||
OCV_OPTION(WITH_XIMEA "Include XIMEA cameras support" OFF IF (NOT ANDROID AND NOT APPLE) )
|
OCV_OPTION(WITH_XIMEA "Include XIMEA cameras support" OFF IF (NOT ANDROID AND NOT APPLE) )
|
||||||
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)
|
||||||
@ -171,7 +174,7 @@ OCV_OPTION(BUILD_JASPER "Build libjasper from source" WIN32 O
|
|||||||
OCV_OPTION(BUILD_JPEG "Build libjpeg from source" WIN32 OR ANDROID OR APPLE )
|
OCV_OPTION(BUILD_JPEG "Build libjpeg from source" WIN32 OR ANDROID OR APPLE )
|
||||||
OCV_OPTION(BUILD_PNG "Build libpng from source" WIN32 OR ANDROID OR APPLE )
|
OCV_OPTION(BUILD_PNG "Build libpng from source" WIN32 OR ANDROID OR APPLE )
|
||||||
OCV_OPTION(BUILD_OPENEXR "Build openexr from source" WIN32 OR ANDROID OR APPLE )
|
OCV_OPTION(BUILD_OPENEXR "Build openexr from source" WIN32 OR ANDROID OR APPLE )
|
||||||
OCV_OPTION(BUILD_TBB "Download and build TBB from source" ANDROID IF CMAKE_COMPILER_IS_GNUCXX )
|
OCV_OPTION(BUILD_TBB "Download and build TBB from source" ANDROID )
|
||||||
|
|
||||||
# OpenCV installation options
|
# OpenCV installation options
|
||||||
# ===================================================
|
# ===================================================
|
||||||
@ -600,8 +603,8 @@ else()
|
|||||||
if(DEFINED WITH_QT)
|
if(DEFINED WITH_QT)
|
||||||
status(" QT 4.x:" NO)
|
status(" QT 4.x:" NO)
|
||||||
endif()
|
endif()
|
||||||
if(WIN32)
|
if(DEFINED WITH_WIN32UI)
|
||||||
status(" Win32 UI:" YES)
|
status(" Win32 UI:" HAVE_WIN32UI THEN YES ELSE NO)
|
||||||
else()
|
else()
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
if(WITH_CARBON)
|
if(WITH_CARBON)
|
||||||
@ -665,6 +668,10 @@ endif()
|
|||||||
status("")
|
status("")
|
||||||
status(" Video I/O:")
|
status(" Video I/O:")
|
||||||
|
|
||||||
|
if (DEFINED WITH_VFW)
|
||||||
|
status(" Video for Windows:" HAVE_VFW THEN YES ELSE NO)
|
||||||
|
endif(DEFINED WITH_VFW)
|
||||||
|
|
||||||
if(DEFINED WITH_1394)
|
if(DEFINED WITH_1394)
|
||||||
status(" DC1394 1.x:" HAVE_DC1394 THEN "YES (ver ${ALIASOF_libdc1394_VERSION})" ELSE NO)
|
status(" DC1394 1.x:" HAVE_DC1394 THEN "YES (ver ${ALIASOF_libdc1394_VERSION})" ELSE NO)
|
||||||
status(" DC1394 2.x:" HAVE_DC1394_2 THEN "YES (ver ${ALIASOF_libdc1394-2_VERSION})" ELSE NO)
|
status(" DC1394 2.x:" HAVE_DC1394_2 THEN "YES (ver ${ALIASOF_libdc1394-2_VERSION})" ELSE NO)
|
||||||
@ -749,9 +756,13 @@ if(DEFINED WITH_V4L)
|
|||||||
ELSE "${HAVE_CAMV4L_STR}/${HAVE_CAMV4L2_STR}")
|
ELSE "${HAVE_CAMV4L_STR}/${HAVE_CAMV4L2_STR}")
|
||||||
endif(DEFINED WITH_V4L)
|
endif(DEFINED WITH_V4L)
|
||||||
|
|
||||||
if(DEFINED WITH_VIDEOINPUT)
|
if(DEFINED WITH_DSHOW)
|
||||||
status(" DirectShow:" HAVE_VIDEOINPUT THEN YES ELSE NO)
|
status(" DirectShow:" HAVE_DSHOW THEN YES ELSE NO)
|
||||||
endif(DEFINED WITH_VIDEOINPUT)
|
endif(DEFINED WITH_DSHOW)
|
||||||
|
|
||||||
|
if(DEFINED WITH_MSMF)
|
||||||
|
status(" Media Foundation:" HAVE_MSMF THEN YES ELSE NO)
|
||||||
|
endif(DEFINED WITH_MSMF)
|
||||||
|
|
||||||
if(DEFINED WITH_XIMEA)
|
if(DEFINED WITH_XIMEA)
|
||||||
status(" XIMEA:" HAVE_XIMEA THEN YES ELSE NO)
|
status(" XIMEA:" HAVE_XIMEA THEN YES ELSE NO)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# Copyright (c) 2010-2011, Ethan Rublee
|
# Copyright (c) 2010-2011, Ethan Rublee
|
||||||
# Copyright (c) 2011-2012, Andrey Kamaev
|
# Copyright (c) 2011-2013, Andrey Kamaev
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
@ -281,8 +281,14 @@
|
|||||||
# [+] updated for NDK r8c
|
# [+] updated for NDK r8c
|
||||||
# [+] added support for clang compiler
|
# [+] added support for clang compiler
|
||||||
# - December 2012
|
# - December 2012
|
||||||
|
# [+] suppress warning about unused CMAKE_TOOLCHAIN_FILE variable
|
||||||
|
# [+] adjust API level to closest compatible as NDK does
|
||||||
# [~] fixed ccache full path search
|
# [~] fixed ccache full path search
|
||||||
# [+] updated for NDK r8d
|
# [+] updated for NDK r8d
|
||||||
|
# [~] compiler options are aligned with NDK r8d
|
||||||
|
# - March 2013
|
||||||
|
# [+] updated for NDK r8e (x86 version)
|
||||||
|
# [+] support x86_64 version of NDK
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
cmake_minimum_required( VERSION 2.6.3 )
|
cmake_minimum_required( VERSION 2.6.3 )
|
||||||
@ -292,6 +298,10 @@ if( DEFINED CMAKE_CROSSCOMPILING )
|
|||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if( CMAKE_TOOLCHAIN_FILE )
|
||||||
|
# touch toolchain variable only to suppress "unused variable" warning
|
||||||
|
endif()
|
||||||
|
|
||||||
get_property( _CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE )
|
get_property( _CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE )
|
||||||
if( _CMAKE_IN_TRY_COMPILE )
|
if( _CMAKE_IN_TRY_COMPILE )
|
||||||
include( "${CMAKE_CURRENT_SOURCE_DIR}/../android.toolchain.config.cmake" OPTIONAL )
|
include( "${CMAKE_CURRENT_SOURCE_DIR}/../android.toolchain.config.cmake" OPTIONAL )
|
||||||
@ -305,7 +315,7 @@ set( CMAKE_SYSTEM_VERSION 1 )
|
|||||||
# rpath makes low sence for Android
|
# rpath makes low sence for Android
|
||||||
set( CMAKE_SKIP_RPATH TRUE CACHE BOOL "If set, runtime paths are not added when using shared libraries." )
|
set( CMAKE_SKIP_RPATH TRUE CACHE BOOL "If set, runtime paths are not added when using shared libraries." )
|
||||||
|
|
||||||
set( ANDROID_SUPPORTED_NDK_VERSIONS ${ANDROID_EXTRA_NDK_VERSIONS} -r8d -r8c -r8b -r8 -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5 "" )
|
set( ANDROID_SUPPORTED_NDK_VERSIONS ${ANDROID_EXTRA_NDK_VERSIONS} -r8e -r8d -r8c -r8b -r8 -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5 "" )
|
||||||
if(NOT DEFINED ANDROID_NDK_SEARCH_PATHS)
|
if(NOT DEFINED ANDROID_NDK_SEARCH_PATHS)
|
||||||
if( CMAKE_HOST_WIN32 )
|
if( CMAKE_HOST_WIN32 )
|
||||||
file( TO_CMAKE_PATH "$ENV{PROGRAMFILES}" ANDROID_NDK_SEARCH_PATHS )
|
file( TO_CMAKE_PATH "$ENV{PROGRAMFILES}" ANDROID_NDK_SEARCH_PATHS )
|
||||||
@ -449,19 +459,32 @@ if( ANDROID_FORBID_SYGWIN )
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
# detect current host platform
|
# detect current host platform
|
||||||
|
if( NOT DEFINED ANDROID_NDK_HOST_X64 AND CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|AMD64")
|
||||||
|
set( ANDROID_NDK_HOST_X64 1 CACHE BOOL "Try to use 64-bit compiler toolchain" )
|
||||||
|
mark_as_advanced( ANDROID_NDK_HOST_X64 )
|
||||||
|
endif()
|
||||||
|
|
||||||
set( TOOL_OS_SUFFIX "" )
|
set( TOOL_OS_SUFFIX "" )
|
||||||
if( CMAKE_HOST_APPLE )
|
if( CMAKE_HOST_APPLE )
|
||||||
set( ANDROID_NDK_HOST_SYSTEM_NAME "darwin-x86" )
|
set( ANDROID_NDK_HOST_SYSTEM_NAME "darwin-x86_64" )
|
||||||
|
set( ANDROID_NDK_HOST_SYSTEM_NAME2 "darwin-x86" )
|
||||||
elseif( CMAKE_HOST_WIN32 )
|
elseif( CMAKE_HOST_WIN32 )
|
||||||
set( ANDROID_NDK_HOST_SYSTEM_NAME "windows" )
|
set( ANDROID_NDK_HOST_SYSTEM_NAME "windows-x86_64" )
|
||||||
|
set( ANDROID_NDK_HOST_SYSTEM_NAME2 "windows" )
|
||||||
set( TOOL_OS_SUFFIX ".exe" )
|
set( TOOL_OS_SUFFIX ".exe" )
|
||||||
elseif( CMAKE_HOST_UNIX )
|
elseif( CMAKE_HOST_UNIX )
|
||||||
set( ANDROID_NDK_HOST_SYSTEM_NAME "linux-x86" )
|
set( ANDROID_NDK_HOST_SYSTEM_NAME "linux-x86_64" )
|
||||||
|
set( ANDROID_NDK_HOST_SYSTEM_NAME2 "linux-x86" )
|
||||||
else()
|
else()
|
||||||
message( FATAL_ERROR "Cross-compilation on your platform is not supported by this cmake toolchain" )
|
message( FATAL_ERROR "Cross-compilation on your platform is not supported by this cmake toolchain" )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if( NOT ANDROID_NDK_HOST_X64 )
|
||||||
|
set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} )
|
||||||
|
endif()
|
||||||
|
|
||||||
# see if we have path to Android NDK
|
# see if we have path to Android NDK
|
||||||
__INIT_VARIABLE( ANDROID_NDK PATH ENV_ANDROID_NDK )
|
__INIT_VARIABLE( ANDROID_NDK PATH ENV_ANDROID_NDK )
|
||||||
if( NOT ANDROID_NDK )
|
if( NOT ANDROID_NDK )
|
||||||
@ -509,7 +532,8 @@ if( ANDROID_NDK )
|
|||||||
endif()
|
endif()
|
||||||
set( ANDROID_NDK "${ANDROID_NDK}" CACHE INTERNAL "Path of the Android NDK" FORCE )
|
set( ANDROID_NDK "${ANDROID_NDK}" CACHE INTERNAL "Path of the Android NDK" FORCE )
|
||||||
set( BUILD_WITH_ANDROID_NDK True )
|
set( BUILD_WITH_ANDROID_NDK True )
|
||||||
file( STRINGS "${ANDROID_NDK}/RELEASE.TXT" ANDROID_NDK_RELEASE LIMIT_COUNT 1 REGEX r[0-9]+[a-z]? )
|
file( STRINGS "${ANDROID_NDK}/RELEASE.TXT" ANDROID_NDK_RELEASE_FULL LIMIT_COUNT 1 REGEX r[0-9]+[a-z]? )
|
||||||
|
string( REGEX MATCH r[0-9]+[a-z]? ANDROID_NDK_RELEASE "${ANDROID_NDK_RELEASE_FULL}" )
|
||||||
elseif( ANDROID_STANDALONE_TOOLCHAIN )
|
elseif( ANDROID_STANDALONE_TOOLCHAIN )
|
||||||
get_filename_component( ANDROID_STANDALONE_TOOLCHAIN "${ANDROID_STANDALONE_TOOLCHAIN}" ABSOLUTE )
|
get_filename_component( ANDROID_STANDALONE_TOOLCHAIN "${ANDROID_STANDALONE_TOOLCHAIN}" ABSOLUTE )
|
||||||
# try to detect change
|
# try to detect change
|
||||||
@ -563,22 +587,21 @@ if( BUILD_WITH_STANDALONE_TOOLCHAIN )
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
macro( __GLOB_NDK_TOOLCHAINS __availableToolchainsVar )
|
macro( __GLOB_NDK_TOOLCHAINS __availableToolchainsVar __availableToolchainsLst __host_system_name )
|
||||||
foreach( __toolchain ${${__availableToolchainsVar}} )
|
foreach( __toolchain ${${__availableToolchainsLst}} )
|
||||||
if( "${__toolchain}" MATCHES "-clang3[.][0-9]$" AND NOT EXISTS "${ANDROID_NDK}/toolchains/${__toolchain}/prebuilt/" )
|
if( "${__toolchain}" MATCHES "-clang3[.][0-9]$" AND NOT EXISTS "${ANDROID_NDK}/toolchains/${__toolchain}/prebuilt/" )
|
||||||
string( REGEX REPLACE "-clang3[.][0-9]$" "-4.6" __gcc_toolchain "${__toolchain}" )
|
string( REGEX REPLACE "-clang3[.][0-9]$" "-4.6" __gcc_toolchain "${__toolchain}" )
|
||||||
else()
|
else()
|
||||||
set( __gcc_toolchain "${__toolchain}" )
|
set( __gcc_toolchain "${__toolchain}" )
|
||||||
endif()
|
endif()
|
||||||
__DETECT_TOOLCHAIN_MACHINE_NAME( __machine "${ANDROID_NDK}/toolchains/${__gcc_toolchain}/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}" )
|
__DETECT_TOOLCHAIN_MACHINE_NAME( __machine "${ANDROID_NDK}/toolchains/${__gcc_toolchain}/prebuilt/${__host_system_name}" )
|
||||||
if( __machine )
|
if( __machine )
|
||||||
string( REGEX MATCH "[0-9]+[.][0-9]+([.][0-9]+)?$" __version "${__gcc_toolchain}" )
|
string( REGEX MATCH "[0-9]+[.][0-9]+([.][0-9]+)?$" __version "${__gcc_toolchain}" )
|
||||||
string( REGEX MATCH "^[^-]+" __arch "${__gcc_toolchain}" )
|
string( REGEX MATCH "^[^-]+" __arch "${__gcc_toolchain}" )
|
||||||
list( APPEND __availableToolchainMachines "${__machine}" )
|
list( APPEND __availableToolchainMachines "${__machine}" )
|
||||||
list( APPEND __availableToolchainArchs "${__arch}" )
|
list( APPEND __availableToolchainArchs "${__arch}" )
|
||||||
list( APPEND __availableToolchainCompilerVersions "${__version}" )
|
list( APPEND __availableToolchainCompilerVersions "${__version}" )
|
||||||
else()
|
list( APPEND ${__availableToolchainsVar} "${__toolchain}" )
|
||||||
list( REMOVE_ITEM ${__availableToolchainsVar} "${__toolchain}" )
|
|
||||||
endif()
|
endif()
|
||||||
unset( __gcc_toolchain )
|
unset( __gcc_toolchain )
|
||||||
endforeach()
|
endforeach()
|
||||||
@ -594,17 +617,29 @@ if( BUILD_WITH_ANDROID_NDK )
|
|||||||
set( __availableToolchainCompilerVersions "" )
|
set( __availableToolchainCompilerVersions "" )
|
||||||
if( ANDROID_TOOLCHAIN_NAME AND EXISTS "${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/" )
|
if( ANDROID_TOOLCHAIN_NAME AND EXISTS "${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/" )
|
||||||
# do not go through all toolchains if we know the name
|
# do not go through all toolchains if we know the name
|
||||||
set( __availableToolchains "${ANDROID_TOOLCHAIN_NAME}" )
|
set( __availableToolchainsLst "${ANDROID_TOOLCHAIN_NAME}" )
|
||||||
__GLOB_NDK_TOOLCHAINS( __availableToolchains )
|
__GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst ${ANDROID_NDK_HOST_SYSTEM_NAME} )
|
||||||
|
if( NOT __availableToolchains AND NOT ANDROID_NDK_HOST_SYSTEM_NAME STREQUAL ANDROID_NDK_HOST_SYSTEM_NAME2 )
|
||||||
|
__GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst ${ANDROID_NDK_HOST_SYSTEM_NAME2} )
|
||||||
|
if( __availableToolchains )
|
||||||
|
set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} )
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
if( NOT __availableToolchains )
|
if( NOT __availableToolchains )
|
||||||
file( GLOB __availableToolchains RELATIVE "${ANDROID_NDK}/toolchains" "${ANDROID_NDK}/toolchains/*" )
|
file( GLOB __availableToolchainsLst RELATIVE "${ANDROID_NDK}/toolchains" "${ANDROID_NDK}/toolchains/*" )
|
||||||
if( __availableToolchains )
|
if( __availableToolchains )
|
||||||
list(SORT __availableToolchains) # we need clang to go after gcc
|
list(SORT __availableToolchainsLst) # we need clang to go after gcc
|
||||||
|
endif()
|
||||||
|
__LIST_FILTER( __availableToolchainsLst "^[.]" )
|
||||||
|
__LIST_FILTER( __availableToolchainsLst "llvm" )
|
||||||
|
__GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst ${ANDROID_NDK_HOST_SYSTEM_NAME} )
|
||||||
|
if( NOT __availableToolchains AND NOT ANDROID_NDK_HOST_SYSTEM_NAME STREQUAL ANDROID_NDK_HOST_SYSTEM_NAME2 )
|
||||||
|
__GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst ${ANDROID_NDK_HOST_SYSTEM_NAME2} )
|
||||||
|
if( __availableToolchains )
|
||||||
|
set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} )
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
__LIST_FILTER( __availableToolchains "^[.]" )
|
|
||||||
__LIST_FILTER( __availableToolchains "llvm" )
|
|
||||||
__GLOB_NDK_TOOLCHAINS( __availableToolchains )
|
|
||||||
endif()
|
endif()
|
||||||
if( NOT __availableToolchains )
|
if( NOT __availableToolchains )
|
||||||
message( FATAL_ERROR "Could not find any working toolchain in the NDK. Probably your Android NDK is broken." )
|
message( FATAL_ERROR "Could not find any working toolchain in the NDK. Probably your Android NDK is broken." )
|
||||||
@ -617,11 +652,11 @@ set( __uniqToolchainArchNames ${__availableToolchainArchs} )
|
|||||||
list( REMOVE_DUPLICATES __uniqToolchainArchNames )
|
list( REMOVE_DUPLICATES __uniqToolchainArchNames )
|
||||||
list( SORT __uniqToolchainArchNames )
|
list( SORT __uniqToolchainArchNames )
|
||||||
foreach( __arch ${__uniqToolchainArchNames} )
|
foreach( __arch ${__uniqToolchainArchNames} )
|
||||||
list( APPEND ANDROID_SUPPORTED_ABIS ${ANDROID_SUPPORTED_ABIS_${__arch}} )
|
list( APPEND ANDROID_SUPPORTED_ABIS ${ANDROID_SUPPORTED_ABIS_${__arch}} )
|
||||||
endforeach()
|
endforeach()
|
||||||
unset( __uniqToolchainArchNames )
|
unset( __uniqToolchainArchNames )
|
||||||
if( NOT ANDROID_SUPPORTED_ABIS )
|
if( NOT ANDROID_SUPPORTED_ABIS )
|
||||||
message( FATAL_ERROR "No one of known Android ABIs is supported by this cmake toolchain." )
|
message( FATAL_ERROR "No one of known Android ABIs is supported by this cmake toolchain." )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# choose target ABI
|
# choose target ABI
|
||||||
@ -760,11 +795,22 @@ unset( __availableToolchainCompilerVersions )
|
|||||||
# choose native API level
|
# choose native API level
|
||||||
__INIT_VARIABLE( ANDROID_NATIVE_API_LEVEL ENV_ANDROID_NATIVE_API_LEVEL ANDROID_API_LEVEL ENV_ANDROID_API_LEVEL ANDROID_STANDALONE_TOOLCHAIN_API_LEVEL ANDROID_DEFAULT_NDK_API_LEVEL_${ANDROID_ARCH_NAME} ANDROID_DEFAULT_NDK_API_LEVEL )
|
__INIT_VARIABLE( ANDROID_NATIVE_API_LEVEL ENV_ANDROID_NATIVE_API_LEVEL ANDROID_API_LEVEL ENV_ANDROID_API_LEVEL ANDROID_STANDALONE_TOOLCHAIN_API_LEVEL ANDROID_DEFAULT_NDK_API_LEVEL_${ANDROID_ARCH_NAME} ANDROID_DEFAULT_NDK_API_LEVEL )
|
||||||
string( REGEX MATCH "[0-9]+" ANDROID_NATIVE_API_LEVEL "${ANDROID_NATIVE_API_LEVEL}" )
|
string( REGEX MATCH "[0-9]+" ANDROID_NATIVE_API_LEVEL "${ANDROID_NATIVE_API_LEVEL}" )
|
||||||
# TODO: filter out unsupported levels
|
# adjust API level
|
||||||
|
set( __real_api_level ${ANDROID_DEFAULT_NDK_API_LEVEL_${ANDROID_ARCH_NAME}} )
|
||||||
|
foreach( __level ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} )
|
||||||
|
if( NOT __level GREATER ANDROID_NATIVE_API_LEVEL AND NOT __level LESS __real_api_level )
|
||||||
|
set( __real_api_level ${__level} )
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
if( __real_api_level AND NOT ANDROID_NATIVE_API_LEVEL EQUAL __real_api_level )
|
||||||
|
message( STATUS "Adjusting Android API level 'android-${ANDROID_NATIVE_API_LEVEL}' to 'android-${__real_api_level}'")
|
||||||
|
set( ANDROID_NATIVE_API_LEVEL ${__real_api_level} )
|
||||||
|
endif()
|
||||||
|
unset(__real_api_level)
|
||||||
# validate
|
# validate
|
||||||
list( FIND ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_NATIVE_API_LEVEL}" __levelIdx )
|
list( FIND ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_NATIVE_API_LEVEL}" __levelIdx )
|
||||||
if( __levelIdx EQUAL -1 )
|
if( __levelIdx EQUAL -1 )
|
||||||
message( SEND_ERROR "Specified Android native API level (${ANDROID_NATIVE_API_LEVEL}) is not supported by your NDK/toolchain." )
|
message( SEND_ERROR "Specified Android native API level 'android-${ANDROID_NATIVE_API_LEVEL}' is not supported by your NDK/toolchain." )
|
||||||
else()
|
else()
|
||||||
if( BUILD_WITH_ANDROID_NDK )
|
if( BUILD_WITH_ANDROID_NDK )
|
||||||
__DETECT_NATIVE_API_LEVEL( __realApiLevel "${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}/usr/include/android/api-level.h" )
|
__DETECT_NATIVE_API_LEVEL( __realApiLevel "${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}/usr/include/android/api-level.h" )
|
||||||
@ -926,7 +972,7 @@ elseif( "${ANDROID_TOOLCHAIN_NAME}" MATCHES "-clang3[.][0-9]?$" )
|
|||||||
string( REGEX MATCH "3[.][0-9]$" ANDROID_CLANG_VERSION "${ANDROID_TOOLCHAIN_NAME}")
|
string( REGEX MATCH "3[.][0-9]$" ANDROID_CLANG_VERSION "${ANDROID_TOOLCHAIN_NAME}")
|
||||||
string( REGEX REPLACE "-clang${ANDROID_CLANG_VERSION}$" "-4.6" ANDROID_GCC_TOOLCHAIN_NAME "${ANDROID_TOOLCHAIN_NAME}" )
|
string( REGEX REPLACE "-clang${ANDROID_CLANG_VERSION}$" "-4.6" ANDROID_GCC_TOOLCHAIN_NAME "${ANDROID_TOOLCHAIN_NAME}" )
|
||||||
if( NOT EXISTS "${ANDROID_NDK}/toolchains/llvm-${ANDROID_CLANG_VERSION}/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}/bin/clang${TOOL_OS_SUFFIX}" )
|
if( NOT EXISTS "${ANDROID_NDK}/toolchains/llvm-${ANDROID_CLANG_VERSION}/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}/bin/clang${TOOL_OS_SUFFIX}" )
|
||||||
message( FATAL_ERROR "Could not find the " )
|
message( FATAL_ERROR "Could not find the Clang compiler driver" )
|
||||||
endif()
|
endif()
|
||||||
set( ANDROID_COMPILER_IS_CLANG 1 )
|
set( ANDROID_COMPILER_IS_CLANG 1 )
|
||||||
set( ANDROID_CLANG_TOOLCHAIN_ROOT "${ANDROID_NDK}/toolchains/llvm-${ANDROID_CLANG_VERSION}/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}" )
|
set( ANDROID_CLANG_TOOLCHAIN_ROOT "${ANDROID_NDK}/toolchains/llvm-${ANDROID_CLANG_VERSION}/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}" )
|
||||||
@ -1140,38 +1186,52 @@ endif()
|
|||||||
|
|
||||||
# NDK flags
|
# NDK flags
|
||||||
if( ARMEABI OR ARMEABI_V7A )
|
if( ARMEABI OR ARMEABI_V7A )
|
||||||
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fpic -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__" )
|
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fpic -funwind-tables" )
|
||||||
if( NOT ANDROID_FORCE_ARM_BUILD AND NOT ARMEABI_V6 )
|
if( NOT ANDROID_FORCE_ARM_BUILD AND NOT ARMEABI_V6 )
|
||||||
# It is recommended to use the -mthumb compiler flag to force the generation
|
set( ANDROID_CXX_FLAGS_RELEASE "-mthumb -fomit-frame-pointer -fno-strict-aliasing" )
|
||||||
# of 16-bit Thumb-1 instructions (the default being 32-bit ARM ones).
|
set( ANDROID_CXX_FLAGS_DEBUG "-marm -fno-omit-frame-pointer -fno-strict-aliasing" )
|
||||||
set( ANDROID_CXX_FLAGS_RELEASE "-mthumb" )
|
if( NOT ANDROID_COMPILER_IS_CLANG )
|
||||||
set( ANDROID_CXX_FLAGS_DEBUG "-marm -finline-limit=64" )
|
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -finline-limit=64" )
|
||||||
|
endif()
|
||||||
else()
|
else()
|
||||||
# always compile ARMEABI_V6 in arm mode; otherwise there is no difference from ARMEABI
|
# always compile ARMEABI_V6 in arm mode; otherwise there is no difference from ARMEABI
|
||||||
# O3 instead of O2/Os in release mode - like cmake sets for desktop gcc
|
set( ANDROID_CXX_FLAGS_RELEASE "-marm -fomit-frame-pointer -fstrict-aliasing" )
|
||||||
set( ANDROID_CXX_FLAGS_RELEASE "-marm" )
|
set( ANDROID_CXX_FLAGS_DEBUG "-marm -fno-omit-frame-pointer -fno-strict-aliasing" )
|
||||||
set( ANDROID_CXX_FLAGS_DEBUG "-marm -finline-limit=300" )
|
if( NOT ANDROID_COMPILER_IS_CLANG )
|
||||||
|
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funswitch-loops -finline-limit=300" )
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
elseif( X86 )
|
elseif( X86 )
|
||||||
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" )
|
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" )
|
||||||
set( ANDROID_CXX_FLAGS_RELEASE "" )
|
if( NOT ANDROID_COMPILER_IS_CLANG )
|
||||||
set( ANDROID_CXX_FLAGS_DEBUG "-finline-limit=300" )
|
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funswitch-loops -finline-limit=300" )
|
||||||
|
else()
|
||||||
|
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fPIC" )
|
||||||
|
endif()
|
||||||
|
set( ANDROID_CXX_FLAGS_RELEASE "-fomit-frame-pointer -fstrict-aliasing" )
|
||||||
|
set( ANDROID_CXX_FLAGS_DEBUG "-fno-omit-frame-pointer -fno-strict-aliasing" )
|
||||||
elseif( MIPS )
|
elseif( MIPS )
|
||||||
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fpic -funwind-tables -fmessage-length=0 -fno-inline-functions-called-once -frename-registers" )
|
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fpic -fno-strict-aliasing -finline-functions -ffunction-sections -funwind-tables -fmessage-length=0" )
|
||||||
set( ANDROID_CXX_FLAGS_RELEASE "-finline-limit=300 -fno-strict-aliasing" )
|
set( ANDROID_CXX_FLAGS_RELEASE "-fomit-frame-pointer" )
|
||||||
set( ANDROID_CXX_FLAGS_DEBUG "-finline-functions -fgcse-after-reload -frerun-cse-after-loop" )
|
set( ANDROID_CXX_FLAGS_DEBUG "-fno-omit-frame-pointer" )
|
||||||
|
if( NOT ANDROID_COMPILER_IS_CLANG )
|
||||||
|
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers" )
|
||||||
|
set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} -funswitch-loops -finline-limit=300" )
|
||||||
|
endif()
|
||||||
elseif()
|
elseif()
|
||||||
set( ANDROID_CXX_FLAGS_RELEASE "" )
|
set( ANDROID_CXX_FLAGS_RELEASE "" )
|
||||||
set( ANDROID_CXX_FLAGS_DEBUG "" )
|
set( ANDROID_CXX_FLAGS_DEBUG "" )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if( NOT X86 )
|
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fsigned-char" ) # good/necessary when porting desktop libraries
|
||||||
|
|
||||||
|
if( NOT X86 AND NOT ANDROID_COMPILER_IS_CLANG )
|
||||||
set( ANDROID_CXX_FLAGS "-Wno-psabi ${ANDROID_CXX_FLAGS}" )
|
set( ANDROID_CXX_FLAGS "-Wno-psabi ${ANDROID_CXX_FLAGS}" )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fsigned-char" ) # good/necessary when porting desktop libraries
|
if( NOT ANDROID_COMPILER_VERSION VERSION_LESS "4.6" )
|
||||||
set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} -fomit-frame-pointer" )
|
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -no-canonical-prefixes" ) # see https://android-review.googlesource.com/#/c/47564/
|
||||||
set( ANDROID_CXX_FLAGS_DEBUG "${ANDROID_CXX_FLAGS_DEBUG} -fno-strict-aliasing -fno-omit-frame-pointer" )
|
endif()
|
||||||
|
|
||||||
# ABI-specific flags
|
# ABI-specific flags
|
||||||
if( ARMEABI_V7A )
|
if( ARMEABI_V7A )
|
||||||
@ -1308,9 +1368,6 @@ if( ANDROID_COMPILER_IS_CLANG )
|
|||||||
set( ANDROID_CXX_FLAGS "-target ${ANDROID_LLVM_TRIPLE} ${ANDROID_CXX_FLAGS}" )
|
set( ANDROID_CXX_FLAGS "-target ${ANDROID_LLVM_TRIPLE} ${ANDROID_CXX_FLAGS}" )
|
||||||
endif()
|
endif()
|
||||||
if( BUILD_WITH_ANDROID_NDK )
|
if( BUILD_WITH_ANDROID_NDK )
|
||||||
if(ANDROID_ARCH_NAME STREQUAL "arm" )
|
|
||||||
set( ANDROID_CXX_FLAGS "-isystem ${ANDROID_CLANG_TOOLCHAIN_ROOT}/lib/clang/${ANDROID_CLANG_VERSION}/include ${ANDROID_CXX_FLAGS}" )
|
|
||||||
endif()
|
|
||||||
set( ANDROID_CXX_FLAGS "-gcc-toolchain ${ANDROID_TOOLCHAIN_ROOT} ${ANDROID_CXX_FLAGS}" )
|
set( ANDROID_CXX_FLAGS "-gcc-toolchain ${ANDROID_TOOLCHAIN_ROOT} ${ANDROID_CXX_FLAGS}" )
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
@ -1326,6 +1383,12 @@ set( CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "shared li
|
|||||||
set( CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "module linker flags" )
|
set( CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "module linker flags" )
|
||||||
set( CMAKE_EXE_LINKER_FLAGS "-Wl,-z,nocopyreloc" CACHE STRING "executable linker flags" )
|
set( CMAKE_EXE_LINKER_FLAGS "-Wl,-z,nocopyreloc" CACHE STRING "executable linker flags" )
|
||||||
|
|
||||||
|
# put flags to cache (for debug purpose only)
|
||||||
|
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS}" CACHE INTERNAL "Android specific c/c++ flags" )
|
||||||
|
set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE}" CACHE INTERNAL "Android specific c/c++ Release flags" )
|
||||||
|
set( ANDROID_CXX_FLAGS_DEBUG "${ANDROID_CXX_FLAGS_DEBUG}" CACHE INTERNAL "Android specific c/c++ Debug flags" )
|
||||||
|
set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS}" CACHE INTERNAL "Android specific c/c++ linker flags" )
|
||||||
|
|
||||||
# finish flags
|
# finish flags
|
||||||
set( CMAKE_CXX_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_CXX_FLAGS}" )
|
set( CMAKE_CXX_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_CXX_FLAGS}" )
|
||||||
set( CMAKE_C_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_C_FLAGS}" )
|
set( CMAKE_C_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_C_FLAGS}" )
|
||||||
@ -1456,6 +1519,7 @@ endmacro()
|
|||||||
if( NOT PROJECT_NAME STREQUAL "CMAKE_TRY_COMPILE" )
|
if( NOT PROJECT_NAME STREQUAL "CMAKE_TRY_COMPILE" )
|
||||||
set( __toolchain_config "")
|
set( __toolchain_config "")
|
||||||
foreach( __var NDK_CCACHE LIBRARY_OUTPUT_PATH_ROOT ANDROID_FORBID_SYGWIN ANDROID_SET_OBSOLETE_VARIABLES
|
foreach( __var NDK_CCACHE LIBRARY_OUTPUT_PATH_ROOT ANDROID_FORBID_SYGWIN ANDROID_SET_OBSOLETE_VARIABLES
|
||||||
|
ANDROID_NDK_HOST_X64
|
||||||
ANDROID_NDK
|
ANDROID_NDK
|
||||||
ANDROID_STANDALONE_TOOLCHAIN
|
ANDROID_STANDALONE_TOOLCHAIN
|
||||||
ANDROID_TOOLCHAIN_NAME
|
ANDROID_TOOLCHAIN_NAME
|
||||||
@ -1512,6 +1576,7 @@ endif()
|
|||||||
# ANDROID_NDK
|
# ANDROID_NDK
|
||||||
# ANDROID_STANDALONE_TOOLCHAIN
|
# ANDROID_STANDALONE_TOOLCHAIN
|
||||||
# ANDROID_TOOLCHAIN_NAME : the NDK name of compiler toolchain
|
# ANDROID_TOOLCHAIN_NAME : the NDK name of compiler toolchain
|
||||||
|
# ANDROID_NDK_HOST_X64 : try to use x86_64 toolchain (default for x64 host systems)
|
||||||
# LIBRARY_OUTPUT_PATH_ROOT : <any valid path>
|
# LIBRARY_OUTPUT_PATH_ROOT : <any valid path>
|
||||||
# NDK_CCACHE : <path to your ccache executable>
|
# NDK_CCACHE : <path to your ccache executable>
|
||||||
# Obsolete:
|
# Obsolete:
|
||||||
@ -1536,7 +1601,7 @@ endif()
|
|||||||
# BUILD_WITH_STANDALONE_TOOLCHAIN : TRUE if standalone toolchain is used
|
# BUILD_WITH_STANDALONE_TOOLCHAIN : TRUE if standalone toolchain is used
|
||||||
# ANDROID_NDK_HOST_SYSTEM_NAME : "windows", "linux-x86" or "darwin-x86" depending on host platform
|
# ANDROID_NDK_HOST_SYSTEM_NAME : "windows", "linux-x86" or "darwin-x86" depending on host platform
|
||||||
# ANDROID_NDK_ABI_NAME : "armeabi", "armeabi-v7a", "x86" or "mips" depending on ANDROID_ABI
|
# ANDROID_NDK_ABI_NAME : "armeabi", "armeabi-v7a", "x86" or "mips" depending on ANDROID_ABI
|
||||||
# ANDROID_NDK_RELEASE : one of r5, r5b, r5c, r6, r6b, r7, r7b, r7c, r8, r8b, r8c, r8d; set only for NDK
|
# ANDROID_NDK_RELEASE : one of r5, r5b, r5c, r6, r6b, r7, r7b, r7c, r8, r8b, r8c, r8d, r8e; set only for NDK
|
||||||
# ANDROID_ARCH_NAME : "arm" or "x86" or "mips" depending on ANDROID_ABI
|
# ANDROID_ARCH_NAME : "arm" or "x86" or "mips" depending on ANDROID_ABI
|
||||||
# ANDROID_SYSROOT : path to the compiler sysroot
|
# ANDROID_SYSROOT : path to the compiler sysroot
|
||||||
# TOOL_OS_SUFFIX : "" or ".exe" depending on host platform
|
# TOOL_OS_SUFFIX : "" or ".exe" depending on host platform
|
||||||
|
@ -51,3 +51,7 @@ OpenCV version constants
|
|||||||
.. data:: OPENCV_VERSION_2_4_4
|
.. data:: OPENCV_VERSION_2_4_4
|
||||||
|
|
||||||
OpenCV Library version 2.4.4
|
OpenCV Library version 2.4.4
|
||||||
|
|
||||||
|
.. data:: OPENCV_VERSION_2_4_5
|
||||||
|
|
||||||
|
OpenCV Library version 2.4.5
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="org.opencv.engine"
|
package="org.opencv.engine"
|
||||||
android:versionCode="26@ANDROID_PLATFORM_VERSION_CODE@"
|
android:versionCode="27@ANDROID_PLATFORM_VERSION_CODE@"
|
||||||
android:versionName="2.6" >
|
android:versionName="2.7" >
|
||||||
|
|
||||||
<uses-sdk android:minSdkVersion="@ANDROID_NATIVE_API_LEVEL@" />
|
<uses-sdk android:minSdkVersion="@ANDROID_NATIVE_API_LEVEL@" />
|
||||||
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
|
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
|
||||||
@ -26,6 +26,5 @@
|
|||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
</application>
|
||||||
</application>
|
|
||||||
</manifest>
|
</manifest>
|
@ -15,7 +15,7 @@ using namespace android;
|
|||||||
|
|
||||||
const int OpenCVEngine::Platform = DetectKnownPlatforms();
|
const int OpenCVEngine::Platform = DetectKnownPlatforms();
|
||||||
const int OpenCVEngine::CpuID = GetCpuID();
|
const int OpenCVEngine::CpuID = GetCpuID();
|
||||||
const int OpenCVEngine::KnownVersions[] = {2040000, 2040100, 2040200, 2040300, 2040301, 2040302, 2040400};
|
const int OpenCVEngine::KnownVersions[] = {2040000, 2040100, 2040200, 2040300, 2040301, 2040302, 2040400, 2040500};
|
||||||
|
|
||||||
bool OpenCVEngine::ValidateVersion(int version)
|
bool OpenCVEngine::ValidateVersion(int version)
|
||||||
{
|
{
|
||||||
|
@ -294,7 +294,7 @@ TEST(OpenCVEngineTest, GetPathFor2_4_5)
|
|||||||
Starter.PackageManager->InstallVersion(2040500, PLATFORM_UNKNOWN, ARCH_ARMv7);
|
Starter.PackageManager->InstallVersion(2040500, PLATFORM_UNKNOWN, ARCH_ARMv7);
|
||||||
EXPECT_FALSE(NULL == Engine.get());
|
EXPECT_FALSE(NULL == Engine.get());
|
||||||
String16 result = Engine->GetLibPathByVersion(String16("2.4.5"));
|
String16 result = Engine->GetLibPathByVersion(String16("2.4.5"));
|
||||||
EXPECT_EQ(0, result.size()); // 2.4.5 is not published yet
|
EXPECT_STREQ("/data/data/org.opencv.lib_v24_armv7a/lib", String8(result).string());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -11,4 +11,4 @@
|
|||||||
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
||||||
|
|
||||||
# Project target.
|
# Project target.
|
||||||
target=android-9
|
target=android-8
|
||||||
|
@ -14,20 +14,20 @@ manually using adb tool:
|
|||||||
|
|
||||||
.. code-block:: sh
|
.. code-block:: sh
|
||||||
|
|
||||||
adb install OpenCV-2.4.4-android-sdk/apk/OpenCV_2.4.4_Manager_2.6_<platform>.apk
|
adb install OpenCV-2.4.5-android-sdk/apk/OpenCV_2.4.5_Manager_2.7_<platform>.apk
|
||||||
|
|
||||||
Use the table below to determine proper OpenCV Manager package for your device:
|
Use the table below to determine proper OpenCV Manager package for your device:
|
||||||
|
|
||||||
+------------------------------+--------------+---------------------------------------------------+
|
+------------------------------+--------------+---------------------------------------------------+
|
||||||
| Hardware Platform | Android ver. | Package name |
|
| Hardware Platform | Android ver. | Package name |
|
||||||
+==============================+==============+===================================================+
|
+==============================+==============+===================================================+
|
||||||
| armeabi-v7a (ARMv7-A + NEON) | >= 2.3 | OpenCV_2.4.4_Manager_2.6_armv7a-neon.apk |
|
| armeabi-v7a (ARMv7-A + NEON) | >= 2.3 | OpenCV_2.4.5_Manager_2.7_armv7a-neon.apk |
|
||||||
+------------------------------+--------------+---------------------------------------------------+
|
+------------------------------+--------------+---------------------------------------------------+
|
||||||
| armeabi-v7a (ARMv7-A + NEON) | = 2.2 | OpenCV_2.4.4_Manager_2.6_armv7a-neon-android8.apk |
|
| armeabi-v7a (ARMv7-A + NEON) | = 2.2 | OpenCV_2.4.5_Manager_2.7_armv7a-neon-android8.apk |
|
||||||
+------------------------------+--------------+---------------------------------------------------+
|
+------------------------------+--------------+---------------------------------------------------+
|
||||||
| armeabi (ARMv5, ARMv6) | >= 2.3 | OpenCV_2.4.4_Manager_2.6_armeabi.apk |
|
| armeabi (ARMv5, ARMv6) | >= 2.3 | OpenCV_2.4.5_Manager_2.7_armeabi.apk |
|
||||||
+------------------------------+--------------+---------------------------------------------------+
|
+------------------------------+--------------+---------------------------------------------------+
|
||||||
| Intel x86 | >= 2.3 | OpenCV_2.4.4_Manager_2.6_x86.apk |
|
| Intel x86 | >= 2.3 | OpenCV_2.4.5_Manager_2.7_x86.apk |
|
||||||
+------------------------------+--------------+---------------------------------------------------+
|
+------------------------------+--------------+---------------------------------------------------+
|
||||||
| MIPS | >= 2.3 | OpenCV_2.4.4_Manager_2.6_mips.apk |
|
| MIPS | >= 2.3 | OpenCV_2.4.5_Manager_2.7_mips.apk |
|
||||||
+------------------------------+--------------+---------------------------------------------------+
|
+------------------------------+--------------+---------------------------------------------------+
|
||||||
|
@ -278,6 +278,7 @@ macro(add_android_project target path)
|
|||||||
if (NATIVE_APP_GLUE)
|
if (NATIVE_APP_GLUE)
|
||||||
include_directories(${ANDROID_NDK}/sources/android/native_app_glue)
|
include_directories(${ANDROID_NDK}/sources/android/native_app_glue)
|
||||||
list(APPEND android_proj_jni_files ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
|
list(APPEND android_proj_jni_files ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
|
||||||
|
ocv_warnings_disable(CMAKE_C_FLAGS -Wstrict-prototypes -Wunused-parameter -Wmissing-prototypes)
|
||||||
set(android_proj_NATIVE_DEPS ${android_proj_NATIVE_DEPS} android)
|
set(android_proj_NATIVE_DEPS ${android_proj_NATIVE_DEPS} android)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ if(CUDA_FOUND)
|
|||||||
elseif(CUDA_GENERATION STREQUAL "Kepler")
|
elseif(CUDA_GENERATION STREQUAL "Kepler")
|
||||||
set(__cuda_arch_bin "3.0")
|
set(__cuda_arch_bin "3.0")
|
||||||
elseif(CUDA_GENERATION STREQUAL "Auto")
|
elseif(CUDA_GENERATION STREQUAL "Auto")
|
||||||
execute_process( COMMAND "${CUDA_NVCC_EXECUTABLE}" "${OpenCV_SOURCE_DIR}/cmake/OpenCVDetectCudaArch.cu" "--run"
|
execute_process( COMMAND "${CUDA_NVCC_EXECUTABLE}" "${OpenCV_SOURCE_DIR}/cmake/checks/OpenCVDetectCudaArch.cu" "--run"
|
||||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/"
|
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/"
|
||||||
RESULT_VARIABLE _nvcc_res OUTPUT_VARIABLE _nvcc_out
|
RESULT_VARIABLE _nvcc_res OUTPUT_VARIABLE _nvcc_out
|
||||||
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
@ -142,11 +142,14 @@ if(CUDA_FOUND)
|
|||||||
foreach(var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG)
|
foreach(var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG)
|
||||||
set(${var}_backup_in_cuda_compile_ "${${var}}")
|
set(${var}_backup_in_cuda_compile_ "${${var}}")
|
||||||
|
|
||||||
# we reomove /EHa as it leasd warnings under windows
|
# we remove /EHa as it generates warnings under windows
|
||||||
string(REPLACE "/EHa" "" ${var} "${${var}}")
|
string(REPLACE "/EHa" "" ${var} "${${var}}")
|
||||||
|
|
||||||
# we remove -ggdb3 flag as it leads to preprocessor errors when compiling CUDA files (CUDA 4.1)
|
# we remove -ggdb3 flag as it leads to preprocessor errors when compiling CUDA files (CUDA 4.1)
|
||||||
string(REPLACE "-ggdb3" "" ${var} "${${var}}")
|
string(REPLACE "-ggdb3" "" ${var} "${${var}}")
|
||||||
|
|
||||||
|
# we remove -Wsign-promo as it generates warnings under linux
|
||||||
|
string(REPLACE "-Wsign-promo" "" ${var} "${${var}}")
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
if(BUILD_SHARED_LIBS)
|
if(BUILD_SHARED_LIBS)
|
||||||
|
@ -93,14 +93,16 @@ elseif(CMAKE_COMPILER_IS_GNUCXX)
|
|||||||
execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine
|
execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine
|
||||||
OUTPUT_VARIABLE CMAKE_OPENCV_GCC_TARGET_MACHINE
|
OUTPUT_VARIABLE CMAKE_OPENCV_GCC_TARGET_MACHINE
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
if(CMAKE_OPENCV_GCC_TARGET_MACHINE MATCHES "64")
|
if(CMAKE_OPENCV_GCC_TARGET_MACHINE MATCHES "amd64|x86_64|AMD64")
|
||||||
set(MINGW64 1)
|
set(MINGW64 1)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*" OR CMAKE_GENERATOR MATCHES "Visual Studio.*Win64")
|
if(MINGW64 OR CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*" OR CMAKE_GENERATOR MATCHES "Visual Studio.*Win64")
|
||||||
set(X86_64 1)
|
set(X86_64 1)
|
||||||
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686.*|i386.*|x86.*|amd64.*|AMD64.*")
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686.*|i386.*|x86.*|amd64.*|AMD64.*")
|
||||||
set(X86 1)
|
set(X86 1)
|
||||||
|
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "arm.*|ARM.*")
|
||||||
|
set(ARM 1)
|
||||||
endif()
|
endif()
|
||||||
|
@ -2,6 +2,16 @@
|
|||||||
# Detect 3rd-party GUI libraries
|
# Detect 3rd-party GUI libraries
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#--- Win32 UI ---
|
||||||
|
ocv_clear_vars(HAVE_WIN32UI)
|
||||||
|
if(WITH_WIN32UI)
|
||||||
|
TRY_COMPILE(HAVE_WIN32UI
|
||||||
|
"${OPENCV_BINARY_DIR}/CMakeFiles/CMakeTmp"
|
||||||
|
"${OpenCV_SOURCE_DIR}/cmake/checks/win32uitest.cpp"
|
||||||
|
CMAKE_FLAGS "\"user32.lib\" \"gdi32.lib\""
|
||||||
|
OUTPUT_VARIABLE OUTPUT)
|
||||||
|
endif(WITH_WIN32UI)
|
||||||
|
|
||||||
# --- QT4 ---
|
# --- QT4 ---
|
||||||
ocv_clear_vars(HAVE_QT)
|
ocv_clear_vars(HAVE_QT)
|
||||||
if(WITH_QT)
|
if(WITH_QT)
|
||||||
@ -25,7 +35,7 @@ endif()
|
|||||||
# --- OpenGl ---
|
# --- OpenGl ---
|
||||||
ocv_clear_vars(HAVE_OPENGL HAVE_QT_OPENGL)
|
ocv_clear_vars(HAVE_OPENGL HAVE_QT_OPENGL)
|
||||||
if(WITH_OPENGL)
|
if(WITH_OPENGL)
|
||||||
if(WIN32 OR QT_QTOPENGL_FOUND OR HAVE_GTKGLEXT)
|
if(WITH_WIN32UI OR (HAVE_QT AND QT_QTOPENGL_FOUND) OR HAVE_GTKGLEXT)
|
||||||
find_package (OpenGL QUIET)
|
find_package (OpenGL QUIET)
|
||||||
if(OPENGL_FOUND)
|
if(OPENGL_FOUND)
|
||||||
set(HAVE_OPENGL TRUE)
|
set(HAVE_OPENGL TRUE)
|
||||||
|
@ -151,6 +151,7 @@ if(WITH_PNG AND NOT IOS)
|
|||||||
else()
|
else()
|
||||||
include(FindPNG)
|
include(FindPNG)
|
||||||
if(PNG_FOUND)
|
if(PNG_FOUND)
|
||||||
|
include(CheckIncludeFile)
|
||||||
check_include_file("${PNG_PNG_INCLUDE_DIR}/png.h" HAVE_PNG_H)
|
check_include_file("${PNG_PNG_INCLUDE_DIR}/png.h" HAVE_PNG_H)
|
||||||
check_include_file("${PNG_PNG_INCLUDE_DIR}/libpng/png.h" HAVE_LIBPNG_PNG_H)
|
check_include_file("${PNG_PNG_INCLUDE_DIR}/libpng/png.h" HAVE_LIBPNG_PNG_H)
|
||||||
if(HAVE_PNG_H)
|
if(HAVE_PNG_H)
|
||||||
|
@ -88,8 +88,9 @@ endif()
|
|||||||
# --- OpenMP ---
|
# --- OpenMP ---
|
||||||
if(NOT HAVE_TBB AND NOT HAVE_CSTRIPES)
|
if(NOT HAVE_TBB AND NOT HAVE_CSTRIPES)
|
||||||
set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/omptest.cpp")
|
set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/omptest.cpp")
|
||||||
FILE(WRITE "${_fname}" "#ifndef _OPENMP\n#error\n#endif\nint main() { return 0; }\n")
|
file(WRITE "${_fname}" "#ifndef _OPENMP\n#error\n#endif\nint main() { return 0; }\n")
|
||||||
TRY_COMPILE(HAVE_OPENMP "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp" "${_fname}")
|
try_compile(HAVE_OPENMP "${CMAKE_BINARY_DIR}" "${_fname}")
|
||||||
|
file(REMOVE "${_fname}")
|
||||||
else()
|
else()
|
||||||
set(HAVE_OPENMP 0)
|
set(HAVE_OPENMP 0)
|
||||||
endif()
|
endif()
|
||||||
@ -104,8 +105,9 @@ endif()
|
|||||||
# --- Concurrency ---
|
# --- Concurrency ---
|
||||||
if(MSVC AND NOT HAVE_TBB AND NOT HAVE_CSTRIPES AND NOT HAVE_OPENMP)
|
if(MSVC AND NOT HAVE_TBB AND NOT HAVE_CSTRIPES AND NOT HAVE_OPENMP)
|
||||||
set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/concurrencytest.cpp")
|
set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/concurrencytest.cpp")
|
||||||
FILE(WRITE "${_fname}" "#if _MSC_VER < 1600\n#error\n#endif\nint main() { return 0; }\n")
|
file(WRITE "${_fname}" "#if _MSC_VER < 1600\n#error\n#endif\nint main() { return 0; }\n")
|
||||||
TRY_COMPILE(HAVE_CONCURRENCY "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp" "${_fname}")
|
try_compile(HAVE_CONCURRENCY "${CMAKE_BINARY_DIR}" "${_fname}")
|
||||||
|
file(REMOVE "${_fname}")
|
||||||
else()
|
else()
|
||||||
set(HAVE_CONCURRENCY 0)
|
set(HAVE_CONCURRENCY 0)
|
||||||
endif()
|
endif()
|
||||||
|
@ -2,6 +2,15 @@
|
|||||||
# Detect 3rd-party video IO libraries
|
# Detect 3rd-party video IO libraries
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
ocv_clear_vars(HAVE_VFW)
|
||||||
|
if (WITH_VFW)
|
||||||
|
TRY_COMPILE(HAVE_VFW
|
||||||
|
"${OPENCV_BINARY_DIR}/CMakeFiles/CMakeTmp"
|
||||||
|
"${OpenCV_SOURCE_DIR}/cmake/checks/vfwtest.cpp"
|
||||||
|
CMAKE_FLAGS "-DLINK_LIBRARIES:STRING=vfw32"
|
||||||
|
OUTPUT_VARIABLE OUTPUT)
|
||||||
|
endif(WITH_VFW)
|
||||||
|
|
||||||
# --- GStreamer ---
|
# --- GStreamer ---
|
||||||
ocv_clear_vars(HAVE_GSTREAMER)
|
ocv_clear_vars(HAVE_GSTREAMER)
|
||||||
# try to find gstreamer 0.10 first
|
# try to find gstreamer 0.10 first
|
||||||
@ -66,7 +75,7 @@ if(WITH_PVAPI)
|
|||||||
set(PVAPI_SDK_SUBDIR x86)
|
set(PVAPI_SDK_SUBDIR x86)
|
||||||
elseif(X86_64)
|
elseif(X86_64)
|
||||||
set(PVAPI_SDK_SUBDIR x64)
|
set(PVAPI_SDK_SUBDIR x64)
|
||||||
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES arm)
|
elseif(ARM)
|
||||||
set(PVAPI_SDK_SUBDIR arm)
|
set(PVAPI_SDK_SUBDIR arm)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@ -140,7 +149,7 @@ endif(WITH_XIMEA)
|
|||||||
# --- FFMPEG ---
|
# --- FFMPEG ---
|
||||||
ocv_clear_vars(HAVE_FFMPEG HAVE_FFMPEG_CODEC HAVE_FFMPEG_FORMAT HAVE_FFMPEG_UTIL HAVE_FFMPEG_SWSCALE HAVE_GENTOO_FFMPEG HAVE_FFMPEG_FFMPEG)
|
ocv_clear_vars(HAVE_FFMPEG HAVE_FFMPEG_CODEC HAVE_FFMPEG_FORMAT HAVE_FFMPEG_UTIL HAVE_FFMPEG_SWSCALE HAVE_GENTOO_FFMPEG HAVE_FFMPEG_FFMPEG)
|
||||||
if(WITH_FFMPEG)
|
if(WITH_FFMPEG)
|
||||||
if(WIN32)
|
if(WIN32 AND NOT ARM)
|
||||||
include("${OpenCV_SOURCE_DIR}/3rdparty/ffmpeg/ffmpeg_version.cmake")
|
include("${OpenCV_SOURCE_DIR}/3rdparty/ffmpeg/ffmpeg_version.cmake")
|
||||||
elseif(UNIX)
|
elseif(UNIX)
|
||||||
CHECK_MODULE(libavcodec HAVE_FFMPEG_CODEC)
|
CHECK_MODULE(libavcodec HAVE_FFMPEG_CODEC)
|
||||||
@ -204,11 +213,16 @@ if(WITH_FFMPEG)
|
|||||||
endif(APPLE)
|
endif(APPLE)
|
||||||
endif(WITH_FFMPEG)
|
endif(WITH_FFMPEG)
|
||||||
|
|
||||||
# --- VideoInput ---
|
# --- VideoInput/DirectShow ---
|
||||||
if(WITH_VIDEOINPUT)
|
if(WITH_DSHOW)
|
||||||
# always have VideoInput on Windows
|
# always have VideoInput on Windows
|
||||||
set(HAVE_VIDEOINPUT 1)
|
set(HAVE_DSHOW 1)
|
||||||
endif(WITH_VIDEOINPUT)
|
endif(WITH_DSHOW)
|
||||||
|
|
||||||
|
# --- VideoInput/Microsoft Media Foundation ---
|
||||||
|
if(WITH_MSMF)
|
||||||
|
check_include_file(Mfapi.h HAVE_MSMF)
|
||||||
|
endif(WITH_MSMF)
|
||||||
|
|
||||||
# --- Extra HighGUI libs on Windows ---
|
# --- Extra HighGUI libs on Windows ---
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
|
@ -12,6 +12,7 @@ endmacro()
|
|||||||
ocv_legacy_option(BUILD_NEW_PYTHON_SUPPORT BUILD_opencv_python)
|
ocv_legacy_option(BUILD_NEW_PYTHON_SUPPORT BUILD_opencv_python)
|
||||||
ocv_legacy_option(BUILD_JAVA_SUPPORT BUILD_opencv_java)
|
ocv_legacy_option(BUILD_JAVA_SUPPORT BUILD_opencv_java)
|
||||||
ocv_legacy_option(WITH_ANDROID_CAMERA BUILD_opencv_androidcamera)
|
ocv_legacy_option(WITH_ANDROID_CAMERA BUILD_opencv_androidcamera)
|
||||||
|
ocv_legacy_option(WITH_VIDEOINPUT WITH_DSHOW)
|
||||||
|
|
||||||
if(DEFINED OPENCV_BUILD_3RDPARTY_LIBS)
|
if(DEFINED OPENCV_BUILD_3RDPARTY_LIBS)
|
||||||
set(BUILD_ZLIB ${OPENCV_BUILD_3RDPARTY_LIBS} CACHE BOOL "Set via depricated OPENCV_BUILD_3RDPARTY_LIBS" FORCE)
|
set(BUILD_ZLIB ${OPENCV_BUILD_3RDPARTY_LIBS} CACHE BOOL "Set via depricated OPENCV_BUILD_3RDPARTY_LIBS" FORCE)
|
||||||
|
10
cmake/checks/vfwtest.cpp
Normal file
10
cmake/checks/vfwtest.cpp
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <vfw.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
AVIFileInit();
|
||||||
|
AVIFileExit();
|
||||||
|
return 0;
|
||||||
|
}
|
11
cmake/checks/win32uitest.cpp
Normal file
11
cmake/checks/win32uitest.cpp
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
CreateWindow(NULL /*lpClassName*/, NULL /*lpWindowName*/, 0 /*dwStyle*/, 0 /*x*/,
|
||||||
|
0 /*y*/, 0 /*nWidth*/, 0 /*nHeight*/, NULL /*hWndParent*/, NULL /*hMenu*/,
|
||||||
|
NULL /*hInstance*/, NULL /*lpParam*/);
|
||||||
|
DeleteDC(NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -13,6 +13,9 @@
|
|||||||
*/
|
*/
|
||||||
#cmakedefine HAVE_ALLOCA_H 1
|
#cmakedefine HAVE_ALLOCA_H 1
|
||||||
|
|
||||||
|
/* Video for Windows support */
|
||||||
|
#cmakedefine HAVE_VFW
|
||||||
|
|
||||||
/* V4L capturing support */
|
/* V4L capturing support */
|
||||||
#cmakedefine HAVE_CAMV4L
|
#cmakedefine HAVE_CAMV4L
|
||||||
|
|
||||||
@ -55,6 +58,9 @@
|
|||||||
/* GTK+ 2.0 Thread support */
|
/* GTK+ 2.0 Thread support */
|
||||||
#cmakedefine HAVE_GTHREAD
|
#cmakedefine HAVE_GTHREAD
|
||||||
|
|
||||||
|
/* Win32 UI */
|
||||||
|
#cmakedefine HAVE_WIN32UI
|
||||||
|
|
||||||
/* GTK+ 2.x toolkit */
|
/* GTK+ 2.x toolkit */
|
||||||
#cmakedefine HAVE_GTK
|
#cmakedefine HAVE_GTK
|
||||||
|
|
||||||
@ -205,8 +211,11 @@
|
|||||||
/* AMD's Basic Linear Algebra Subprograms Library*/
|
/* AMD's Basic Linear Algebra Subprograms Library*/
|
||||||
#cmakedefine HAVE_CLAMDBLAS
|
#cmakedefine HAVE_CLAMDBLAS
|
||||||
|
|
||||||
/* VideoInput library */
|
/* DirectShow Video Capture library */
|
||||||
#cmakedefine HAVE_VIDEOINPUT
|
#cmakedefine HAVE_DSHOW
|
||||||
|
|
||||||
|
/* Microsoft Media Foundation Capture library */
|
||||||
|
#cmakedefine HAVE_MSMF
|
||||||
|
|
||||||
/* XIMEA camera support */
|
/* XIMEA camera support */
|
||||||
#cmakedefine HAVE_XIMEA
|
#cmakedefine HAVE_XIMEA
|
||||||
|
2
doc/_themes/blue/layout.html
vendored
2
doc/_themes/blue/layout.html
vendored
@ -183,7 +183,7 @@
|
|||||||
{% if theme_lang == 'c' %}
|
{% if theme_lang == 'c' %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if theme_lang == 'cpp' %}
|
{% if theme_lang == 'cpp' %}
|
||||||
<li>Try the <a href="http://opencv.willowgarage.com/wiki/Welcome?action=AttachFile&do=get&target=opencv_cheatsheet.pdf">Cheatsheet</a>.</li>
|
<li>Try the <a href="http://docs.opencv.org/trunk/opencv_cheatsheet.pdf">Cheatsheet</a>.</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if theme_lang == 'py' %}
|
{% if theme_lang == 'py' %}
|
||||||
<li>Try the <a href="cookbook.html">Cookbook</a>.</li>
|
<li>Try the <a href="cookbook.html">Cookbook</a>.</li>
|
||||||
|
@ -13,7 +13,7 @@ In this tutorial you will learn how to:
|
|||||||
* Use the :descriptor_extractor:`DescriptorExtractor<>` interface in order to find the feature vector correspondent to the keypoints. Specifically:
|
* Use the :descriptor_extractor:`DescriptorExtractor<>` interface in order to find the feature vector correspondent to the keypoints. Specifically:
|
||||||
|
|
||||||
* Use :surf_descriptor_extractor:`SurfDescriptorExtractor<>` and its function :descriptor_extractor:`compute<>` to perform the required calculations.
|
* Use :surf_descriptor_extractor:`SurfDescriptorExtractor<>` and its function :descriptor_extractor:`compute<>` to perform the required calculations.
|
||||||
* Use a :brute_force_matcher:`BruteForceMatcher<>` to match the features vector
|
* Use a :brute_force_matcher:`BFMatcher<>` to match the features vector
|
||||||
* Use the function :draw_matches:`drawMatches<>` to draw the detected matches.
|
* Use the function :draw_matches:`drawMatches<>` to draw the detected matches.
|
||||||
|
|
||||||
|
|
||||||
@ -69,7 +69,7 @@ This tutorial code's is shown lines below. You can also download it from `here <
|
|||||||
extractor.compute( img_2, keypoints_2, descriptors_2 );
|
extractor.compute( img_2, keypoints_2, descriptors_2 );
|
||||||
|
|
||||||
//-- Step 3: Matching descriptor vectors with a brute force matcher
|
//-- Step 3: Matching descriptor vectors with a brute force matcher
|
||||||
BruteForceMatcher< L2<float> > matcher;
|
BFMatcher matcher(NORM_L2);
|
||||||
std::vector< DMatch > matches;
|
std::vector< DMatch > matches;
|
||||||
matcher.match( descriptors_1, descriptors_2, matches );
|
matcher.match( descriptors_1, descriptors_2, matches );
|
||||||
|
|
||||||
|
@ -48,10 +48,10 @@ The structure of package contents looks as follows:
|
|||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
OpenCV-2.4.4-android-sdk
|
OpenCV-2.4.5-android-sdk
|
||||||
|_ apk
|
|_ apk
|
||||||
| |_ OpenCV_2.4.4_binary_pack_armv7a.apk
|
| |_ OpenCV_2.4.5_binary_pack_armv7a.apk
|
||||||
| |_ OpenCV_2.4.4_Manager_2.6_XXX.apk
|
| |_ OpenCV_2.4.5_Manager_2.7_XXX.apk
|
||||||
|
|
|
|
||||||
|_ doc
|
|_ doc
|
||||||
|_ samples
|
|_ samples
|
||||||
@ -157,10 +157,10 @@ Get the OpenCV4Android SDK
|
|||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
unzip ~/Downloads/OpenCV-2.4.4-android-sdk.zip
|
unzip ~/Downloads/OpenCV-2.4.5-android-sdk.zip
|
||||||
|
|
||||||
.. |opencv_android_bin_pack| replace:: :file:`OpenCV-2.4.4-android-sdk.zip`
|
.. |opencv_android_bin_pack| replace:: :file:`OpenCV-2.4.5-android-sdk.zip`
|
||||||
.. _opencv_android_bin_pack_url: http://sourceforge.net/projects/opencvlibrary/files/opencv-android/2.4.4/OpenCV-2.4.4-android-sdk.zip/download
|
.. _opencv_android_bin_pack_url: http://sourceforge.net/projects/opencvlibrary/files/opencv-android/2.4.5/OpenCV-2.4.5-android-sdk.zip/download
|
||||||
.. |opencv_android_bin_pack_url| replace:: |opencv_android_bin_pack|
|
.. |opencv_android_bin_pack_url| replace:: |opencv_android_bin_pack|
|
||||||
.. |seven_zip| replace:: 7-Zip
|
.. |seven_zip| replace:: 7-Zip
|
||||||
.. _seven_zip: http://www.7-zip.org/
|
.. _seven_zip: http://www.7-zip.org/
|
||||||
@ -295,7 +295,7 @@ Well, running samples from Eclipse is very simple:
|
|||||||
.. code-block:: sh
|
.. code-block:: sh
|
||||||
:linenos:
|
:linenos:
|
||||||
|
|
||||||
<Android SDK path>/platform-tools/adb install <OpenCV4Android SDK path>/apk/OpenCV_2.4.4_Manager_2.6_armv7a-neon.apk
|
<Android SDK path>/platform-tools/adb install <OpenCV4Android SDK path>/apk/OpenCV_2.4.5_Manager_2.7_armv7a-neon.apk
|
||||||
|
|
||||||
.. note:: ``armeabi``, ``armv7a-neon``, ``arm7a-neon-android8``, ``mips`` and ``x86`` stand for
|
.. note:: ``armeabi``, ``armv7a-neon``, ``arm7a-neon-android8``, ``mips`` and ``x86`` stand for
|
||||||
platform targets:
|
platform targets:
|
||||||
|
@ -55,14 +55,14 @@ Manager to access OpenCV libraries externally installed in the target system.
|
|||||||
:guilabel:`File -> Import -> Existing project in your workspace`.
|
:guilabel:`File -> Import -> Existing project in your workspace`.
|
||||||
|
|
||||||
Press :guilabel:`Browse` button and locate OpenCV4Android SDK
|
Press :guilabel:`Browse` button and locate OpenCV4Android SDK
|
||||||
(:file:`OpenCV-2.4.4-android-sdk/sdk`).
|
(:file:`OpenCV-2.4.5-android-sdk/sdk`).
|
||||||
|
|
||||||
.. image:: images/eclipse_opencv_dependency0.png
|
.. image:: images/eclipse_opencv_dependency0.png
|
||||||
:alt: Add dependency from OpenCV library
|
:alt: Add dependency from OpenCV library
|
||||||
:align: center
|
:align: center
|
||||||
|
|
||||||
#. In application project add a reference to the OpenCV Java SDK in
|
#. In application project add a reference to the OpenCV Java SDK in
|
||||||
:guilabel:`Project -> Properties -> Android -> Library -> Add` select ``OpenCV Library - 2.4.4``.
|
:guilabel:`Project -> Properties -> Android -> Library -> Add` select ``OpenCV Library - 2.4.5``.
|
||||||
|
|
||||||
.. image:: images/eclipse_opencv_dependency1.png
|
.. image:: images/eclipse_opencv_dependency1.png
|
||||||
:alt: Add dependency from OpenCV library
|
:alt: Add dependency from OpenCV library
|
||||||
@ -101,7 +101,7 @@ See the "15-puzzle" OpenCV sample for details.
|
|||||||
public void onResume()
|
public void onResume()
|
||||||
{
|
{
|
||||||
super.onResume();
|
super.onResume();
|
||||||
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
|
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_5, this, mLoaderCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
...
|
...
|
||||||
@ -128,27 +128,27 @@ described above.
|
|||||||
#. Add the OpenCV library project to your workspace the same way as for the async initialization
|
#. 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`,
|
above. Use menu :guilabel:`File -> Import -> Existing project in your workspace`,
|
||||||
press :guilabel:`Browse` button and select OpenCV SDK path
|
press :guilabel:`Browse` button and select OpenCV SDK path
|
||||||
(:file:`OpenCV-2.4.4-android-sdk/sdk`).
|
(:file:`OpenCV-2.4.5-android-sdk/sdk`).
|
||||||
|
|
||||||
.. image:: images/eclipse_opencv_dependency0.png
|
.. image:: images/eclipse_opencv_dependency0.png
|
||||||
:alt: Add dependency from OpenCV library
|
:alt: Add dependency from OpenCV library
|
||||||
:align: center
|
:align: center
|
||||||
|
|
||||||
#. In the application project add a reference to the OpenCV4Android SDK in
|
#. In the application project add a reference to the OpenCV4Android SDK in
|
||||||
:guilabel:`Project -> Properties -> Android -> Library -> Add` select ``OpenCV Library - 2.4.4``;
|
:guilabel:`Project -> Properties -> Android -> Library -> Add` select ``OpenCV Library - 2.4.5``;
|
||||||
|
|
||||||
.. image:: images/eclipse_opencv_dependency1.png
|
.. image:: images/eclipse_opencv_dependency1.png
|
||||||
:alt: Add dependency from OpenCV library
|
:alt: Add dependency from OpenCV library
|
||||||
:align: center
|
:align: center
|
||||||
|
|
||||||
#. If your application project **doesn't have a JNI part**, just copy the corresponding OpenCV
|
#. If your application project **doesn't have a JNI part**, just copy the corresponding OpenCV
|
||||||
native libs from :file:`<OpenCV-2.4.4-android-sdk>/sdk/native/libs/<target_arch>` to your
|
native libs from :file:`<OpenCV-2.4.5-android-sdk>/sdk/native/libs/<target_arch>` to your
|
||||||
project directory to folder :file:`libs/<target_arch>`.
|
project directory to folder :file:`libs/<target_arch>`.
|
||||||
|
|
||||||
In case of the application project **with a JNI part**, instead of manual libraries copying you
|
In case of the application project **with a JNI part**, instead of manual libraries copying you
|
||||||
need to modify your ``Android.mk`` file:
|
need to modify your ``Android.mk`` file:
|
||||||
add the following two code lines after the ``"include $(CLEAR_VARS)"`` and before
|
add the following two code lines after the ``"include $(CLEAR_VARS)"`` and before
|
||||||
``"include path_to_OpenCV-2.4.4-android-sdk/sdk/native/jni/OpenCV.mk"``
|
``"include path_to_OpenCV-2.4.5-android-sdk/sdk/native/jni/OpenCV.mk"``
|
||||||
|
|
||||||
.. code-block:: make
|
.. code-block:: make
|
||||||
:linenos:
|
:linenos:
|
||||||
@ -221,7 +221,7 @@ taken:
|
|||||||
|
|
||||||
.. code-block:: make
|
.. code-block:: make
|
||||||
|
|
||||||
include C:\Work\OpenCV4Android\OpenCV-2.4.4-android-sdk\sdk\native\jni\OpenCV.mk
|
include C:\Work\OpenCV4Android\OpenCV-2.4.5-android-sdk\sdk\native\jni\OpenCV.mk
|
||||||
|
|
||||||
Should be inserted into the :file:`jni/Android.mk` file **after** this line:
|
Should be inserted into the :file:`jni/Android.mk` file **after** this line:
|
||||||
|
|
||||||
|
@ -201,8 +201,6 @@ Assuming that the image to use as the argument would be located in <DisplayImage
|
|||||||
V2: Using CMake+OpenCV with Eclipse (plugin CDT)
|
V2: Using CMake+OpenCV with Eclipse (plugin CDT)
|
||||||
==================================================
|
==================================================
|
||||||
|
|
||||||
(See the `getting started <http://opencv.willowgarage.com/wiki/Getting_started>` section of the OpenCV Wiki)
|
|
||||||
|
|
||||||
Say you have or create a new file, *helloworld.cpp* in a directory called *foo*:
|
Say you have or create a new file, *helloworld.cpp* in a directory called *foo*:
|
||||||
|
|
||||||
.. code-block:: cpp
|
.. code-block:: cpp
|
||||||
|
@ -239,7 +239,7 @@ protected:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
TEST(Calib3d_SolvePnPRansac, accuracy) { CV_solvePnPRansac_Test test; test.safe_run(); }
|
TEST(DISABLED_Calib3d_SolvePnPRansac, accuracy) { CV_solvePnPRansac_Test test; test.safe_run(); }
|
||||||
TEST(Calib3d_SolvePnP, accuracy) { CV_solvePnP_Test test; test.safe_run(); }
|
TEST(Calib3d_SolvePnP, accuracy) { CV_solvePnP_Test test; test.safe_run(); }
|
||||||
|
|
||||||
|
|
||||||
|
@ -460,14 +460,29 @@ void CV_StereoMatchingTest::run(int)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
int dispScaleFactor = datasetsParams[datasetName].dispScaleFactor;
|
int dispScaleFactor = datasetsParams[datasetName].dispScaleFactor;
|
||||||
Mat tmp; trueLeftDisp.convertTo( tmp, CV_32FC1, 1.f/dispScaleFactor ); trueLeftDisp = tmp; tmp.release();
|
Mat tmp;
|
||||||
|
|
||||||
|
trueLeftDisp.convertTo( tmp, CV_32FC1, 1.f/dispScaleFactor );
|
||||||
|
trueLeftDisp = tmp;
|
||||||
|
tmp.release();
|
||||||
|
|
||||||
if( !trueRightDisp.empty() )
|
if( !trueRightDisp.empty() )
|
||||||
trueRightDisp.convertTo( tmp, CV_32FC1, 1.f/dispScaleFactor ); trueRightDisp = tmp; tmp.release();
|
{
|
||||||
|
trueRightDisp.convertTo( tmp, CV_32FC1, 1.f/dispScaleFactor );
|
||||||
|
trueRightDisp = tmp;
|
||||||
|
tmp.release();
|
||||||
|
}
|
||||||
|
|
||||||
Mat leftDisp, rightDisp;
|
Mat leftDisp, rightDisp;
|
||||||
int ignBorder = max(runStereoMatchingAlgorithm(leftImg, rightImg, leftDisp, rightDisp, ci), EVAL_IGNORE_BORDER);
|
int ignBorder = max(runStereoMatchingAlgorithm(leftImg, rightImg, leftDisp, rightDisp, ci), EVAL_IGNORE_BORDER);
|
||||||
leftDisp.convertTo( tmp, CV_32FC1 ); leftDisp = tmp; tmp.release();
|
|
||||||
rightDisp.convertTo( tmp, CV_32FC1 ); rightDisp = tmp; tmp.release();
|
leftDisp.convertTo( tmp, CV_32FC1 );
|
||||||
|
leftDisp = tmp;
|
||||||
|
tmp.release();
|
||||||
|
|
||||||
|
rightDisp.convertTo( tmp, CV_32FC1 );
|
||||||
|
rightDisp = tmp;
|
||||||
|
tmp.release();
|
||||||
|
|
||||||
int tempCode = processStereoMatchingResults( resFS, ci, isWrite,
|
int tempCode = processStereoMatchingResults( resFS, ci, isWrite,
|
||||||
leftImg, rightImg, trueLeftDisp, trueRightDisp, leftDisp, rightDisp, QualityEvalParams(ignBorder));
|
leftImg, rightImg, trueLeftDisp, trueRightDisp, leftDisp, rightDisp, QualityEvalParams(ignBorder));
|
||||||
@ -531,7 +546,8 @@ int CV_StereoMatchingTest::processStereoMatchingResults( FileStorage& fs, int ca
|
|||||||
// rightDisp is not used in current test virsion
|
// rightDisp is not used in current test virsion
|
||||||
int code = cvtest::TS::OK;
|
int code = cvtest::TS::OK;
|
||||||
assert( fs.isOpened() );
|
assert( fs.isOpened() );
|
||||||
assert( trueLeftDisp.type() == CV_32FC1 && trueRightDisp.type() == CV_32FC1 );
|
assert( trueLeftDisp.type() == CV_32FC1 );
|
||||||
|
assert( trueRightDisp.empty() || trueRightDisp.type() == CV_32FC1 );
|
||||||
assert( leftDisp.type() == CV_32FC1 && rightDisp.type() == CV_32FC1 );
|
assert( leftDisp.type() == CV_32FC1 && rightDisp.type() == CV_32FC1 );
|
||||||
|
|
||||||
// get masks for unknown ground truth disparity values
|
// get masks for unknown ground truth disparity values
|
||||||
|
@ -7,7 +7,7 @@ Face Recognition with OpenCV
|
|||||||
Introduction
|
Introduction
|
||||||
============
|
============
|
||||||
|
|
||||||
`OpenCV (Open Source Computer Vision) <http://opencv.willowgarage.com>`_ is a popular computer vision library started by `Intel <http://www.intel.com>`_ in 1999. The cross-platform library sets its focus on real-time image processing and includes patent-free implementations of the latest computer vision algorithms. In 2008 `Willow Garage <http://www.willowgarage.com>`_ took over support and OpenCV 2.3.1 now comes with a programming interface to C, C++, `Python <http://www.python.org>`_ and `Android <http://www.android.com>`_. OpenCV is released under a BSD license so it is used in academic projects and commercial products alike.
|
`OpenCV (Open Source Computer Vision) <http://opencv.org>`_ is a popular computer vision library started by `Intel <http://www.intel.com>`_ in 1999. The cross-platform library sets its focus on real-time image processing and includes patent-free implementations of the latest computer vision algorithms. In 2008 `Willow Garage <http://www.willowgarage.com>`_ took over support and OpenCV 2.3.1 now comes with a programming interface to C, C++, `Python <http://www.python.org>`_ and `Android <http://www.android.com>`_. OpenCV is released under a BSD license so it is used in academic projects and commercial products alike.
|
||||||
|
|
||||||
OpenCV 2.4 now comes with the very new :ocv:class:`FaceRecognizer` class for face recognition, so you can start experimenting with face recognition right away. This document is the guide I've wished for, when I was working myself into face recognition. It shows you how to perform face recognition with :ocv:class:`FaceRecognizer` in OpenCV (with full source code listings) and gives you an introduction into the algorithms behind. I'll also show how to create the visualizations you can find in many publications, because a lot of people asked for.
|
OpenCV 2.4 now comes with the very new :ocv:class:`FaceRecognizer` class for face recognition, so you can start experimenting with face recognition right away. This document is the guide I've wished for, when I was working myself into face recognition. It shows you how to perform face recognition with :ocv:class:`FaceRecognizer` in OpenCV (with full source code listings) and gives you an introduction into the algorithms behind. I'll also show how to create the visualizations you can find in many publications, because a lot of people asked for.
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ project(facerec_cpp_samples)
|
|||||||
#SET(OpenCV_DIR /path/to/your/opencv/installation)
|
#SET(OpenCV_DIR /path/to/your/opencv/installation)
|
||||||
|
|
||||||
# packages
|
# packages
|
||||||
find_package(OpenCV REQUIRED) # http://opencv.willowgarage.com
|
find_package(OpenCV REQUIRED) # http://opencv.org
|
||||||
|
|
||||||
# probably you should loop through the sample files here
|
# probably you should loop through the sample files here
|
||||||
add_executable(facerec_demo facerec_demo.cpp)
|
add_executable(facerec_demo facerec_demo.cpp)
|
||||||
|
@ -1106,7 +1106,7 @@ void LevMarqSparse::bundleAdjust( std::vector<Point3d>& points, //positions of p
|
|||||||
Mat rot_vec = levmarP.rowRange(i*num_cam_param, i*num_cam_param+3);
|
Mat rot_vec = levmarP.rowRange(i*num_cam_param, i*num_cam_param+3);
|
||||||
Rodrigues( rot_vec, R[i] );
|
Rodrigues( rot_vec, R[i] );
|
||||||
//translation
|
//translation
|
||||||
T[i] = levmarP.rowRange(i*num_cam_param + 3, i*num_cam_param+6);
|
levmarP.rowRange(i*num_cam_param + 3, i*num_cam_param+6).copyTo(T[i]);
|
||||||
|
|
||||||
//intrinsic camera matrix
|
//intrinsic camera matrix
|
||||||
double* intr_data = (double*)cameraMatrix[i].data;
|
double* intr_data = (double*)cameraMatrix[i].data;
|
||||||
|
@ -380,6 +380,7 @@ void CvFuzzyMeanShiftTracker::SearchWindow::initDepthValues(IplImage *maskImage,
|
|||||||
{
|
{
|
||||||
if (*depthData)
|
if (*depthData)
|
||||||
{
|
{
|
||||||
|
d = *depthData;
|
||||||
m1 += d;
|
m1 += d;
|
||||||
if (d < mind)
|
if (d < mind)
|
||||||
mind = d;
|
mind = d;
|
||||||
|
@ -4,7 +4,7 @@ Introduction
|
|||||||
|
|
||||||
.. highlight:: cpp
|
.. highlight:: cpp
|
||||||
|
|
||||||
OpenCV (Open Source Computer Vision Library: http://opencv.willowgarage.com/wiki/) is an open-source BSD-licensed library that includes several hundreds of computer vision algorithms. The document describes the so-called OpenCV 2.x API, which is essentially a C++ API, as opposite to the C-based OpenCV 1.x API. The latter is described in opencv1x.pdf.
|
OpenCV (Open Source Computer Vision Library: http://opencv.org) is an open-source BSD-licensed library that includes several hundreds of computer vision algorithms. The document describes the so-called OpenCV 2.x API, which is essentially a C++ API, as opposite to the C-based OpenCV 1.x API. The latter is described in opencv1x.pdf.
|
||||||
|
|
||||||
OpenCV has a modular structure, which means that the package includes several shared or static libraries. The following modules are available:
|
OpenCV has a modular structure, which means that the package includes several shared or static libraries. The following modules are available:
|
||||||
|
|
||||||
|
@ -360,6 +360,8 @@ CV_INLINE int cvRound( double value )
|
|||||||
fistp t;
|
fistp t;
|
||||||
}
|
}
|
||||||
return t;
|
return t;
|
||||||
|
#elif defined _MSC_VER && defined _M_ARM && defined HAVE_TEGRA_OPTIMIZATION
|
||||||
|
TEGRA_ROUND(value);
|
||||||
#elif defined HAVE_LRINT || defined CV_ICC || defined __GNUC__
|
#elif defined HAVE_LRINT || defined CV_ICC || defined __GNUC__
|
||||||
# ifdef HAVE_TEGRA_OPTIMIZATION
|
# ifdef HAVE_TEGRA_OPTIMIZATION
|
||||||
TEGRA_ROUND(value);
|
TEGRA_ROUND(value);
|
||||||
@ -367,8 +369,12 @@ CV_INLINE int cvRound( double value )
|
|||||||
return (int)lrint(value);
|
return (int)lrint(value);
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
// while this is not IEEE754-compliant rounding, it's usually a good enough approximation
|
double intpart, fractpart;
|
||||||
|
fractpart = modf(value, &intpart);
|
||||||
|
if ((fabs(fractpart) != 0.5) || ((((int)intpart) % 2) != 0))
|
||||||
return (int)(value + (value >= 0 ? 0.5 : -0.5));
|
return (int)(value + (value >= 0 ? 0.5 : -0.5));
|
||||||
|
else
|
||||||
|
return (int)intpart;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1704,6 +1704,7 @@ public:
|
|||||||
SparseMatConstIterator_();
|
SparseMatConstIterator_();
|
||||||
//! the full constructor setting the iterator to the first sparse matrix element
|
//! the full constructor setting the iterator to the first sparse matrix element
|
||||||
SparseMatConstIterator_(const SparseMat_<_Tp>* _m);
|
SparseMatConstIterator_(const SparseMat_<_Tp>* _m);
|
||||||
|
SparseMatConstIterator_(const SparseMat* _m);
|
||||||
//! the copy constructor
|
//! the copy constructor
|
||||||
SparseMatConstIterator_(const SparseMatConstIterator_& it);
|
SparseMatConstIterator_(const SparseMatConstIterator_& it);
|
||||||
|
|
||||||
@ -1740,6 +1741,7 @@ public:
|
|||||||
SparseMatIterator_();
|
SparseMatIterator_();
|
||||||
//! the full constructor setting the iterator to the first sparse matrix element
|
//! the full constructor setting the iterator to the first sparse matrix element
|
||||||
SparseMatIterator_(SparseMat_<_Tp>* _m);
|
SparseMatIterator_(SparseMat_<_Tp>* _m);
|
||||||
|
SparseMatIterator_(SparseMat* _m);
|
||||||
//! the copy constructor
|
//! the copy constructor
|
||||||
SparseMatIterator_(const SparseMatIterator_& it);
|
SparseMatIterator_(const SparseMatIterator_& it);
|
||||||
|
|
||||||
|
@ -2587,6 +2587,13 @@ SparseMatConstIterator_<_Tp>::SparseMatConstIterator_(const SparseMat_<_Tp>* _m)
|
|||||||
: SparseMatConstIterator(_m)
|
: SparseMatConstIterator(_m)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
template<typename _Tp> inline
|
||||||
|
SparseMatConstIterator_<_Tp>::SparseMatConstIterator_(const SparseMat* _m)
|
||||||
|
: SparseMatConstIterator(_m)
|
||||||
|
{
|
||||||
|
CV_Assert( _m->type() == DataType<_Tp>::type );
|
||||||
|
}
|
||||||
|
|
||||||
template<typename _Tp> inline
|
template<typename _Tp> inline
|
||||||
SparseMatConstIterator_<_Tp>::SparseMatConstIterator_(const SparseMatConstIterator_<_Tp>& it)
|
SparseMatConstIterator_<_Tp>::SparseMatConstIterator_(const SparseMatConstIterator_<_Tp>& it)
|
||||||
: SparseMatConstIterator(it)
|
: SparseMatConstIterator(it)
|
||||||
@ -2634,6 +2641,11 @@ SparseMatIterator_<_Tp>::SparseMatIterator_(SparseMat_<_Tp>* _m)
|
|||||||
: SparseMatConstIterator_<_Tp>(_m)
|
: SparseMatConstIterator_<_Tp>(_m)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
template<typename _Tp> inline
|
||||||
|
SparseMatIterator_<_Tp>::SparseMatIterator_(SparseMat* _m)
|
||||||
|
: SparseMatConstIterator_<_Tp>(_m)
|
||||||
|
{}
|
||||||
|
|
||||||
template<typename _Tp> inline
|
template<typename _Tp> inline
|
||||||
SparseMatIterator_<_Tp>::SparseMatIterator_(const SparseMatIterator_<_Tp>& it)
|
SparseMatIterator_<_Tp>::SparseMatIterator_(const SparseMatIterator_<_Tp>& it)
|
||||||
: SparseMatConstIterator_<_Tp>(it)
|
: SparseMatConstIterator_<_Tp>(it)
|
||||||
|
@ -577,10 +577,10 @@ JacobiSVDImpl_(_Tp* At, size_t astep, _Tp* _W, _Tp* Vt, size_t vstep,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
p *= 2;
|
p *= 2;
|
||||||
double beta = a - b, gamma = hypot((double)p, beta), delta;
|
double beta = a - b, gamma = hypot((double)p, beta);
|
||||||
if( beta < 0 )
|
if( beta < 0 )
|
||||||
{
|
{
|
||||||
delta = (gamma - beta)*0.5;
|
double delta = (gamma - beta)*0.5;
|
||||||
s = (_Tp)std::sqrt(delta/gamma);
|
s = (_Tp)std::sqrt(delta/gamma);
|
||||||
c = (_Tp)(p/(gamma*s*2));
|
c = (_Tp)(p/(gamma*s*2));
|
||||||
}
|
}
|
||||||
@ -588,25 +588,8 @@ JacobiSVDImpl_(_Tp* At, size_t astep, _Tp* _W, _Tp* Vt, size_t vstep,
|
|||||||
{
|
{
|
||||||
c = (_Tp)std::sqrt((gamma + beta)/(gamma*2));
|
c = (_Tp)std::sqrt((gamma + beta)/(gamma*2));
|
||||||
s = (_Tp)(p/(gamma*c*2));
|
s = (_Tp)(p/(gamma*c*2));
|
||||||
delta = p*p*0.5/(gamma + beta);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
W[i] += delta;
|
|
||||||
W[j] -= delta;
|
|
||||||
|
|
||||||
if( iter % 2 != 0 && W[i] > 0 && W[j] > 0 )
|
|
||||||
{
|
|
||||||
k = vblas.givens(Ai, Aj, m, c, s);
|
|
||||||
|
|
||||||
for( ; k < m; k++ )
|
|
||||||
{
|
|
||||||
_Tp t0 = c*Ai[k] + s*Aj[k];
|
|
||||||
_Tp t1 = -s*Ai[k] + c*Aj[k];
|
|
||||||
Ai[k] = t0; Aj[k] = t1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
a = b = 0;
|
a = b = 0;
|
||||||
for( k = 0; k < m; k++ )
|
for( k = 0; k < m; k++ )
|
||||||
{
|
{
|
||||||
@ -617,7 +600,6 @@ JacobiSVDImpl_(_Tp* At, size_t astep, _Tp* _W, _Tp* Vt, size_t vstep,
|
|||||||
a += (double)t0*t0; b += (double)t1*t1;
|
a += (double)t0*t0; b += (double)t1*t1;
|
||||||
}
|
}
|
||||||
W[i] = a; W[j] = b;
|
W[i] = a; W[j] = b;
|
||||||
}
|
|
||||||
|
|
||||||
changed = true;
|
changed = true;
|
||||||
|
|
||||||
|
@ -324,7 +324,7 @@ void MatOp::augAssignXor(const MatExpr& expr, Mat& m) const
|
|||||||
{
|
{
|
||||||
Mat temp;
|
Mat temp;
|
||||||
expr.op->assign(expr, temp);
|
expr.op->assign(expr, temp);
|
||||||
m /= temp;
|
m ^= temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -183,7 +183,7 @@ static void finalizeHdr(Mat& m)
|
|||||||
void Mat::create(int d, const int* _sizes, int _type)
|
void Mat::create(int d, const int* _sizes, int _type)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
CV_Assert(0 <= d && _sizes && d <= CV_MAX_DIM && _sizes);
|
CV_Assert(0 <= d && d <= CV_MAX_DIM && _sizes);
|
||||||
_type = CV_MAT_TYPE(_type);
|
_type = CV_MAT_TYPE(_type);
|
||||||
|
|
||||||
if( data && (d == dims || (d == 1 && dims <= 2)) && _type == type() )
|
if( data && (d == dims || (d == 1 && dims <= 2)) && _type == type() )
|
||||||
|
@ -1551,3 +1551,16 @@ TEST(Core_Add, AddToColumnWhen4Rows)
|
|||||||
|
|
||||||
ASSERT_EQ(0, countNonZero(m1 - m2));
|
ASSERT_EQ(0, countNonZero(m1 - m2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(Core_round, CvRound)
|
||||||
|
{
|
||||||
|
ASSERT_EQ(2, cvRound(2.0));
|
||||||
|
ASSERT_EQ(2, cvRound(2.1));
|
||||||
|
ASSERT_EQ(-2, cvRound(-2.1));
|
||||||
|
ASSERT_EQ(3, cvRound(2.8));
|
||||||
|
ASSERT_EQ(-3, cvRound(-2.8));
|
||||||
|
ASSERT_EQ(2, cvRound(2.5));
|
||||||
|
ASSERT_EQ(4, cvRound(3.5));
|
||||||
|
ASSERT_EQ(-2, cvRound(-2.5));
|
||||||
|
ASSERT_EQ(-4, cvRound(-3.5));
|
||||||
|
}
|
||||||
|
@ -48,7 +48,7 @@ Maximally stable extremal region extractor. ::
|
|||||||
};
|
};
|
||||||
|
|
||||||
The class encapsulates all the parameters of the MSER extraction algorithm (see
|
The class encapsulates all the parameters of the MSER extraction algorithm (see
|
||||||
http://en.wikipedia.org/wiki/Maximally_stable_extremal_regions). Also see http://opencv.willowgarage.com/wiki/documentation/cpp/features2d/MSER for useful comments and parameters description.
|
http://en.wikipedia.org/wiki/Maximally_stable_extremal_regions). Also see http://code.opencv.org/projects/opencv/wiki/MSER for useful comments and parameters description.
|
||||||
|
|
||||||
|
|
||||||
ORB
|
ORB
|
||||||
|
@ -69,7 +69,7 @@ struct KeypointResponseGreater
|
|||||||
void KeyPointsFilter::retainBest(std::vector<KeyPoint>& keypoints, int n_points)
|
void KeyPointsFilter::retainBest(std::vector<KeyPoint>& keypoints, int n_points)
|
||||||
{
|
{
|
||||||
//this is only necessary if the keypoints size is greater than the number of desired points.
|
//this is only necessary if the keypoints size is greater than the number of desired points.
|
||||||
if( n_points > 0 && keypoints.size() > (size_t)n_points )
|
if( n_points >= 0 && keypoints.size() > (size_t)n_points )
|
||||||
{
|
{
|
||||||
if (n_points==0)
|
if (n_points==0)
|
||||||
{
|
{
|
||||||
|
@ -421,7 +421,6 @@ struct Hamming
|
|||||||
ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType /*worst_dist*/ = -1) const
|
ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType /*worst_dist*/ = -1) const
|
||||||
{
|
{
|
||||||
ResultType result = 0;
|
ResultType result = 0;
|
||||||
#ifdef __GNUC__
|
|
||||||
#ifdef __ARM_NEON__
|
#ifdef __ARM_NEON__
|
||||||
{
|
{
|
||||||
uint32x4_t bits = vmovq_n_u32(0);
|
uint32x4_t bits = vmovq_n_u32(0);
|
||||||
@ -438,7 +437,7 @@ struct Hamming
|
|||||||
result = vgetq_lane_s32 (vreinterpretq_s32_u64(bitSet2),0);
|
result = vgetq_lane_s32 (vreinterpretq_s32_u64(bitSet2),0);
|
||||||
result += vgetq_lane_s32 (vreinterpretq_s32_u64(bitSet2),2);
|
result += vgetq_lane_s32 (vreinterpretq_s32_u64(bitSet2),2);
|
||||||
}
|
}
|
||||||
#else
|
#elif __GNUC__
|
||||||
{
|
{
|
||||||
//for portability just use unsigned long -- and use the __builtin_popcountll (see docs for __builtin_popcountll)
|
//for portability just use unsigned long -- and use the __builtin_popcountll (see docs for __builtin_popcountll)
|
||||||
typedef unsigned long long pop_t;
|
typedef unsigned long long pop_t;
|
||||||
@ -458,8 +457,8 @@ struct Hamming
|
|||||||
result += __builtin_popcountll(a_final ^ b_final);
|
result += __builtin_popcountll(a_final ^ b_final);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif //NEON
|
#else // NO NEON and NOT GNUC
|
||||||
#else
|
typedef unsigned long long pop_t;
|
||||||
HammingLUT lut;
|
HammingLUT lut;
|
||||||
result = lut(reinterpret_cast<const unsigned char*> (a),
|
result = lut(reinterpret_cast<const unsigned char*> (a),
|
||||||
reinterpret_cast<const unsigned char*> (b), size * sizeof(pop_t));
|
reinterpret_cast<const unsigned char*> (b), size * sizeof(pop_t));
|
||||||
|
@ -29,8 +29,6 @@ if(HAVE_CUDA)
|
|||||||
source_group("Src\\NVidia" FILES ${ncv_files})
|
source_group("Src\\NVidia" FILES ${ncv_files})
|
||||||
ocv_include_directories("src/nvidia" "src/nvidia/core" "src/nvidia/NPP_staging" ${CUDA_INCLUDE_DIRS})
|
ocv_include_directories("src/nvidia" "src/nvidia/core" "src/nvidia/NPP_staging" ${CUDA_INCLUDE_DIRS})
|
||||||
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef -Wmissing-declarations -Wshadow -Wunused-parameter /wd4211 /wd4201 /wd4100 /wd4505 /wd4408)
|
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef -Wmissing-declarations -Wshadow -Wunused-parameter /wd4211 /wd4201 /wd4100 /wd4505 /wd4408)
|
||||||
string(REPLACE "-Wsign-promo" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
|
||||||
#set (CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} "-Xcompiler;/EHsc-;")
|
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
if(NOT ENABLE_NOISY_WARNINGS)
|
if(NOT ENABLE_NOISY_WARNINGS)
|
||||||
|
@ -1007,7 +1007,7 @@ PERF_TEST_P(Video_Cn_MaxFeatures, Video_GMG,
|
|||||||
|
|
||||||
#if defined(HAVE_NVCUVID) && BUILD_WITH_VIDEO_INPUT_SUPPORT
|
#if defined(HAVE_NVCUVID) && BUILD_WITH_VIDEO_INPUT_SUPPORT
|
||||||
|
|
||||||
PERF_TEST_P(Video, Video_VideoReader, Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"))
|
PERF_TEST_P(Video, DISABLED_Video_VideoReader, Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"))
|
||||||
{
|
{
|
||||||
declare.time(20);
|
declare.time(20);
|
||||||
|
|
||||||
@ -1044,7 +1044,7 @@ PERF_TEST_P(Video, Video_VideoReader, Values("gpu/video/768x576.avi", "gpu/video
|
|||||||
|
|
||||||
#if defined(HAVE_NVCUVID) && defined(WIN32)
|
#if defined(HAVE_NVCUVID) && defined(WIN32)
|
||||||
|
|
||||||
PERF_TEST_P(Video, Video_VideoWriter, Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"))
|
PERF_TEST_P(Video, DISABLED_Video_VideoWriter, Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"))
|
||||||
{
|
{
|
||||||
declare.time(30);
|
declare.time(30);
|
||||||
|
|
||||||
|
@ -1793,10 +1793,10 @@ void cv::gpu::exp(const GpuMat& src, GpuMat& dst, Stream& stream)
|
|||||||
|
|
||||||
namespace arithm
|
namespace arithm
|
||||||
{
|
{
|
||||||
void cmpMatEq_v4(PtrStepSz<uint> src1, PtrStepSz<uint> src2, PtrStepSz<uint> dst, cudaStream_t stream);
|
void cmpMatEq_v4(PtrStepSz<unsigned int> src1, PtrStepSz<unsigned int> src2, PtrStepSz<unsigned int> dst, cudaStream_t stream);
|
||||||
void cmpMatNe_v4(PtrStepSz<uint> src1, PtrStepSz<uint> src2, PtrStepSz<uint> dst, cudaStream_t stream);
|
void cmpMatNe_v4(PtrStepSz<unsigned int> src1, PtrStepSz<unsigned int> src2, PtrStepSz<unsigned int> dst, cudaStream_t stream);
|
||||||
void cmpMatLt_v4(PtrStepSz<uint> src1, PtrStepSz<uint> src2, PtrStepSz<uint> dst, cudaStream_t stream);
|
void cmpMatLt_v4(PtrStepSz<unsigned int> src1, PtrStepSz<unsigned int> src2, PtrStepSz<unsigned int> dst, cudaStream_t stream);
|
||||||
void cmpMatLe_v4(PtrStepSz<uint> src1, PtrStepSz<uint> src2, PtrStepSz<uint> dst, cudaStream_t stream);
|
void cmpMatLe_v4(PtrStepSz<unsigned int> src1, PtrStepSz<unsigned int> src2, PtrStepSz<unsigned int> dst, cudaStream_t stream);
|
||||||
|
|
||||||
template <typename T> void cmpMatEq(PtrStepSzb src1, PtrStepSzb src2, PtrStepSzb dst, cudaStream_t stream);
|
template <typename T> void cmpMatEq(PtrStepSzb src1, PtrStepSzb src2, PtrStepSzb dst, cudaStream_t stream);
|
||||||
template <typename T> void cmpMatNe(PtrStepSzb src1, PtrStepSzb src2, PtrStepSzb dst, cudaStream_t stream);
|
template <typename T> void cmpMatNe(PtrStepSzb src1, PtrStepSzb src2, PtrStepSzb dst, cudaStream_t stream);
|
||||||
@ -1820,7 +1820,7 @@ void cv::gpu::compare(const GpuMat& src1, const GpuMat& src2, GpuMat& dst, int c
|
|||||||
{cmpMatEq<double> , cmpMatNe<double> , cmpMatLt<double> , cmpMatLe<double> }
|
{cmpMatEq<double> , cmpMatNe<double> , cmpMatLt<double> , cmpMatLe<double> }
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void (*func_v4_t)(PtrStepSz<uint> src1, PtrStepSz<uint> src2, PtrStepSz<uint> dst, cudaStream_t stream);
|
typedef void (*func_v4_t)(PtrStepSz<unsigned int> src1, PtrStepSz<unsigned int> src2, PtrStepSz<unsigned int> dst, cudaStream_t stream);
|
||||||
static const func_v4_t funcs_v4[] =
|
static const func_v4_t funcs_v4[] =
|
||||||
{
|
{
|
||||||
cmpMatEq_v4, cmpMatNe_v4, cmpMatLt_v4, cmpMatLe_v4
|
cmpMatEq_v4, cmpMatNe_v4, cmpMatLt_v4, cmpMatLe_v4
|
||||||
|
@ -129,6 +129,17 @@ void cv::gpu::OpticalFlowDual_TVL1_GPU::operator ()(const GpuMat& I0, const GpuM
|
|||||||
gpu::multiply(u1s[s], Scalar::all(0.5), u1s[s]);
|
gpu::multiply(u1s[s], Scalar::all(0.5), u1s[s]);
|
||||||
gpu::multiply(u2s[s], Scalar::all(0.5), u2s[s]);
|
gpu::multiply(u2s[s], Scalar::all(0.5), u2s[s]);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
u1s[s].create(I0s[s].size(), CV_32FC1);
|
||||||
|
u2s[s].create(I0s[s].size(), CV_32FC1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!useInitialFlow)
|
||||||
|
{
|
||||||
|
u1s[nscales-1].setTo(Scalar::all(0));
|
||||||
|
u2s[nscales-1].setTo(Scalar::all(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
// pyramidal structure for computing the optical flow
|
// pyramidal structure for computing the optical flow
|
||||||
@ -173,18 +184,9 @@ void cv::gpu::OpticalFlowDual_TVL1_GPU::procOneScale(const GpuMat& I0, const Gpu
|
|||||||
|
|
||||||
CV_DbgAssert( I1.size() == I0.size() );
|
CV_DbgAssert( I1.size() == I0.size() );
|
||||||
CV_DbgAssert( I1.type() == I0.type() );
|
CV_DbgAssert( I1.type() == I0.type() );
|
||||||
CV_DbgAssert( u1.empty() || u1.size() == I0.size() );
|
CV_DbgAssert( u1.size() == I0.size() );
|
||||||
CV_DbgAssert( u2.size() == u1.size() );
|
CV_DbgAssert( u2.size() == u1.size() );
|
||||||
|
|
||||||
if (u1.empty())
|
|
||||||
{
|
|
||||||
u1.create(I0.size(), CV_32FC1);
|
|
||||||
u1.setTo(Scalar::all(0));
|
|
||||||
|
|
||||||
u2.create(I0.size(), CV_32FC1);
|
|
||||||
u2.setTo(Scalar::all(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
GpuMat I1x = I1x_buf(Rect(0, 0, I0.cols, I0.rows));
|
GpuMat I1x = I1x_buf(Rect(0, 0, I0.cols, I0.rows));
|
||||||
GpuMat I1y = I1y_buf(Rect(0, 0, I0.cols, I0.rows));
|
GpuMat I1y = I1y_buf(Rect(0, 0, I0.cols, I0.rows));
|
||||||
centeredGradient(I1, I1x, I1y);
|
centeredGradient(I1, I1x, I1y);
|
||||||
|
@ -95,7 +95,7 @@ if(HAVE_QT)
|
|||||||
if(${_have_flag})
|
if(${_have_flag})
|
||||||
set_source_files_properties(${_RCC_OUTFILES} PROPERTIES COMPILE_FLAGS -Wno-missing-declarations)
|
set_source_files_properties(${_RCC_OUTFILES} PROPERTIES COMPILE_FLAGS -Wno-missing-declarations)
|
||||||
endif()
|
endif()
|
||||||
elseif(WIN32)
|
elseif(HAVE_WIN32UI)
|
||||||
list(APPEND highgui_srcs src/window_w32.cpp)
|
list(APPEND highgui_srcs src/window_w32.cpp)
|
||||||
elseif(HAVE_GTK)
|
elseif(HAVE_GTK)
|
||||||
list(APPEND highgui_srcs src/window_gtk.cpp)
|
list(APPEND highgui_srcs src/window_gtk.cpp)
|
||||||
@ -111,9 +111,21 @@ elseif(APPLE)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32 AND NOT ARM)
|
||||||
list(APPEND highgui_srcs src/cap_vfw.cpp src/cap_cmu.cpp src/cap_dshow.cpp)
|
list(APPEND highgui_srcs src/cap_cmu.cpp)
|
||||||
endif(WIN32)
|
endif()
|
||||||
|
|
||||||
|
if (WIN32 AND HAVE_DSHOW)
|
||||||
|
list(APPEND highgui_srcs src/cap_dshow.cpp)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (WIN32 AND HAVE_MSMF)
|
||||||
|
list(APPEND highgui_srcs src/cap_msmf.cpp)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (WIN32 AND HAVE_VFW)
|
||||||
|
list(APPEND highgui_srcs src/cap_vfw.cpp)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(HAVE_XINE)
|
if(HAVE_XINE)
|
||||||
list(APPEND highgui_srcs src/cap_xine.cpp)
|
list(APPEND highgui_srcs src/cap_xine.cpp)
|
||||||
|
@ -298,6 +298,7 @@ enum
|
|||||||
CV_CAP_UNICAP =600, // Unicap drivers
|
CV_CAP_UNICAP =600, // Unicap drivers
|
||||||
|
|
||||||
CV_CAP_DSHOW =700, // DirectShow (via videoInput)
|
CV_CAP_DSHOW =700, // DirectShow (via videoInput)
|
||||||
|
CV_CAP_MSMF =1400, // Microsoft Media Foundation (via videoInput)
|
||||||
|
|
||||||
CV_CAP_PVAPI =800, // PvAPI, Prosilica GigE SDK
|
CV_CAP_PVAPI =800, // PvAPI, Prosilica GigE SDK
|
||||||
|
|
||||||
|
@ -20,9 +20,9 @@
|
|||||||
defined(HAVE_GSTREAMER) || \
|
defined(HAVE_GSTREAMER) || \
|
||||||
defined(HAVE_QUICKTIME) || \
|
defined(HAVE_QUICKTIME) || \
|
||||||
defined(HAVE_AVFOUNDATION) || \
|
defined(HAVE_AVFOUNDATION) || \
|
||||||
/*defined(HAVE_OPENNI) || too specialized */ \
|
|
||||||
defined(HAVE_FFMPEG) || \
|
defined(HAVE_FFMPEG) || \
|
||||||
defined(WIN32) /* assume that we have ffmpeg */
|
defined(HAVE_VFW)
|
||||||
|
/*defined(HAVE_OPENNI) too specialized */ \
|
||||||
|
|
||||||
# define BUILD_WITH_VIDEO_INPUT_SUPPORT 1
|
# define BUILD_WITH_VIDEO_INPUT_SUPPORT 1
|
||||||
#else
|
#else
|
||||||
@ -34,7 +34,7 @@
|
|||||||
defined(HAVE_QUICKTIME) || \
|
defined(HAVE_QUICKTIME) || \
|
||||||
defined(HAVE_AVFOUNDATION) || \
|
defined(HAVE_AVFOUNDATION) || \
|
||||||
defined(HAVE_FFMPEG) || \
|
defined(HAVE_FFMPEG) || \
|
||||||
defined(WIN32) /* assume that we have ffmpeg */
|
defined(HAVE_VFW)
|
||||||
# define BUILD_WITH_VIDEO_OUTPUT_SUPPORT 1
|
# define BUILD_WITH_VIDEO_OUTPUT_SUPPORT 1
|
||||||
#else
|
#else
|
||||||
# define BUILD_WITH_VIDEO_OUTPUT_SUPPORT 0
|
# define BUILD_WITH_VIDEO_OUTPUT_SUPPORT 0
|
||||||
|
@ -114,7 +114,7 @@ CV_IMPL CvCapture * cvCreateCameraCapture (int index)
|
|||||||
{
|
{
|
||||||
int domains[] =
|
int domains[] =
|
||||||
{
|
{
|
||||||
#ifdef HAVE_VIDEOINPUT
|
#ifdef HAVE_DSHOW
|
||||||
CV_CAP_DSHOW,
|
CV_CAP_DSHOW,
|
||||||
#endif
|
#endif
|
||||||
#if 1
|
#if 1
|
||||||
@ -168,7 +168,8 @@ CV_IMPL CvCapture * cvCreateCameraCapture (int index)
|
|||||||
// try every possibly installed camera API
|
// try every possibly installed camera API
|
||||||
for (int i = 0; domains[i] >= 0; i++)
|
for (int i = 0; domains[i] >= 0; i++)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_VIDEOINPUT) || \
|
#if defined(HAVE_DSHOW) || \
|
||||||
|
defined(HAVE_MSMF) || \
|
||||||
defined(HAVE_TYZX) || \
|
defined(HAVE_TYZX) || \
|
||||||
defined(HAVE_VFW) || \
|
defined(HAVE_VFW) || \
|
||||||
defined(HAVE_LIBV4L) || \
|
defined(HAVE_LIBV4L) || \
|
||||||
@ -195,7 +196,14 @@ CV_IMPL CvCapture * cvCreateCameraCapture (int index)
|
|||||||
|
|
||||||
switch (domains[i])
|
switch (domains[i])
|
||||||
{
|
{
|
||||||
#ifdef HAVE_VIDEOINPUT
|
#ifdef HAVE_MSMF
|
||||||
|
case CV_CAP_MSMF:
|
||||||
|
capture = cvCreateCameraCapture_MSMF (index);
|
||||||
|
if (capture)
|
||||||
|
return capture;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_DSHOW
|
||||||
case CV_CAP_DSHOW:
|
case CV_CAP_DSHOW:
|
||||||
capture = cvCreateCameraCapture_DShow (index);
|
capture = cvCreateCameraCapture_DShow (index);
|
||||||
if (capture)
|
if (capture)
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
|
|
||||||
#if (defined WIN32 || defined _WIN32) && defined HAVE_VIDEOINPUT
|
#if (defined WIN32 || defined _WIN32) && defined HAVE_DSHOW
|
||||||
|
|
||||||
/*
|
/*
|
||||||
DirectShow-based Video Capturing module is based on
|
DirectShow-based Video Capturing module is based on
|
||||||
@ -3098,6 +3098,7 @@ HRESULT videoInput::routeCrossbar(ICaptureGraphBuilder2 **ppBuild, IBaseFilter *
|
|||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/********************* Capturing video from camera via DirectShow *********************/
|
/********************* Capturing video from camera via DirectShow *********************/
|
||||||
|
|
||||||
class CvCaptureCAM_DShow : public CvCapture
|
class CvCaptureCAM_DShow : public CvCapture
|
||||||
|
@ -209,7 +209,7 @@ CvCapture* cvCreateFileCapture_FFMPEG_proxy(const char * filename)
|
|||||||
if( result->open( filename ))
|
if( result->open( filename ))
|
||||||
return result;
|
return result;
|
||||||
delete result;
|
delete result;
|
||||||
#if defined WIN32 || defined _WIN32
|
#ifdef HAVE_VFW
|
||||||
return cvCreateFileCapture_VFW(filename);
|
return cvCreateFileCapture_VFW(filename);
|
||||||
#else
|
#else
|
||||||
return 0;
|
return 0;
|
||||||
@ -263,9 +263,9 @@ CvVideoWriter* cvCreateVideoWriter_FFMPEG_proxy( const char* filename, int fourc
|
|||||||
if( result->open( filename, fourcc, fps, frameSize, isColor != 0 ))
|
if( result->open( filename, fourcc, fps, frameSize, isColor != 0 ))
|
||||||
return result;
|
return result;
|
||||||
delete result;
|
delete result;
|
||||||
#if defined WIN32 || defined _WIN32
|
#ifdef HAVE_VFW
|
||||||
return cvCreateVideoWriter_VFW(filename, fourcc, fps, frameSize, isColor);
|
return cvCreateVideoWriter_VFW(filename, fourcc, fps, frameSize, isColor);
|
||||||
#else
|
#else
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -153,6 +153,14 @@ extern "C" {
|
|||||||
#define AVERROR_EOF (-MKTAG( 'E','O','F',' '))
|
#define AVERROR_EOF (-MKTAG( 'E','O','F',' '))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(54,25,0)
|
||||||
|
# define CV_CODEC_ID AVCodecID
|
||||||
|
# define CV_CODEC(name) AV_##name
|
||||||
|
#else
|
||||||
|
# define CV_CODEC_ID CodecID
|
||||||
|
# define CV_CODEC(name) name
|
||||||
|
#endif
|
||||||
|
|
||||||
static int get_number_of_cpus(void)
|
static int get_number_of_cpus(void)
|
||||||
{
|
{
|
||||||
#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(52, 111, 0)
|
#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(52, 111, 0)
|
||||||
@ -1026,7 +1034,7 @@ static const char * icvFFMPEGErrStr(int err)
|
|||||||
|
|
||||||
/* function internal to FFMPEG (libavformat/riff.c) to lookup codec id by fourcc tag*/
|
/* function internal to FFMPEG (libavformat/riff.c) to lookup codec id by fourcc tag*/
|
||||||
extern "C" {
|
extern "C" {
|
||||||
enum CodecID codec_get_bmp_id(unsigned int tag);
|
enum CV_CODEC_ID codec_get_bmp_id(unsigned int tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CvVideoWriter_FFMPEG::init()
|
void CvVideoWriter_FFMPEG::init()
|
||||||
@ -1078,7 +1086,7 @@ static AVFrame * icv_alloc_picture_FFMPEG(int pix_fmt, int width, int height, bo
|
|||||||
|
|
||||||
/* add a video output stream to the container */
|
/* add a video output stream to the container */
|
||||||
static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc,
|
static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc,
|
||||||
CodecID codec_id,
|
CV_CODEC_ID codec_id,
|
||||||
int w, int h, int bitrate,
|
int w, int h, int bitrate,
|
||||||
double fps, int pixel_format)
|
double fps, int pixel_format)
|
||||||
{
|
{
|
||||||
@ -1110,7 +1118,7 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc,
|
|||||||
c->codec_id = oc->oformat->video_codec;
|
c->codec_id = oc->oformat->video_codec;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(codec_id != CODEC_ID_NONE){
|
if(codec_id != CV_CODEC(CODEC_ID_NONE)){
|
||||||
c->codec_id = codec_id;
|
c->codec_id = codec_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1179,10 +1187,10 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc,
|
|||||||
c->gop_size = 12; /* emit one intra frame every twelve frames at most */
|
c->gop_size = 12; /* emit one intra frame every twelve frames at most */
|
||||||
c->pix_fmt = (PixelFormat) pixel_format;
|
c->pix_fmt = (PixelFormat) pixel_format;
|
||||||
|
|
||||||
if (c->codec_id == CODEC_ID_MPEG2VIDEO) {
|
if (c->codec_id == CV_CODEC(CODEC_ID_MPEG2VIDEO)) {
|
||||||
c->max_b_frames = 2;
|
c->max_b_frames = 2;
|
||||||
}
|
}
|
||||||
if (c->codec_id == CODEC_ID_MPEG1VIDEO || c->codec_id == CODEC_ID_MSMPEG4V3){
|
if (c->codec_id == CV_CODEC(CODEC_ID_MPEG1VIDEO) || c->codec_id == CV_CODEC(CODEC_ID_MSMPEG4V3)){
|
||||||
/* needed to avoid using macroblocks in which some coeffs overflow
|
/* needed to avoid using macroblocks in which some coeffs overflow
|
||||||
this doesnt happen with normal video, it just happens here as the
|
this doesnt happen with normal video, it just happens here as the
|
||||||
motion of the chroma plane doesnt match the luma plane */
|
motion of the chroma plane doesnt match the luma plane */
|
||||||
@ -1290,7 +1298,7 @@ bool CvVideoWriter_FFMPEG::writeFrame( const unsigned char* data, int step, int
|
|||||||
|
|
||||||
#if LIBAVFORMAT_BUILD < 5231
|
#if LIBAVFORMAT_BUILD < 5231
|
||||||
// It is not needed in the latest versions of the ffmpeg
|
// It is not needed in the latest versions of the ffmpeg
|
||||||
if( c->codec_id == CODEC_ID_RAWVIDEO && origin != 1 )
|
if( c->codec_id == CV_CODEC(CODEC_ID_RAWVIDEO) && origin != 1 )
|
||||||
{
|
{
|
||||||
if( !temp_image.data )
|
if( !temp_image.data )
|
||||||
{
|
{
|
||||||
@ -1477,7 +1485,7 @@ void CvVideoWriter_FFMPEG::close()
|
|||||||
bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
|
bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
|
||||||
double fps, int width, int height, bool is_color )
|
double fps, int width, int height, bool is_color )
|
||||||
{
|
{
|
||||||
CodecID codec_id = CODEC_ID_NONE;
|
CV_CODEC_ID codec_id = CV_CODEC(CODEC_ID_NONE);
|
||||||
int err, codec_pix_fmt;
|
int err, codec_pix_fmt;
|
||||||
double bitrate_scale = 1;
|
double bitrate_scale = 1;
|
||||||
|
|
||||||
@ -1518,11 +1526,11 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
|
|||||||
|
|
||||||
/* Lookup codec_id for given fourcc */
|
/* Lookup codec_id for given fourcc */
|
||||||
#if LIBAVCODEC_VERSION_INT<((51<<16)+(49<<8)+0)
|
#if LIBAVCODEC_VERSION_INT<((51<<16)+(49<<8)+0)
|
||||||
if( (codec_id = codec_get_bmp_id( fourcc )) == CODEC_ID_NONE )
|
if( (codec_id = codec_get_bmp_id( fourcc )) == CV_CODEC(CODEC_ID_NONE) )
|
||||||
return false;
|
return false;
|
||||||
#else
|
#else
|
||||||
const struct AVCodecTag * tags[] = { codec_bmp_tags, NULL};
|
const struct AVCodecTag * tags[] = { codec_bmp_tags, NULL};
|
||||||
if( (codec_id = av_codec_get_id(tags, fourcc)) == CODEC_ID_NONE )
|
if( (codec_id = av_codec_get_id(tags, fourcc)) == CV_CODEC(CODEC_ID_NONE) )
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1544,20 +1552,20 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
|
|||||||
// set a few optimal pixel formats for lossless codecs of interest..
|
// set a few optimal pixel formats for lossless codecs of interest..
|
||||||
switch (codec_id) {
|
switch (codec_id) {
|
||||||
#if LIBAVCODEC_VERSION_INT>((50<<16)+(1<<8)+0)
|
#if LIBAVCODEC_VERSION_INT>((50<<16)+(1<<8)+0)
|
||||||
case CODEC_ID_JPEGLS:
|
case CV_CODEC(CODEC_ID_JPEGLS):
|
||||||
// BGR24 or GRAY8 depending on is_color...
|
// BGR24 or GRAY8 depending on is_color...
|
||||||
codec_pix_fmt = input_pix_fmt;
|
codec_pix_fmt = input_pix_fmt;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case CODEC_ID_HUFFYUV:
|
case CV_CODEC(CODEC_ID_HUFFYUV):
|
||||||
codec_pix_fmt = PIX_FMT_YUV422P;
|
codec_pix_fmt = PIX_FMT_YUV422P;
|
||||||
break;
|
break;
|
||||||
case CODEC_ID_MJPEG:
|
case CV_CODEC(CODEC_ID_MJPEG):
|
||||||
case CODEC_ID_LJPEG:
|
case CV_CODEC(CODEC_ID_LJPEG):
|
||||||
codec_pix_fmt = PIX_FMT_YUVJ420P;
|
codec_pix_fmt = PIX_FMT_YUVJ420P;
|
||||||
bitrate_scale = 3;
|
bitrate_scale = 3;
|
||||||
break;
|
break;
|
||||||
case CODEC_ID_RAWVIDEO:
|
case CV_CODEC(CODEC_ID_RAWVIDEO):
|
||||||
codec_pix_fmt = input_pix_fmt == PIX_FMT_GRAY8 ||
|
codec_pix_fmt = input_pix_fmt == PIX_FMT_GRAY8 ||
|
||||||
input_pix_fmt == PIX_FMT_GRAY16LE ||
|
input_pix_fmt == PIX_FMT_GRAY16LE ||
|
||||||
input_pix_fmt == PIX_FMT_GRAY16BE ? input_pix_fmt : PIX_FMT_YUV420P;
|
input_pix_fmt == PIX_FMT_GRAY16BE ? input_pix_fmt : PIX_FMT_YUV420P;
|
||||||
@ -1788,7 +1796,7 @@ struct OutputMediaStream_FFMPEG
|
|||||||
void write(unsigned char* data, int size, int keyFrame);
|
void write(unsigned char* data, int size, int keyFrame);
|
||||||
|
|
||||||
// add a video output stream to the container
|
// add a video output stream to the container
|
||||||
static AVStream* addVideoStream(AVFormatContext *oc, CodecID codec_id, int w, int h, int bitrate, double fps, PixelFormat pixel_format);
|
static AVStream* addVideoStream(AVFormatContext *oc, CV_CODEC_ID codec_id, int w, int h, int bitrate, double fps, PixelFormat pixel_format);
|
||||||
|
|
||||||
AVOutputFormat* fmt_;
|
AVOutputFormat* fmt_;
|
||||||
AVFormatContext* oc_;
|
AVFormatContext* oc_;
|
||||||
@ -1835,7 +1843,7 @@ void OutputMediaStream_FFMPEG::close()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AVStream* OutputMediaStream_FFMPEG::addVideoStream(AVFormatContext *oc, CodecID codec_id, int w, int h, int bitrate, double fps, PixelFormat pixel_format)
|
AVStream* OutputMediaStream_FFMPEG::addVideoStream(AVFormatContext *oc, CV_CODEC_ID codec_id, int w, int h, int bitrate, double fps, PixelFormat pixel_format)
|
||||||
{
|
{
|
||||||
#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 10, 0)
|
#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 10, 0)
|
||||||
AVStream* st = avformat_new_stream(oc, 0);
|
AVStream* st = avformat_new_stream(oc, 0);
|
||||||
@ -1915,10 +1923,10 @@ AVStream* OutputMediaStream_FFMPEG::addVideoStream(AVFormatContext *oc, CodecID
|
|||||||
c->gop_size = 12; // emit one intra frame every twelve frames at most
|
c->gop_size = 12; // emit one intra frame every twelve frames at most
|
||||||
c->pix_fmt = pixel_format;
|
c->pix_fmt = pixel_format;
|
||||||
|
|
||||||
if (c->codec_id == CODEC_ID_MPEG2VIDEO)
|
if (c->codec_id == CV_CODEC(CODEC_ID_MPEG2VIDEO))
|
||||||
c->max_b_frames = 2;
|
c->max_b_frames = 2;
|
||||||
|
|
||||||
if (c->codec_id == CODEC_ID_MPEG1VIDEO || c->codec_id == CODEC_ID_MSMPEG4V3)
|
if (c->codec_id == CV_CODEC(CODEC_ID_MPEG1VIDEO) || c->codec_id == CV_CODEC(CODEC_ID_MSMPEG4V3))
|
||||||
{
|
{
|
||||||
// needed to avoid using macroblocks in which some coeffs overflow
|
// needed to avoid using macroblocks in which some coeffs overflow
|
||||||
// this doesnt happen with normal video, it just happens here as the
|
// this doesnt happen with normal video, it just happens here as the
|
||||||
@ -1955,7 +1963,7 @@ bool OutputMediaStream_FFMPEG::open(const char* fileName, int width, int height,
|
|||||||
if (!fmt_)
|
if (!fmt_)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
CodecID codec_id = CODEC_ID_H264;
|
CV_CODEC_ID codec_id = CV_CODEC(CODEC_ID_H264);
|
||||||
|
|
||||||
// alloc memory for context
|
// alloc memory for context
|
||||||
#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
|
#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(53, 2, 0)
|
||||||
@ -2156,23 +2164,23 @@ bool InputMediaStream_FFMPEG::open(const char* fileName, int* codec, int* chroma
|
|||||||
|
|
||||||
switch (enc->codec_id)
|
switch (enc->codec_id)
|
||||||
{
|
{
|
||||||
case CODEC_ID_MPEG1VIDEO:
|
case CV_CODEC(CODEC_ID_MPEG1VIDEO):
|
||||||
*codec = ::VideoCodec_MPEG1;
|
*codec = ::VideoCodec_MPEG1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CODEC_ID_MPEG2VIDEO:
|
case CV_CODEC(CODEC_ID_MPEG2VIDEO):
|
||||||
*codec = ::VideoCodec_MPEG2;
|
*codec = ::VideoCodec_MPEG2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CODEC_ID_MPEG4:
|
case CV_CODEC(CODEC_ID_MPEG4):
|
||||||
*codec = ::VideoCodec_MPEG4;
|
*codec = ::VideoCodec_MPEG4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CODEC_ID_VC1:
|
case CV_CODEC(CODEC_ID_VC1):
|
||||||
*codec = ::VideoCodec_VC1;
|
*codec = ::VideoCodec_VC1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CODEC_ID_H264:
|
case CV_CODEC(CODEC_ID_H264):
|
||||||
*codec = ::VideoCodec_H264;
|
*codec = ::VideoCodec_H264;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1714,6 +1714,7 @@ static void icvCloseCAM_V4L( CvCaptureCAM_V4L* capture ){
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
free(capture->deviceName);
|
free(capture->deviceName);
|
||||||
|
capture->deviceName = NULL;
|
||||||
//v4l2_free_ranges(capture);
|
//v4l2_free_ranges(capture);
|
||||||
//cvFree((void **)capture);
|
//cvFree((void **)capture);
|
||||||
}
|
}
|
||||||
|
2810
modules/highgui/src/cap_msmf.cpp
Normal file
2810
modules/highgui/src/cap_msmf.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@ -406,7 +406,7 @@ bool CvCaptureCAM_VFW::open( int wIndex )
|
|||||||
fourcc = (DWORD)-1;
|
fourcc = (DWORD)-1;
|
||||||
|
|
||||||
memset( &caps, 0, sizeof(caps));
|
memset( &caps, 0, sizeof(caps));
|
||||||
capDriverGetCaps( hWndC, &caps, sizeof(&caps));
|
capDriverGetCaps( hWndC, &caps, sizeof(caps));
|
||||||
::MoveWindow( hWndC, 0, 0, 320, 240, TRUE );
|
::MoveWindow( hWndC, 0, 0, 320, 240, TRUE );
|
||||||
capSetUserData( hWndC, (size_t)this );
|
capSetUserData( hWndC, (size_t)this );
|
||||||
capSetCallbackOnFrame( hWndC, frameCallback );
|
capSetCallbackOnFrame( hWndC, frameCallback );
|
||||||
|
@ -103,14 +103,6 @@ struct CvVideoWriter
|
|||||||
virtual bool writeFrame(const IplImage*) { return false; }
|
virtual bool writeFrame(const IplImage*) { return false; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined WIN32 || defined _WIN32
|
|
||||||
#define HAVE_VFW 1
|
|
||||||
|
|
||||||
/* uncomment to enable CMUCamera1394 fireware camera module */
|
|
||||||
//#define HAVE_CMU1394 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
CvCapture * cvCreateCameraCapture_V4L( int index );
|
CvCapture * cvCreateCameraCapture_V4L( int index );
|
||||||
CvCapture * cvCreateCameraCapture_DC1394( int index );
|
CvCapture * cvCreateCameraCapture_DC1394( int index );
|
||||||
CvCapture * cvCreateCameraCapture_DC1394_2( int index );
|
CvCapture * cvCreateCameraCapture_DC1394_2( int index );
|
||||||
@ -126,6 +118,7 @@ CvVideoWriter* cvCreateVideoWriter_Win32( const char* filename, int fourcc,
|
|||||||
CvVideoWriter* cvCreateVideoWriter_VFW( const char* filename, int fourcc,
|
CvVideoWriter* cvCreateVideoWriter_VFW( const char* filename, int fourcc,
|
||||||
double fps, CvSize frameSize, int is_color );
|
double fps, CvSize frameSize, int is_color );
|
||||||
CvCapture* cvCreateCameraCapture_DShow( int index );
|
CvCapture* cvCreateCameraCapture_DShow( int index );
|
||||||
|
CvCapture* cvCreateCameraCapture_MSMF( int index );
|
||||||
CvCapture* cvCreateCameraCapture_OpenNI( int index );
|
CvCapture* cvCreateCameraCapture_OpenNI( int index );
|
||||||
CvCapture* cvCreateFileCapture_OpenNI( const char* filename );
|
CvCapture* cvCreateFileCapture_OpenNI( const char* filename );
|
||||||
CvCapture* cvCreateCameraCapture_Android( int index );
|
CvCapture* cvCreateCameraCapture_Android( int index );
|
||||||
|
@ -57,7 +57,7 @@ CV_IMPL void cvSetWindowProperty(const char* name, int prop_id, double prop_valu
|
|||||||
|
|
||||||
#if defined (HAVE_QT)
|
#if defined (HAVE_QT)
|
||||||
cvSetModeWindow_QT(name,prop_value);
|
cvSetModeWindow_QT(name,prop_value);
|
||||||
#elif defined WIN32 || defined _WIN32
|
#elif defined(HAVE_WIN32UI)
|
||||||
cvSetModeWindow_W32(name,prop_value);
|
cvSetModeWindow_W32(name,prop_value);
|
||||||
#elif defined (HAVE_GTK)
|
#elif defined (HAVE_GTK)
|
||||||
cvSetModeWindow_GTK(name,prop_value);
|
cvSetModeWindow_GTK(name,prop_value);
|
||||||
@ -96,7 +96,7 @@ CV_IMPL double cvGetWindowProperty(const char* name, int prop_id)
|
|||||||
|
|
||||||
#if defined (HAVE_QT)
|
#if defined (HAVE_QT)
|
||||||
return cvGetModeWindow_QT(name);
|
return cvGetModeWindow_QT(name);
|
||||||
#elif defined WIN32 || defined _WIN32
|
#elif defined(HAVE_WIN32UI)
|
||||||
return cvGetModeWindow_W32(name);
|
return cvGetModeWindow_W32(name);
|
||||||
#elif defined (HAVE_GTK)
|
#elif defined (HAVE_GTK)
|
||||||
return cvGetModeWindow_GTK(name);
|
return cvGetModeWindow_GTK(name);
|
||||||
@ -113,7 +113,7 @@ CV_IMPL double cvGetWindowProperty(const char* name, int prop_id)
|
|||||||
|
|
||||||
#if defined (HAVE_QT)
|
#if defined (HAVE_QT)
|
||||||
return cvGetPropWindow_QT(name);
|
return cvGetPropWindow_QT(name);
|
||||||
#elif defined WIN32 || defined _WIN32
|
#elif defined(HAVE_WIN32UI)
|
||||||
return cvGetPropWindowAutoSize_W32(name);
|
return cvGetPropWindowAutoSize_W32(name);
|
||||||
#elif defined (HAVE_GTK)
|
#elif defined (HAVE_GTK)
|
||||||
return cvGetPropWindowAutoSize_GTK(name);
|
return cvGetPropWindowAutoSize_GTK(name);
|
||||||
@ -126,7 +126,7 @@ CV_IMPL double cvGetWindowProperty(const char* name, int prop_id)
|
|||||||
|
|
||||||
#if defined (HAVE_QT)
|
#if defined (HAVE_QT)
|
||||||
return cvGetRatioWindow_QT(name);
|
return cvGetRatioWindow_QT(name);
|
||||||
#elif defined WIN32 || defined _WIN32
|
#elif defined(HAVE_WIN32UI)
|
||||||
return cvGetRatioWindow_W32(name);
|
return cvGetRatioWindow_W32(name);
|
||||||
#elif defined (HAVE_GTK)
|
#elif defined (HAVE_GTK)
|
||||||
return cvGetRatioWindow_GTK(name);
|
return cvGetRatioWindow_GTK(name);
|
||||||
@ -139,7 +139,7 @@ CV_IMPL double cvGetWindowProperty(const char* name, int prop_id)
|
|||||||
|
|
||||||
#if defined (HAVE_QT)
|
#if defined (HAVE_QT)
|
||||||
return cvGetOpenGlProp_QT(name);
|
return cvGetOpenGlProp_QT(name);
|
||||||
#elif defined WIN32 || defined _WIN32
|
#elif defined(HAVE_WIN32UI)
|
||||||
return cvGetOpenGlProp_W32(name);
|
return cvGetOpenGlProp_W32(name);
|
||||||
#elif defined (HAVE_GTK)
|
#elif defined (HAVE_GTK)
|
||||||
return cvGetOpenGlProp_GTK(name);
|
return cvGetOpenGlProp_GTK(name);
|
||||||
@ -440,7 +440,7 @@ int cv::createButton(const String&, ButtonCallback, void*, int , bool )
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined WIN32 || defined _WIN32 // see window_w32.cpp
|
#if defined(HAVE_WIN32UI) // see window_w32.cpp
|
||||||
#elif defined (HAVE_GTK) // see window_gtk.cpp
|
#elif defined (HAVE_GTK) // see window_gtk.cpp
|
||||||
#elif defined (HAVE_COCOA) // see window_carbon.cpp
|
#elif defined (HAVE_COCOA) // see window_carbon.cpp
|
||||||
#elif defined (HAVE_CARBON)
|
#elif defined (HAVE_CARBON)
|
||||||
|
@ -176,7 +176,7 @@ TEST(Highgui_Video, ffmpeg_image) { CV_FFmpegReadImageTest test; test.safe_run()
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HAVE_FFMPEG) || defined(WIN32) || defined(_WIN32)
|
#if defined(HAVE_FFMPEG)
|
||||||
|
|
||||||
//////////////////////////////// Parallel VideoWriters and VideoCaptures ////////////////////////////////////
|
//////////////////////////////// Parallel VideoWriters and VideoCaptures ////////////////////////////////////
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
#include "test_precomp.hpp"
|
#include "test_precomp.hpp"
|
||||||
#include "opencv2/highgui.hpp"
|
#include "opencv2/highgui.hpp"
|
||||||
|
|
||||||
#if defined HAVE_GTK || defined HAVE_QT || defined WIN32 || defined _WIN32 || defined HAVE_CARBON || defined HAVE_COCOA
|
#if defined HAVE_GTK || defined HAVE_QT || defined HAVE_WIN32UI || defined HAVE_CARBON || defined HAVE_COCOA
|
||||||
|
|
||||||
using namespace cv;
|
using namespace cv;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
#include "opencv2/core/private.hpp"
|
#include "opencv2/core/private.hpp"
|
||||||
|
|
||||||
#if defined(HAVE_VIDEOINPUT) || \
|
#if defined(HAVE_DSHOW) || \
|
||||||
defined(HAVE_TYZX) || \
|
defined(HAVE_TYZX) || \
|
||||||
defined(HAVE_VFW) || \
|
defined(HAVE_VFW) || \
|
||||||
defined(HAVE_LIBV4L) || \
|
defined(HAVE_LIBV4L) || \
|
||||||
@ -45,9 +45,7 @@
|
|||||||
defined(HAVE_QUICKTIME) || \
|
defined(HAVE_QUICKTIME) || \
|
||||||
defined(HAVE_AVFOUNDATION) || \
|
defined(HAVE_AVFOUNDATION) || \
|
||||||
/*defined(HAVE_OPENNI) || too specialized */ \
|
/*defined(HAVE_OPENNI) || too specialized */ \
|
||||||
defined(HAVE_FFMPEG) || \
|
defined(HAVE_FFMPEG)
|
||||||
defined(WIN32) /* assume that we have ffmpeg */
|
|
||||||
|
|
||||||
# define BUILD_WITH_VIDEO_INPUT_SUPPORT 1
|
# define BUILD_WITH_VIDEO_INPUT_SUPPORT 1
|
||||||
#else
|
#else
|
||||||
# define BUILD_WITH_VIDEO_INPUT_SUPPORT 0
|
# define BUILD_WITH_VIDEO_INPUT_SUPPORT 0
|
||||||
@ -57,8 +55,7 @@
|
|||||||
defined(HAVE_GSTREAMER) || \
|
defined(HAVE_GSTREAMER) || \
|
||||||
defined(HAVE_QUICKTIME) || \
|
defined(HAVE_QUICKTIME) || \
|
||||||
defined(HAVE_AVFOUNDATION) || \
|
defined(HAVE_AVFOUNDATION) || \
|
||||||
defined(HAVE_FFMPEG) || \
|
defined(HAVE_FFMPEG)
|
||||||
defined(WIN32) /* assume that we have ffmpeg */
|
|
||||||
# define BUILD_WITH_VIDEO_OUTPUT_SUPPORT 1
|
# define BUILD_WITH_VIDEO_OUTPUT_SUPPORT 1
|
||||||
#else
|
#else
|
||||||
# define BUILD_WITH_VIDEO_OUTPUT_SUPPORT 0
|
# define BUILD_WITH_VIDEO_OUTPUT_SUPPORT 0
|
||||||
|
@ -1931,7 +1931,7 @@ void cv::resize( InputArray _src, OutputArray _dst, Size dsize,
|
|||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_TEGRA_OPTIMIZATION
|
#ifdef HAVE_TEGRA_OPTIMIZATION
|
||||||
if (tegra::resize(src, dst, inv_scale_x, inv_scale_y, interpolation))
|
if (tegra::resize(src, dst, (float)inv_scale_x, (float)inv_scale_y, interpolation))
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -3858,7 +3858,7 @@ cv2DRotationMatrix( CvPoint2D32f center, double angle,
|
|||||||
double scale, CvMat* matrix )
|
double scale, CvMat* matrix )
|
||||||
{
|
{
|
||||||
cv::Mat M0 = cv::cvarrToMat(matrix), M = cv::getRotationMatrix2D(center, angle, scale);
|
cv::Mat M0 = cv::cvarrToMat(matrix), M = cv::getRotationMatrix2D(center, angle, scale);
|
||||||
CV_Assert( M.size() == M.size() );
|
CV_Assert( M.size() == M0.size() );
|
||||||
M.convertTo(M0, M0.type());
|
M.convertTo(M0, M0.type());
|
||||||
return matrix;
|
return matrix;
|
||||||
}
|
}
|
||||||
@ -3871,7 +3871,7 @@ cvGetPerspectiveTransform( const CvPoint2D32f* src,
|
|||||||
{
|
{
|
||||||
cv::Mat M0 = cv::cvarrToMat(matrix),
|
cv::Mat M0 = cv::cvarrToMat(matrix),
|
||||||
M = cv::getPerspectiveTransform((const cv::Point2f*)src, (const cv::Point2f*)dst);
|
M = cv::getPerspectiveTransform((const cv::Point2f*)src, (const cv::Point2f*)dst);
|
||||||
CV_Assert( M.size() == M.size() );
|
CV_Assert( M.size() == M0.size() );
|
||||||
M.convertTo(M0, M0.type());
|
M.convertTo(M0, M0.type());
|
||||||
return matrix;
|
return matrix;
|
||||||
}
|
}
|
||||||
|
@ -283,7 +283,14 @@ if(BUILD_FAT_JAVA_LIB)
|
|||||||
if(__extradeps)
|
if(__extradeps)
|
||||||
list(REMOVE_ITEM __deps ${__extradeps})
|
list(REMOVE_ITEM __deps ${__extradeps})
|
||||||
endif()
|
endif()
|
||||||
target_link_libraries(${the_module} -Wl,-whole-archive ${__deps} -Wl,-no-whole-archive ${__extradeps} ${OPENCV_LINKER_LIBS})
|
if(APPLE)
|
||||||
|
foreach(_dep ${__deps})
|
||||||
|
target_link_libraries(${the_module} -Wl,-force_load "${_dep}")
|
||||||
|
endforeach()
|
||||||
|
else()
|
||||||
|
target_link_libraries(${the_module} -Wl,-whole-archive ${__deps} -Wl,-no-whole-archive)
|
||||||
|
endif()
|
||||||
|
target_link_libraries(${the_module} ${__extradeps} ${OPENCV_LINKER_LIBS})
|
||||||
else()
|
else()
|
||||||
target_link_libraries(${the_module} ${OPENCV_MODULE_${the_module}_DEPS} ${OPENCV_LINKER_LIBS})
|
target_link_libraries(${the_module} ${OPENCV_MODULE_${the_module}_DEPS} ${OPENCV_LINKER_LIBS})
|
||||||
endif()
|
endif()
|
||||||
|
@ -14,7 +14,7 @@ ocv_list_filterout(opencv_test_java_files ".svn")
|
|||||||
|
|
||||||
# copy sources out from the build tree
|
# copy sources out from the build tree
|
||||||
set(opencv_test_java_file_deps "")
|
set(opencv_test_java_file_deps "")
|
||||||
foreach(f ${opencv_test_java_files} ${ANDROID_MANIFEST_FILE})
|
foreach(f ${opencv_test_java_files} ${ANDROID_MANIFEST_FILE} ".classpath" ".project")
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT "${opencv_test_java_bin_dir}/${f}"
|
OUTPUT "${opencv_test_java_bin_dir}/${f}"
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/${f}" "${opencv_test_java_bin_dir}/${f}"
|
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/${f}" "${opencv_test_java_bin_dir}/${f}"
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package org.opencv.test.features2d;
|
package org.opencv.test.features2d;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -204,7 +205,17 @@ public class BruteForceHammingDescriptorMatcherTest extends OpenCVTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void testRadiusMatchMatListOfListOfDMatchFloat() {
|
public void testRadiusMatchMatListOfListOfDMatchFloat() {
|
||||||
fail("Not yet implemented");
|
Mat train = getTrainDescriptors();
|
||||||
|
Mat query = getQueryDescriptors();
|
||||||
|
ArrayList<MatOfDMatch> matches = new ArrayList<MatOfDMatch>();
|
||||||
|
|
||||||
|
matcher.radiusMatch(query, train, matches, 50.f);
|
||||||
|
|
||||||
|
assertEquals(matches.size(), 4);
|
||||||
|
assertTrue(matches.get(0).empty());
|
||||||
|
assertMatEqual(matches.get(1), new MatOfDMatch(truth[1]), EPS);
|
||||||
|
assertMatEqual(matches.get(2), new MatOfDMatch(truth[2]), EPS);
|
||||||
|
assertTrue(matches.get(3).empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testRadiusMatchMatListOfListOfDMatchFloatListOfMat() {
|
public void testRadiusMatchMatListOfListOfDMatchFloatListOfMat() {
|
||||||
|
@ -54,6 +54,9 @@ public abstract class CameraBridgeViewBase extends SurfaceView implements Surfac
|
|||||||
public CameraBridgeViewBase(Context context, int cameraId) {
|
public CameraBridgeViewBase(Context context, int cameraId) {
|
||||||
super(context);
|
super(context);
|
||||||
mCameraIndex = cameraId;
|
mCameraIndex = cameraId;
|
||||||
|
getHolder().addCallback(this);
|
||||||
|
mMaxWidth = MAX_UNSPECIFIED;
|
||||||
|
mMaxHeight = MAX_UNSPECIFIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CameraBridgeViewBase(Context context, AttributeSet attrs) {
|
public CameraBridgeViewBase(Context context, AttributeSet attrs) {
|
||||||
|
@ -60,7 +60,6 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb
|
|||||||
|
|
||||||
public JavaCameraView(Context context, AttributeSet attrs) {
|
public JavaCameraView(Context context, AttributeSet attrs) {
|
||||||
super(context, attrs);
|
super(context, attrs);
|
||||||
Log.d(TAG, "Java camera view ctor");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean initializeCamera(int width, int height) {
|
protected boolean initializeCamera(int width, int height) {
|
||||||
@ -237,10 +236,8 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void onPreviewFrame(byte[] frame, Camera arg1) {
|
public void onPreviewFrame(byte[] frame, Camera arg1) {
|
||||||
Log.i(TAG, "Preview Frame received. Need to create MAT and deliver it to clients");
|
Log.d(TAG, "Preview Frame received. Frame size: " + frame.length);
|
||||||
Log.i(TAG, "Frame size is " + frame.length);
|
synchronized (this) {
|
||||||
synchronized (this)
|
|
||||||
{
|
|
||||||
mFrameChain[1 - mChainIdx].put(0, 0, frame);
|
mFrameChain[1 - mChainIdx].put(0, 0, frame);
|
||||||
this.notify();
|
this.notify();
|
||||||
}
|
}
|
||||||
@ -248,8 +245,7 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb
|
|||||||
mCamera.addCallbackBuffer(mBuffer);
|
mCamera.addCallbackBuffer(mBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
private class JavaCameraFrame implements CvCameraViewFrame
|
private class JavaCameraFrame implements CvCameraViewFrame {
|
||||||
{
|
|
||||||
public Mat gray() {
|
public Mat gray() {
|
||||||
return mYuvFrameData.submat(0, mHeight, 0, mWidth);
|
return mYuvFrameData.submat(0, mHeight, 0, mWidth);
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,12 @@ public class OpenCVLoader
|
|||||||
*/
|
*/
|
||||||
public static final String OPENCV_VERSION_2_4_4 = "2.4.4";
|
public static final String OPENCV_VERSION_2_4_4 = "2.4.4";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OpenCV Library version 2.4.5.
|
||||||
|
*/
|
||||||
|
public static final String OPENCV_VERSION_2_4_5 = "2.4.5";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads and initializes OpenCV library from current application package. Roughly, it's an analog of system.loadLibrary("opencv_java").
|
* Loads and initializes OpenCV library from current application package. Roughly, it's an analog of system.loadLibrary("opencv_java").
|
||||||
* @return Returns true is initialization of OpenCV was successful.
|
* @return Returns true is initialization of OpenCV was successful.
|
||||||
|
@ -16,8 +16,8 @@ public class MatOfDMatch extends Mat {
|
|||||||
|
|
||||||
protected MatOfDMatch(long addr) {
|
protected MatOfDMatch(long addr) {
|
||||||
super(addr);
|
super(addr);
|
||||||
if(checkVector(_channels, _depth) < 0 )
|
if( !empty() && checkVector(_channels, _depth) < 0 )
|
||||||
throw new IllegalArgumentException("Incomatible Mat");
|
throw new IllegalArgumentException("Incomatible Mat: " + toString());
|
||||||
//FIXME: do we need release() here?
|
//FIXME: do we need release() here?
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -27,8 +27,8 @@ public class MatOfDMatch extends Mat {
|
|||||||
|
|
||||||
public MatOfDMatch(Mat m) {
|
public MatOfDMatch(Mat m) {
|
||||||
super(m, Range.all());
|
super(m, Range.all());
|
||||||
if(checkVector(_channels, _depth) < 0 )
|
if( !empty() && checkVector(_channels, _depth) < 0 )
|
||||||
throw new IllegalArgumentException("Incomatible Mat");
|
throw new IllegalArgumentException("Incomatible Mat: " + toString());
|
||||||
//FIXME: do we need release() here?
|
//FIXME: do we need release() here?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -429,10 +429,11 @@ void CvBlobTrackerAuto1::Process(IplImage* pImg, IplImage* pMask)
|
|||||||
for(i=0; i<NewBlobList.GetBlobNum(); ++i)
|
for(i=0; i<NewBlobList.GetBlobNum(); ++i)
|
||||||
{
|
{
|
||||||
CvBlob* pBN = NewBlobList.GetBlob(i);
|
CvBlob* pBN = NewBlobList.GetBlob(i);
|
||||||
pBN->ID = m_NextBlobID;
|
|
||||||
|
|
||||||
if(pBN && pBN->w >= CV_BLOB_MINW && pBN->h >= CV_BLOB_MINH)
|
if(pBN && pBN->w >= CV_BLOB_MINW && pBN->h >= CV_BLOB_MINH)
|
||||||
{
|
{
|
||||||
|
pBN->ID = m_NextBlobID;
|
||||||
|
|
||||||
CvBlob* pB = m_pBT->AddBlob(pBN, pImg, pmask );
|
CvBlob* pB = m_pBT->AddBlob(pBN, pImg, pmask );
|
||||||
if(pB)
|
if(pB)
|
||||||
{
|
{
|
||||||
|
@ -235,7 +235,7 @@ void CvCalibFilter::SetCameraCount( int count )
|
|||||||
cvReleaseMat( &rectMap[i][1] );
|
cvReleaseMat( &rectMap[i][1] );
|
||||||
}
|
}
|
||||||
|
|
||||||
memset( latestCounts, 0, sizeof(latestPoints) );
|
memset( latestCounts, 0, sizeof(latestCounts) );
|
||||||
maxPoints = 0;
|
maxPoints = 0;
|
||||||
cameraCount = count;
|
cameraCount = count;
|
||||||
}
|
}
|
||||||
|
@ -2115,7 +2115,7 @@ CV_IMPL IplImage* icvCreateIsometricImage( IplImage* src, IplImage* dst,
|
|||||||
if( !dst || dst->depth != desired_depth ||
|
if( !dst || dst->depth != desired_depth ||
|
||||||
dst->nChannels != desired_num_channels ||
|
dst->nChannels != desired_num_channels ||
|
||||||
dst_size.width != src_size.width ||
|
dst_size.width != src_size.width ||
|
||||||
dst_size.height != dst_size.height )
|
dst_size.height != src_size.height )
|
||||||
{
|
{
|
||||||
cvReleaseImage( &dst );
|
cvReleaseImage( &dst );
|
||||||
dst = cvCreateImage( src_size, desired_depth, desired_num_channels );
|
dst = cvCreateImage( src_size, desired_depth, desired_num_channels );
|
||||||
|
@ -58,9 +58,8 @@ namespace
|
|||||||
IMPLEMENT_PARAM_CLASS(SURF_Upright, bool)
|
IMPLEMENT_PARAM_CLASS(SURF_Upright, bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
PARAM_TEST_CASE(SURF, cv::gpu::DeviceInfo, SURF_HessianThreshold, SURF_Octaves, SURF_OctaveLayers, SURF_Extended, SURF_Upright)
|
PARAM_TEST_CASE(SURF, SURF_HessianThreshold, SURF_Octaves, SURF_OctaveLayers, SURF_Extended, SURF_Upright)
|
||||||
{
|
{
|
||||||
cv::gpu::DeviceInfo devInfo;
|
|
||||||
double hessianThreshold;
|
double hessianThreshold;
|
||||||
int nOctaves;
|
int nOctaves;
|
||||||
int nOctaveLayers;
|
int nOctaveLayers;
|
||||||
@ -69,14 +68,11 @@ PARAM_TEST_CASE(SURF, cv::gpu::DeviceInfo, SURF_HessianThreshold, SURF_Octaves,
|
|||||||
|
|
||||||
virtual void SetUp()
|
virtual void SetUp()
|
||||||
{
|
{
|
||||||
devInfo = GET_PARAM(0);
|
hessianThreshold = GET_PARAM(0);
|
||||||
hessianThreshold = GET_PARAM(1);
|
nOctaves = GET_PARAM(1);
|
||||||
nOctaves = GET_PARAM(2);
|
nOctaveLayers = GET_PARAM(2);
|
||||||
nOctaveLayers = GET_PARAM(3);
|
extended = GET_PARAM(3);
|
||||||
extended = GET_PARAM(4);
|
upright = GET_PARAM(4);
|
||||||
upright = GET_PARAM(5);
|
|
||||||
|
|
||||||
cv::gpu::setDevice(devInfo.deviceID());
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -93,20 +89,6 @@ GPU_TEST_P(SURF, Detector)
|
|||||||
surf.upright = upright;
|
surf.upright = upright;
|
||||||
surf.keypointsRatio = 0.05f;
|
surf.keypointsRatio = 0.05f;
|
||||||
|
|
||||||
if (!supportFeature(devInfo, cv::gpu::GLOBAL_ATOMICS))
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
std::vector<cv::KeyPoint> keypoints;
|
|
||||||
surf(loadMat(image), cv::gpu::GpuMat(), keypoints);
|
|
||||||
}
|
|
||||||
catch (const cv::Exception& e)
|
|
||||||
{
|
|
||||||
ASSERT_EQ(CV_StsNotImplemented, e.code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
std::vector<cv::KeyPoint> keypoints;
|
std::vector<cv::KeyPoint> keypoints;
|
||||||
surf(loadMat(image), cv::gpu::GpuMat(), keypoints);
|
surf(loadMat(image), cv::gpu::GpuMat(), keypoints);
|
||||||
|
|
||||||
@ -125,7 +107,6 @@ GPU_TEST_P(SURF, Detector)
|
|||||||
double matchedRatio = static_cast<double>(matchedCount) / keypoints_gold.size();
|
double matchedRatio = static_cast<double>(matchedCount) / keypoints_gold.size();
|
||||||
|
|
||||||
EXPECT_GT(matchedRatio, 0.95);
|
EXPECT_GT(matchedRatio, 0.95);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GPU_TEST_P(SURF, Detector_Masked)
|
GPU_TEST_P(SURF, Detector_Masked)
|
||||||
@ -144,20 +125,6 @@ GPU_TEST_P(SURF, Detector_Masked)
|
|||||||
surf.upright = upright;
|
surf.upright = upright;
|
||||||
surf.keypointsRatio = 0.05f;
|
surf.keypointsRatio = 0.05f;
|
||||||
|
|
||||||
if (!supportFeature(devInfo, cv::gpu::GLOBAL_ATOMICS))
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
std::vector<cv::KeyPoint> keypoints;
|
|
||||||
surf(loadMat(image), loadMat(mask), keypoints);
|
|
||||||
}
|
|
||||||
catch (const cv::Exception& e)
|
|
||||||
{
|
|
||||||
ASSERT_EQ(CV_StsNotImplemented, e.code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
std::vector<cv::KeyPoint> keypoints;
|
std::vector<cv::KeyPoint> keypoints;
|
||||||
surf(loadMat(image), loadMat(mask), keypoints);
|
surf(loadMat(image), loadMat(mask), keypoints);
|
||||||
|
|
||||||
@ -176,7 +143,6 @@ GPU_TEST_P(SURF, Detector_Masked)
|
|||||||
double matchedRatio = static_cast<double>(matchedCount) / keypoints_gold.size();
|
double matchedRatio = static_cast<double>(matchedCount) / keypoints_gold.size();
|
||||||
|
|
||||||
EXPECT_GT(matchedRatio, 0.95);
|
EXPECT_GT(matchedRatio, 0.95);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GPU_TEST_P(SURF, Descriptor)
|
GPU_TEST_P(SURF, Descriptor)
|
||||||
@ -199,21 +165,6 @@ GPU_TEST_P(SURF, Descriptor)
|
|||||||
surf_gold.extended = extended;
|
surf_gold.extended = extended;
|
||||||
surf_gold.upright = upright;
|
surf_gold.upright = upright;
|
||||||
|
|
||||||
if (!supportFeature(devInfo, cv::gpu::GLOBAL_ATOMICS))
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
std::vector<cv::KeyPoint> keypoints;
|
|
||||||
cv::gpu::GpuMat descriptors;
|
|
||||||
surf(loadMat(image), cv::gpu::GpuMat(), keypoints, descriptors);
|
|
||||||
}
|
|
||||||
catch (const cv::Exception& e)
|
|
||||||
{
|
|
||||||
ASSERT_EQ(CV_StsNotImplemented, e.code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
std::vector<cv::KeyPoint> keypoints;
|
std::vector<cv::KeyPoint> keypoints;
|
||||||
surf_gold(image, cv::noArray(), keypoints);
|
surf_gold(image, cv::noArray(), keypoints);
|
||||||
|
|
||||||
@ -231,11 +182,9 @@ GPU_TEST_P(SURF, Descriptor)
|
|||||||
double matchedRatio = static_cast<double>(matchedCount) / keypoints.size();
|
double matchedRatio = static_cast<double>(matchedCount) / keypoints.size();
|
||||||
|
|
||||||
EXPECT_GT(matchedRatio, 0.6);
|
EXPECT_GT(matchedRatio, 0.6);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(GPU_Features2D, SURF, testing::Combine(
|
INSTANTIATE_TEST_CASE_P(GPU_Features2D, SURF, testing::Combine(
|
||||||
ALL_DEVICES,
|
|
||||||
testing::Values(SURF_HessianThreshold(100.0), SURF_HessianThreshold(500.0), SURF_HessianThreshold(1000.0)),
|
testing::Values(SURF_HessianThreshold(100.0), SURF_HessianThreshold(500.0), SURF_HessianThreshold(1000.0)),
|
||||||
testing::Values(SURF_Octaves(3), SURF_Octaves(4)),
|
testing::Values(SURF_Octaves(3), SURF_Octaves(4)),
|
||||||
testing::Values(SURF_OctaveLayers(2), SURF_OctaveLayers(3)),
|
testing::Values(SURF_OctaveLayers(2), SURF_OctaveLayers(3)),
|
||||||
@ -245,17 +194,15 @@ INSTANTIATE_TEST_CASE_P(GPU_Features2D, SURF, testing::Combine(
|
|||||||
//////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////
|
||||||
// VIBE
|
// VIBE
|
||||||
|
|
||||||
PARAM_TEST_CASE(VIBE, cv::gpu::DeviceInfo, cv::Size, MatType, UseRoi)
|
PARAM_TEST_CASE(VIBE, cv::Size, MatType, UseRoi)
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
GPU_TEST_P(VIBE, Accuracy)
|
GPU_TEST_P(VIBE, Accuracy)
|
||||||
{
|
{
|
||||||
const cv::gpu::DeviceInfo devInfo = GET_PARAM(0);
|
const cv::Size size = GET_PARAM(0);
|
||||||
cv::gpu::setDevice(devInfo.deviceID());
|
const int type = GET_PARAM(1);
|
||||||
const cv::Size size = GET_PARAM(1);
|
const bool useRoi = GET_PARAM(2);
|
||||||
const int type = GET_PARAM(2);
|
|
||||||
const bool useRoi = GET_PARAM(3);
|
|
||||||
|
|
||||||
const cv::Mat fullfg(size, CV_8UC1, cv::Scalar::all(255));
|
const cv::Mat fullfg(size, CV_8UC1, cv::Scalar::all(255));
|
||||||
|
|
||||||
@ -278,7 +225,6 @@ GPU_TEST_P(VIBE, Accuracy)
|
|||||||
}
|
}
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(GPU_Video, VIBE, testing::Combine(
|
INSTANTIATE_TEST_CASE_P(GPU_Video, VIBE, testing::Combine(
|
||||||
ALL_DEVICES,
|
|
||||||
DIFFERENT_SIZES,
|
DIFFERENT_SIZES,
|
||||||
testing::Values(MatType(CV_8UC1), MatType(CV_8UC3), MatType(CV_8UC4)),
|
testing::Values(MatType(CV_8UC1), MatType(CV_8UC3), MatType(CV_8UC4)),
|
||||||
WHOLE_SUBMAT));
|
WHOLE_SUBMAT));
|
||||||
|
@ -1,73 +1,3 @@
|
|||||||
#include "test_precomp.hpp"
|
#include "test_precomp.hpp"
|
||||||
|
|
||||||
#if defined(HAVE_OPENCV_GPU) && defined(HAVE_CUDA)
|
|
||||||
|
|
||||||
using namespace cv;
|
|
||||||
using namespace cv::gpu;
|
|
||||||
using namespace cvtest;
|
|
||||||
using namespace testing;
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
const char* keys =
|
|
||||||
"{ h | help ? | false | Print help}"
|
|
||||||
"{ i | info | false | Print information about system and exit }"
|
|
||||||
"{ d | device | -1 | Device on which tests will be executed (-1 means all devices) }"
|
|
||||||
;
|
|
||||||
|
|
||||||
CommandLineParser cmd(argc, (const char**)argv, keys);
|
|
||||||
|
|
||||||
if (cmd.get<bool>("help"))
|
|
||||||
{
|
|
||||||
cmd.printMessage();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
printCudaInfo();
|
|
||||||
|
|
||||||
if (cmd.get<bool>("info"))
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int device = cmd.get<int>("device");
|
|
||||||
if (device < 0)
|
|
||||||
{
|
|
||||||
DeviceManager::instance().loadAll();
|
|
||||||
|
|
||||||
std::cout << "Run tests on all supported devices \n" << std::endl;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DeviceManager::instance().load(device);
|
|
||||||
|
|
||||||
DeviceInfo info(device);
|
|
||||||
std::cout << "Run tests on device " << device << " [" << info.name() << "] \n" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
TS::ptr()->init("cv");
|
|
||||||
InitGoogleTest(&argc, argv);
|
|
||||||
|
|
||||||
return RUN_ALL_TESTS();
|
|
||||||
}
|
|
||||||
catch (const std::exception& e)
|
|
||||||
{
|
|
||||||
std::cerr << e.what() << std::endl;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
std::cerr << "Unknown error" << std::endl;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else // HAVE_CUDA
|
|
||||||
|
|
||||||
CV_TEST_MAIN("cv")
|
CV_TEST_MAIN("cv")
|
||||||
|
|
||||||
#endif // HAVE_CUDA
|
|
||||||
|
@ -15,14 +15,16 @@
|
|||||||
#include "opencv2/highgui.hpp"
|
#include "opencv2/highgui.hpp"
|
||||||
#include "opencv2/nonfree.hpp"
|
#include "opencv2/nonfree.hpp"
|
||||||
|
|
||||||
|
#include "opencv2/ts/gpu_test.hpp"
|
||||||
|
|
||||||
#include "opencv2/opencv_modules.hpp"
|
#include "opencv2/opencv_modules.hpp"
|
||||||
|
|
||||||
#ifdef HAVE_OPENCV_OCL
|
#ifdef HAVE_OPENCV_OCL
|
||||||
# include "opencv2/nonfree/ocl.hpp"
|
# include "opencv2/nonfree/ocl.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HAVE_OPENCV_GPU) && defined(HAVE_CUDA)
|
#ifdef HAVE_OPENCV_GPU
|
||||||
#include "opencv2/ts/gpu_test.hpp"
|
# include "opencv2/nonfree/gpu.hpp"
|
||||||
#include "opencv2/nonfree/gpu.hpp"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -109,17 +109,6 @@ static int getMatchedPointsCount(const std::vector<cv::KeyPoint>& keypoints1, co
|
|||||||
return validCount;
|
return validCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PARAM_TEST_CASE(name, ...) struct name : testing::TestWithParam< std::tr1::tuple< __VA_ARGS__ > >
|
|
||||||
#define IMPLEMENT_PARAM_CLASS(name, type) \
|
|
||||||
namespace { class name { \
|
|
||||||
public: \
|
|
||||||
name ( type arg = type ()) : val_(arg) {} \
|
|
||||||
operator type () const {return val_;} \
|
|
||||||
private: \
|
|
||||||
type val_; \
|
|
||||||
}; \
|
|
||||||
inline void PrintTo( name param, std::ostream* os) {*os << #name << "=" << testing::PrintToString(static_cast< type >(param));}}
|
|
||||||
|
|
||||||
IMPLEMENT_PARAM_CLASS(HessianThreshold, double)
|
IMPLEMENT_PARAM_CLASS(HessianThreshold, double)
|
||||||
IMPLEMENT_PARAM_CLASS(Octaves, int)
|
IMPLEMENT_PARAM_CLASS(Octaves, int)
|
||||||
IMPLEMENT_PARAM_CLASS(OctaveLayers, int)
|
IMPLEMENT_PARAM_CLASS(OctaveLayers, int)
|
||||||
|
@ -3,5 +3,5 @@ if(NOT HAVE_OPENCL)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(the_description "OpenCL-accelerated Computer Vision")
|
set(the_description "OpenCL-accelerated Computer Vision")
|
||||||
ocv_define_module(ocl opencv_core opencv_imgproc opencv_objdetect opencv_video)
|
ocv_define_module(ocl opencv_core opencv_imgproc opencv_objdetect opencv_video opencv_features2d)
|
||||||
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow)
|
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow)
|
||||||
|
@ -50,7 +50,6 @@
|
|||||||
#include "opencv2/core.hpp"
|
#include "opencv2/core.hpp"
|
||||||
#include "opencv2/imgproc.hpp"
|
#include "opencv2/imgproc.hpp"
|
||||||
#include "opencv2/objdetect.hpp"
|
#include "opencv2/objdetect.hpp"
|
||||||
//#include "opencv2/features2d.hpp"
|
|
||||||
|
|
||||||
namespace cv
|
namespace cv
|
||||||
{
|
{
|
||||||
@ -125,6 +124,9 @@ namespace cv
|
|||||||
|
|
||||||
CV_EXPORTS void* getoclCommandQueue();
|
CV_EXPORTS void* getoclCommandQueue();
|
||||||
|
|
||||||
|
//explicit call clFinish. The global command queue will be used.
|
||||||
|
CV_EXPORTS void finish();
|
||||||
|
|
||||||
//this function enable ocl module to use customized cl_context and cl_command_queue
|
//this function enable ocl module to use customized cl_context and cl_command_queue
|
||||||
//getDevice also need to be called before this function
|
//getDevice also need to be called before this function
|
||||||
CV_EXPORTS void setDeviceEx(Info &oclinfo, void *ctx, void *qu, int devnum = 0);
|
CV_EXPORTS void setDeviceEx(Info &oclinfo, void *ctx, void *qu, int devnum = 0);
|
||||||
@ -1714,6 +1716,36 @@ namespace cv
|
|||||||
private:
|
private:
|
||||||
oclMat minSSD, leBuf, riBuf;
|
oclMat minSSD, leBuf, riBuf;
|
||||||
};
|
};
|
||||||
|
class CV_EXPORTS StereoBeliefPropagation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum { DEFAULT_NDISP = 64 };
|
||||||
|
enum { DEFAULT_ITERS = 5 };
|
||||||
|
enum { DEFAULT_LEVELS = 5 };
|
||||||
|
static void estimateRecommendedParams(int width, int height, int &ndisp, int &iters, int &levels);
|
||||||
|
explicit StereoBeliefPropagation(int ndisp = DEFAULT_NDISP,
|
||||||
|
int iters = DEFAULT_ITERS,
|
||||||
|
int levels = DEFAULT_LEVELS,
|
||||||
|
int msg_type = CV_16S);
|
||||||
|
StereoBeliefPropagation(int ndisp, int iters, int levels,
|
||||||
|
float max_data_term, float data_weight,
|
||||||
|
float max_disc_term, float disc_single_jump,
|
||||||
|
int msg_type = CV_32F);
|
||||||
|
void operator()(const oclMat &left, const oclMat &right, oclMat &disparity);
|
||||||
|
void operator()(const oclMat &data, oclMat &disparity);
|
||||||
|
int ndisp;
|
||||||
|
int iters;
|
||||||
|
int levels;
|
||||||
|
float max_data_term;
|
||||||
|
float data_weight;
|
||||||
|
float max_disc_term;
|
||||||
|
float disc_single_jump;
|
||||||
|
int msg_type;
|
||||||
|
private:
|
||||||
|
oclMat u, d, l, r, u2, d2, l2, r2;
|
||||||
|
std::vector<oclMat> datas;
|
||||||
|
oclMat out;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if defined _MSC_VER && _MSC_VER >= 1200
|
#if defined _MSC_VER && _MSC_VER >= 1200
|
||||||
|
@ -1,120 +0,0 @@
|
|||||||
/*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.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Intel License Agreement
|
|
||||||
// For Open Source Computer Vision Library
|
|
||||||
//
|
|
||||||
// Copyright (C) 2000, Intel Corporation, 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 Intel Corporation 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*/
|
|
||||||
|
|
||||||
#ifndef __OPENCV_TEST_INTERPOLATION_HPP__
|
|
||||||
#define __OPENCV_TEST_INTERPOLATION_HPP__
|
|
||||||
|
|
||||||
template <typename T> T readVal(const cv::Mat &src, int y, int x, int c, int border_type, cv::Scalar borderVal = cv::Scalar())
|
|
||||||
{
|
|
||||||
if (border_type == cv::BORDER_CONSTANT)
|
|
||||||
return (y >= 0 && y < src.rows && x >= 0 && x < src.cols) ? src.at<T>(y, x * src.channels() + c) : cv::saturate_cast<T>(borderVal.val[c]);
|
|
||||||
|
|
||||||
return src.at<T>(cv::borderInterpolate(y, src.rows, border_type), cv::borderInterpolate(x, src.cols, border_type) * src.channels() + c);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T> struct NearestInterpolator
|
|
||||||
{
|
|
||||||
static T getValue(const cv::Mat &src, float y, float x, int c, int border_type, cv::Scalar borderVal = cv::Scalar())
|
|
||||||
{
|
|
||||||
return readVal<T>(src, cvFloor(y), cvFloor(x), c, border_type, borderVal);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T> struct LinearInterpolator
|
|
||||||
{
|
|
||||||
static T getValue(const cv::Mat &src, float y, float x, int c, int border_type, cv::Scalar borderVal = cv::Scalar())
|
|
||||||
{
|
|
||||||
x -= 0.5f;
|
|
||||||
y -= 0.5f;
|
|
||||||
|
|
||||||
int x1 = cvFloor(x);
|
|
||||||
int y1 = cvFloor(y);
|
|
||||||
int x2 = x1 + 1;
|
|
||||||
int y2 = y1 + 1;
|
|
||||||
|
|
||||||
float res = 0;
|
|
||||||
|
|
||||||
res += readVal<T>(src, y1, x1, c, border_type, borderVal) * ((x2 - x) * (y2 - y));
|
|
||||||
res += readVal<T>(src, y1, x2, c, border_type, borderVal) * ((x - x1) * (y2 - y));
|
|
||||||
res += readVal<T>(src, y2, x1, c, border_type, borderVal) * ((x2 - x) * (y - y1));
|
|
||||||
res += readVal<T>(src, y2, x2, c, border_type, borderVal) * ((x - x1) * (y - y1));
|
|
||||||
|
|
||||||
return cv::saturate_cast<T>(res);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T> struct CubicInterpolator
|
|
||||||
{
|
|
||||||
static float getValue(float p[4], float x)
|
|
||||||
{
|
|
||||||
return p[1] + 0.5 * x * (p[2] - p[0] + x * (2.0 * p[0] - 5.0 * p[1] + 4.0 * p[2] - p[3] + x * (3.0 * (p[1] - p[2]) + p[3] - p[0])));
|
|
||||||
}
|
|
||||||
|
|
||||||
static float getValue(float p[4][4], float x, float y)
|
|
||||||
{
|
|
||||||
float arr[4];
|
|
||||||
|
|
||||||
arr[0] = getValue(p[0], x);
|
|
||||||
arr[1] = getValue(p[1], x);
|
|
||||||
arr[2] = getValue(p[2], x);
|
|
||||||
arr[3] = getValue(p[3], x);
|
|
||||||
|
|
||||||
return getValue(arr, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
static T getValue(const cv::Mat &src, float y, float x, int c, int border_type, cv::Scalar borderVal = cv::Scalar())
|
|
||||||
{
|
|
||||||
int ix = cvRound(x);
|
|
||||||
int iy = cvRound(y);
|
|
||||||
|
|
||||||
float vals[4][4] =
|
|
||||||
{
|
|
||||||
{readVal<T>(src, iy - 2, ix - 2, c, border_type, borderVal), readVal<T>(src, iy - 2, ix - 1, c, border_type, borderVal), readVal<T>(src, iy - 2, ix, c, border_type, borderVal), readVal<T>(src, iy - 2, ix + 1, c, border_type, borderVal)},
|
|
||||||
{readVal<T>(src, iy - 1, ix - 2, c, border_type, borderVal), readVal<T>(src, iy - 1, ix - 1, c, border_type, borderVal), readVal<T>(src, iy - 1, ix, c, border_type, borderVal), readVal<T>(src, iy - 1, ix + 1, c, border_type, borderVal)},
|
|
||||||
{readVal<T>(src, iy , ix - 2, c, border_type, borderVal), readVal<T>(src, iy , ix - 1, c, border_type, borderVal), readVal<T>(src, iy , ix, c, border_type, borderVal), readVal<T>(src, iy , ix + 1, c, border_type, borderVal)},
|
|
||||||
{readVal<T>(src, iy + 1, ix - 2, c, border_type, borderVal), readVal<T>(src, iy + 1, ix - 1, c, border_type, borderVal), readVal<T>(src, iy + 1, ix, c, border_type, borderVal), readVal<T>(src, iy + 1, ix + 1, c, border_type, borderVal)},
|
|
||||||
};
|
|
||||||
|
|
||||||
return cv::saturate_cast<T>(getValue(vals, (x - ix + 2.0) / 4.0, (y - iy + 2.0) / 4.0));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // __OPENCV_TEST_INTERPOLATION_HPP__
|
|
@ -7,12 +7,13 @@
|
|||||||
// copy or use the software.
|
// copy or use the software.
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// Intel License Agreement
|
// License Agreement
|
||||||
// For Open Source Computer Vision Library
|
// For Open Source Computer Vision Library
|
||||||
//
|
//
|
||||||
// Copyright (C) 2000, Intel Corporation, all rights reserved.
|
// 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.
|
// Third party copyrights are property of their respective owners.
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without modification,
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
// are permitted provided that the following conditions are met:
|
// are permitted provided that the following conditions are met:
|
||||||
//
|
//
|
||||||
@ -21,12 +22,12 @@
|
|||||||
//
|
//
|
||||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||||
// this list of conditions and the following disclaimer in the documentation
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
// and/or other materials provided with the distribution.
|
// and/or other oclMaterials provided with the distribution.
|
||||||
//
|
//
|
||||||
// * The name of Intel Corporation may not be used to endorse or promote products
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
// derived from this software without specific prior written permission.
|
// derived from this software without specific prior written permission.
|
||||||
//
|
//
|
||||||
// This software is provided by the copyright holders and contributors "as is" and
|
// 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
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
// 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,
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
@ -41,99 +42,118 @@
|
|||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
|
|
||||||
#ifdef HAVE_OPENCL
|
int main(int argc, const char *argv[])
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace cv;
|
|
||||||
using namespace cv::ocl;
|
|
||||||
using namespace cvtest;
|
|
||||||
using namespace testing;
|
|
||||||
|
|
||||||
void print_info()
|
|
||||||
{
|
{
|
||||||
printf("\n");
|
vector<ocl::Info> oclinfo;
|
||||||
#if defined _WIN32
|
int num_devices = getDevice(oclinfo);
|
||||||
# if defined _WIN64
|
|
||||||
puts("OS: Windows 64");
|
if (num_devices < 1)
|
||||||
# else
|
{
|
||||||
puts("OS: Windows 32");
|
cerr << "no device found\n";
|
||||||
# endif
|
return -1;
|
||||||
#elif defined linux
|
}
|
||||||
# if defined _LP64
|
|
||||||
puts("OS: Linux 64");
|
int devidx = 0;
|
||||||
# else
|
|
||||||
puts("OS: Linux 32");
|
for (size_t i = 0; i < oclinfo.size(); i++)
|
||||||
# endif
|
{
|
||||||
#elif defined __APPLE__
|
for (size_t j = 0; j < oclinfo[i].DeviceName.size(); j++)
|
||||||
# if defined _LP64
|
{
|
||||||
puts("OS: Apple 64");
|
printf("device %d: %s\n", devidx++, oclinfo[i].DeviceName[j].c_str());
|
||||||
# else
|
}
|
||||||
puts("OS: Apple 32");
|
}
|
||||||
# endif
|
|
||||||
#endif
|
redirectError(cvErrorCallback);
|
||||||
|
|
||||||
}
|
|
||||||
std::string workdir;
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
TS::ptr()->init("ocl");
|
|
||||||
InitGoogleTest(&argc, argv);
|
|
||||||
const char *keys =
|
const char *keys =
|
||||||
"{ h | false | print help message }"
|
"{ h help | false | print help message }"
|
||||||
"{ w | ../../../samples/c/| set working directory i.e. -w=C:\\}"
|
"{ f filter | | filter for test }"
|
||||||
"{ t | gpu | set device type:i.e. -t=cpu or gpu}"
|
"{ w workdir | | set working directory }"
|
||||||
"{ p | 0 | set platform id i.e. -p=0}"
|
"{ l list | false | show all tests }"
|
||||||
"{ d | 0 | set device id i.e. -d=0}";
|
"{ d device | 0 | device id }"
|
||||||
|
"{ i iters | 10 | iteration count }"
|
||||||
|
"{ m warmup | 1 | gpu warm up iteration count}"
|
||||||
|
"{ t xtop | 1.1 | xfactor top boundary}"
|
||||||
|
"{ b xbottom | 0.9 | xfactor bottom boundary}"
|
||||||
|
"{ v verify | false | only run gpu once to verify if problems occur}";
|
||||||
|
|
||||||
CommandLineParser cmd(argc, argv, keys);
|
CommandLineParser cmd(argc, argv, keys);
|
||||||
if (cmd.get<string>("h")=="true")
|
|
||||||
|
if (cmd.has("help"))
|
||||||
{
|
{
|
||||||
cout << "Avaible options besides goole test option:" << endl;
|
cout << "Avaible options:" << endl;
|
||||||
cmd.printMessage();
|
cmd.printMessage();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
workdir = cmd.get<string>("w");
|
|
||||||
string type = cmd.get<string>("t");
|
|
||||||
unsigned int pid = cmd.get<unsigned int>("p");
|
|
||||||
int device = cmd.get<int>("d");
|
|
||||||
print_info();
|
|
||||||
// int flag = CVCL_DEVICE_TYPE_GPU;
|
|
||||||
|
|
||||||
// if(type == "cpu")
|
int device = cmd.get<int>("device");
|
||||||
// {
|
|
||||||
// flag = CVCL_DEVICE_TYPE_CPU;
|
if (device < 0 || device >= num_devices)
|
||||||
// }
|
|
||||||
std::vector<cv::ocl::Info> oclinfo;
|
|
||||||
int devnums = getDevice(oclinfo);
|
|
||||||
if(devnums <= device || device < 0)
|
|
||||||
{
|
{
|
||||||
std::cout << "device invalid\n";
|
cerr << "Invalid device ID" << endl;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pid >= oclinfo.size())
|
if (cmd.get<bool>("verify"))
|
||||||
{
|
{
|
||||||
std::cout << "platform invalid\n";
|
TestSystem::instance().setNumIters(1);
|
||||||
return -1;
|
TestSystem::instance().setGPUWarmupIters(0);
|
||||||
|
TestSystem::instance().setCPUIters(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pid != 0 || device != 0)
|
devidx = 0;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < oclinfo.size(); i++)
|
||||||
{
|
{
|
||||||
setDevice(oclinfo[pid], device);
|
for (size_t j = 0; j < oclinfo[i].DeviceName.size(); j++, devidx++)
|
||||||
|
{
|
||||||
|
if (device == devidx)
|
||||||
|
{
|
||||||
|
ocl::setDevice(oclinfo[i], (int)j);
|
||||||
|
TestSystem::instance().setRecordName(oclinfo[i].DeviceName[j]);
|
||||||
|
printf("\nuse %d: %s\n", devidx, oclinfo[i].DeviceName[j].c_str());
|
||||||
|
goto END_DEV;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cout << "Device type:" << type << endl << "Device name:" << oclinfo[pid].DeviceName[device] << endl;
|
END_DEV:
|
||||||
setBinpath(CLBINPATH);
|
|
||||||
return RUN_ALL_TESTS();
|
|
||||||
}
|
|
||||||
|
|
||||||
#else // DON'T HAVE_OPENCL
|
string filter = cmd.get<string>("filter");
|
||||||
|
string workdir = cmd.get<string>("workdir");
|
||||||
|
bool list = cmd.has("list");
|
||||||
|
int iters = cmd.get<int>("iters");
|
||||||
|
int wu_iters = cmd.get<int>("warmup");
|
||||||
|
double x_top = cmd.get<double>("xtop");
|
||||||
|
double x_bottom = cmd.get<double>("xbottom");
|
||||||
|
|
||||||
|
TestSystem::instance().setTopThreshold(x_top);
|
||||||
|
TestSystem::instance().setBottomThreshold(x_bottom);
|
||||||
|
|
||||||
|
if (!filter.empty())
|
||||||
|
{
|
||||||
|
TestSystem::instance().setTestFilter(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!workdir.empty())
|
||||||
|
{
|
||||||
|
if (workdir[workdir.size() - 1] != '/' && workdir[workdir.size() - 1] != '\\')
|
||||||
|
{
|
||||||
|
workdir += '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
TestSystem::instance().setWorkingDir(workdir);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (list)
|
||||||
|
{
|
||||||
|
TestSystem::instance().setListMode(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestSystem::instance().setNumIters(iters);
|
||||||
|
TestSystem::instance().setGPUWarmupIters(wu_iters);
|
||||||
|
|
||||||
|
TestSystem::instance().run();
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
printf("OpenCV was built without OpenCL support\n");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif // HAVE_OPENCL
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -44,79 +44,77 @@
|
|||||||
//M*/
|
//M*/
|
||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
#include <iomanip>
|
///////////// blend ////////////////////////
|
||||||
|
template <typename T>
|
||||||
#ifdef HAVE_OPENCL
|
void blendLinearGold(const cv::Mat &img1, const cv::Mat &img2, const cv::Mat &weights1, const cv::Mat &weights2, cv::Mat &result_gold)
|
||||||
using namespace cv;
|
|
||||||
using namespace cv::ocl;
|
|
||||||
using namespace cvtest;
|
|
||||||
using namespace testing;
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
PARAM_TEST_CASE(Blend, MatType, int)
|
|
||||||
{
|
{
|
||||||
int type;
|
result_gold.create(img1.size(), img1.type());
|
||||||
int channels;
|
|
||||||
std::vector<cv::ocl::Info> oclinfo;
|
|
||||||
|
|
||||||
virtual void SetUp()
|
int cn = img1.channels();
|
||||||
|
|
||||||
|
for (int y = 0; y < img1.rows; ++y)
|
||||||
{
|
{
|
||||||
|
const float *weights1_row = weights1.ptr<float>(y);
|
||||||
|
const float *weights2_row = weights2.ptr<float>(y);
|
||||||
|
const T *img1_row = img1.ptr<T>(y);
|
||||||
|
const T *img2_row = img2.ptr<T>(y);
|
||||||
|
T *result_gold_row = result_gold.ptr<T>(y);
|
||||||
|
|
||||||
type = GET_PARAM(0);
|
for (int x = 0; x < img1.cols * cn; ++x)
|
||||||
channels = GET_PARAM(1);
|
{
|
||||||
//int devnums = getDevice(oclinfo);
|
float w1 = weights1_row[x / cn];
|
||||||
//CV_Assert(devnums > 0);
|
float w2 = weights2_row[x / cn];
|
||||||
//cv::ocl::setBinpath(CLBINPATH);
|
result_gold_row[x] = static_cast<T>((img1_row[x] * w1 + img2_row[x] * w2) / (w1 + w2 + 1e-5f));
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
TEST_P(Blend, Performance)
|
|
||||||
{
|
|
||||||
cv::Size size(MWIDTH, MHEIGHT);
|
|
||||||
cv::Mat img1_host = randomMat(size, CV_MAKETYPE(type, channels), 0, type == CV_8U ? 255.0 : 1.0);
|
|
||||||
cv::Mat img2_host = randomMat(size, CV_MAKETYPE(type, channels), 0, type == CV_8U ? 255.0 : 1.0);
|
|
||||||
cv::Mat weights1 = randomMat(size, CV_32F, 0, 1);
|
|
||||||
cv::Mat weights2 = randomMat(size, CV_32F, 0, 1);
|
|
||||||
cv::ocl::oclMat gimg1(size, CV_MAKETYPE(type, channels)), gimg2(size, CV_MAKETYPE(type, channels)), gweights1(size, CV_32F), gweights2(size, CV_32F);
|
|
||||||
cv::ocl::oclMat gdst(size, CV_MAKETYPE(type, channels));
|
|
||||||
|
|
||||||
|
|
||||||
double totalgputick_all = 0;
|
|
||||||
double totalgputick_kernel = 0;
|
|
||||||
double t1 = 0;
|
|
||||||
double t2 = 0;
|
|
||||||
|
|
||||||
for (int j = 0; j < LOOP_TIMES + 1; j ++) //LOOP_TIMES=100
|
|
||||||
{
|
|
||||||
t1 = (double)cvGetTickCount();
|
|
||||||
cv::ocl::oclMat gimg1 = cv::ocl::oclMat(img1_host);
|
|
||||||
cv::ocl::oclMat gimg2 = cv::ocl::oclMat(img2_host);
|
|
||||||
cv::ocl::oclMat gweights1 = cv::ocl::oclMat(weights1);
|
|
||||||
cv::ocl::oclMat gweights2 = cv::ocl::oclMat(weights1);
|
|
||||||
|
|
||||||
t2 = (double)cvGetTickCount();
|
|
||||||
cv::ocl::blendLinear(gimg1, gimg2, gweights1, gweights2, gdst);
|
|
||||||
t2 = (double)cvGetTickCount() - t2;
|
|
||||||
|
|
||||||
cv::Mat m;
|
|
||||||
gdst.download(m);
|
|
||||||
t1 = (double)cvGetTickCount() - t1;
|
|
||||||
|
|
||||||
if (j == 0)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
totalgputick_all = t1 + totalgputick_all;
|
|
||||||
totalgputick_kernel = t2 + totalgputick_kernel;
|
|
||||||
};
|
|
||||||
|
|
||||||
cout << "average gpu total runtime is " << totalgputick_all / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
|
|
||||||
cout << "average gpu runtime without data transfering is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
TEST(blend)
|
||||||
|
{
|
||||||
|
Mat src1, src2, weights1, weights2, dst;
|
||||||
|
ocl::oclMat d_src1, d_src2, d_weights1, d_weights2, d_dst;
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Blend, Combine(
|
int all_type[] = {CV_8UC1, CV_8UC4};
|
||||||
Values(CV_8U, CV_32F), Values(1, 4)));
|
std::string type_name[] = {"CV_8UC1", "CV_8UC4"};
|
||||||
#endif
|
|
||||||
|
for (int size = Min_Size; size <= Max_Size; size *= Multiple)
|
||||||
|
{
|
||||||
|
for (size_t j = 0; j < sizeof(all_type) / sizeof(int); j++)
|
||||||
|
{
|
||||||
|
SUBTEST << size << 'x' << size << "; " << type_name[j] << " and CV_32FC1";
|
||||||
|
|
||||||
|
gen(src1, size, size, all_type[j], 0, 256);
|
||||||
|
gen(src2, size, size, all_type[j], 0, 256);
|
||||||
|
gen(weights1, size, size, CV_32FC1, 0, 1);
|
||||||
|
gen(weights2, size, size, CV_32FC1, 0, 1);
|
||||||
|
|
||||||
|
blendLinearGold<uchar>(src1, src2, weights1, weights2, dst);
|
||||||
|
|
||||||
|
CPU_ON;
|
||||||
|
blendLinearGold<uchar>(src1, src2, weights1, weights2, dst);
|
||||||
|
CPU_OFF;
|
||||||
|
|
||||||
|
d_src1.upload(src1);
|
||||||
|
d_src2.upload(src2);
|
||||||
|
d_weights1.upload(weights1);
|
||||||
|
d_weights2.upload(weights2);
|
||||||
|
|
||||||
|
WARMUP_ON;
|
||||||
|
ocl::blendLinear(d_src1, d_src2, d_weights1, d_weights2, d_dst);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
ocl::blendLinear(d_src1, d_src2, d_weights1, d_weights2, d_dst);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_src1.upload(src1);
|
||||||
|
d_src2.upload(src2);
|
||||||
|
d_weights1.upload(weights1);
|
||||||
|
d_weights2.upload(weights2);
|
||||||
|
ocl::blendLinear(d_src1, d_src2, d_weights1, d_weights2, d_dst);
|
||||||
|
d_dst.download(dst);
|
||||||
|
GPU_FULL_OFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
150
modules/ocl/perf/perf_brute_force_matcher.cpp
Normal file
150
modules/ocl/perf/perf_brute_force_matcher.cpp
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
/*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
|
||||||
|
// Fangfang Bai, fangfang@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"
|
||||||
|
|
||||||
|
//////////////////// BruteForceMatch /////////////////
|
||||||
|
TEST(BruteForceMatcher)
|
||||||
|
{
|
||||||
|
Mat trainIdx_cpu;
|
||||||
|
Mat distance_cpu;
|
||||||
|
Mat allDist_cpu;
|
||||||
|
Mat nMatches_cpu;
|
||||||
|
|
||||||
|
for (int size = Min_Size; size <= Max_Size; size *= Multiple)
|
||||||
|
{
|
||||||
|
// Init CPU matcher
|
||||||
|
int desc_len = 64;
|
||||||
|
|
||||||
|
BFMatcher matcher(NORM_L2);
|
||||||
|
|
||||||
|
Mat query;
|
||||||
|
gen(query, size, desc_len, CV_32F, 0, 1);
|
||||||
|
|
||||||
|
Mat train;
|
||||||
|
gen(train, size, desc_len, CV_32F, 0, 1);
|
||||||
|
// Output
|
||||||
|
vector< vector<DMatch> > matches(2);
|
||||||
|
// Init GPU matcher
|
||||||
|
ocl::BruteForceMatcher_OCL_base d_matcher(ocl::BruteForceMatcher_OCL_base::L2Dist);
|
||||||
|
|
||||||
|
ocl::oclMat d_query(query);
|
||||||
|
ocl::oclMat d_train(train);
|
||||||
|
|
||||||
|
ocl::oclMat d_trainIdx, d_distance, d_allDist, d_nMatches;
|
||||||
|
|
||||||
|
SUBTEST << size << "; match";
|
||||||
|
|
||||||
|
matcher.match(query, train, matches[0]);
|
||||||
|
|
||||||
|
CPU_ON;
|
||||||
|
matcher.match(query, train, matches[0]);
|
||||||
|
CPU_OFF;
|
||||||
|
|
||||||
|
WARMUP_ON;
|
||||||
|
d_matcher.matchSingle(d_query, d_train, d_trainIdx, d_distance);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
d_matcher.matchSingle(d_query, d_train, d_trainIdx, d_distance);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_query.upload(query);
|
||||||
|
d_train.upload(train);
|
||||||
|
d_matcher.match(d_query, d_train, matches[0]);
|
||||||
|
GPU_FULL_OFF;
|
||||||
|
|
||||||
|
SUBTEST << size << "; knnMatch";
|
||||||
|
|
||||||
|
matcher.knnMatch(query, train, matches, 2);
|
||||||
|
|
||||||
|
CPU_ON;
|
||||||
|
matcher.knnMatch(query, train, matches, 2);
|
||||||
|
CPU_OFF;
|
||||||
|
|
||||||
|
WARMUP_ON;
|
||||||
|
d_matcher.knnMatchSingle(d_query, d_train, d_trainIdx, d_distance, d_allDist, 2);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
d_matcher.knnMatchSingle(d_query, d_train, d_trainIdx, d_distance, d_allDist, 2);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_query.upload(query);
|
||||||
|
d_train.upload(train);
|
||||||
|
d_matcher.knnMatch(d_query, d_train, matches, 2);
|
||||||
|
GPU_FULL_OFF;
|
||||||
|
|
||||||
|
SUBTEST << size << "; radiusMatch";
|
||||||
|
|
||||||
|
float max_distance = 2.0f;
|
||||||
|
|
||||||
|
matcher.radiusMatch(query, train, matches, max_distance);
|
||||||
|
|
||||||
|
CPU_ON;
|
||||||
|
matcher.radiusMatch(query, train, matches, max_distance);
|
||||||
|
CPU_OFF;
|
||||||
|
|
||||||
|
d_trainIdx.release();
|
||||||
|
|
||||||
|
WARMUP_ON;
|
||||||
|
d_matcher.radiusMatchSingle(d_query, d_train, d_trainIdx, d_distance, d_nMatches, max_distance);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
d_matcher.radiusMatchSingle(d_query, d_train, d_trainIdx, d_distance, d_nMatches, max_distance);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_query.upload(query);
|
||||||
|
d_train.upload(train);
|
||||||
|
d_matcher.radiusMatch(d_query, d_train, matches, max_distance);
|
||||||
|
GPU_FULL_OFF;
|
||||||
|
}
|
||||||
|
}
|
@ -42,112 +42,42 @@
|
|||||||
// the use of this software, even if advised of the possibility of such damage.
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
//
|
//
|
||||||
//M*/
|
//M*/
|
||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
#include <iomanip>
|
|
||||||
#ifdef HAVE_OPENCL
|
|
||||||
using namespace cv;
|
|
||||||
using namespace cv::ocl;
|
|
||||||
using namespace cvtest;
|
|
||||||
using namespace testing;
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
#ifndef MWC_TEST_UTILITY
|
///////////// Canny ////////////////////////
|
||||||
#define MWC_TEST_UTILITY
|
TEST(Canny)
|
||||||
|
|
||||||
// Param class
|
|
||||||
#ifndef IMPLEMENT_PARAM_CLASS
|
|
||||||
#define IMPLEMENT_PARAM_CLASS(name, type) \
|
|
||||||
class name \
|
|
||||||
{ \
|
|
||||||
public: \
|
|
||||||
name ( type arg = type ()) : val_(arg) {} \
|
|
||||||
operator type () const {return val_;} \
|
|
||||||
private: \
|
|
||||||
type val_; \
|
|
||||||
}; \
|
|
||||||
inline void PrintTo( name param, std::ostream* os) \
|
|
||||||
{ \
|
|
||||||
*os << #name << "(" << testing::PrintToString(static_cast< type >(param)) << ")"; \
|
|
||||||
}
|
|
||||||
|
|
||||||
IMPLEMENT_PARAM_CLASS(Channels, int)
|
|
||||||
#endif // IMPLEMENT_PARAM_CLASS
|
|
||||||
#endif // MWC_TEST_UTILITY
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////
|
|
||||||
// Canny1
|
|
||||||
extern std::string workdir;
|
|
||||||
IMPLEMENT_PARAM_CLASS(AppertureSize, int);
|
|
||||||
IMPLEMENT_PARAM_CLASS(L2gradient, bool);
|
|
||||||
|
|
||||||
PARAM_TEST_CASE(Canny1, AppertureSize, L2gradient)
|
|
||||||
{
|
{
|
||||||
int apperture_size;
|
Mat img = imread(abspath("aloeL.jpg"), CV_LOAD_IMAGE_GRAYSCALE);
|
||||||
bool useL2gradient;
|
|
||||||
//std::vector<cv::ocl::Info> oclinfo;
|
|
||||||
|
|
||||||
virtual void SetUp()
|
if (img.empty())
|
||||||
{
|
{
|
||||||
apperture_size = GET_PARAM(0);
|
throw runtime_error("can't open aloeL.jpg");
|
||||||
useL2gradient = GET_PARAM(1);
|
|
||||||
|
|
||||||
//int devnums = getDevice(oclinfo);
|
|
||||||
//CV_Assert(devnums > 0);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_P(Canny1, Performance)
|
|
||||||
{
|
|
||||||
cv::Mat img = readImage(workdir + "fruits.jpg", cv::IMREAD_GRAYSCALE);
|
|
||||||
ASSERT_FALSE(img.empty());
|
|
||||||
|
|
||||||
double low_thresh = 100.0;
|
|
||||||
double high_thresh = 150.0;
|
|
||||||
|
|
||||||
cv::Mat edges_gold;
|
|
||||||
cv::ocl::oclMat edges;
|
|
||||||
|
|
||||||
double totalgputick = 0;
|
|
||||||
double totalgputick_kernel = 0;
|
|
||||||
|
|
||||||
double t1 = 0;
|
|
||||||
double t2 = 0;
|
|
||||||
for(int j = 0; j < LOOP_TIMES + 1; j ++)
|
|
||||||
{
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount();//gpu start1
|
|
||||||
|
|
||||||
cv::ocl::oclMat ocl_img = cv::ocl::oclMat(img);//upload
|
|
||||||
|
|
||||||
t2 = (double)cvGetTickCount(); //kernel
|
|
||||||
cv::ocl::Canny(ocl_img, edges, low_thresh, high_thresh, apperture_size, useL2gradient);
|
|
||||||
t2 = (double)cvGetTickCount() - t2;//kernel
|
|
||||||
|
|
||||||
cv::Mat cpu_dst;
|
|
||||||
edges.download (cpu_dst);//download
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount() - t1;//gpu end1
|
|
||||||
|
|
||||||
if(j == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
totalgputick = t1 + totalgputick;
|
|
||||||
|
|
||||||
totalgputick_kernel = t2 + totalgputick_kernel;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
SUBTEST << img.cols << 'x' << img.rows << "; aloeL.jpg" << "; edges" << "; CV_8UC1";
|
||||||
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
|
|
||||||
|
Mat edges(img.size(), CV_8UC1);
|
||||||
|
|
||||||
|
CPU_ON;
|
||||||
|
Canny(img, edges, 50.0, 100.0);
|
||||||
|
CPU_OFF;
|
||||||
|
|
||||||
|
ocl::oclMat d_img(img);
|
||||||
|
ocl::oclMat d_edges;
|
||||||
|
ocl::CannyBuf d_buf;
|
||||||
|
|
||||||
|
WARMUP_ON;
|
||||||
|
ocl::Canny(d_img, d_buf, d_edges, 50.0, 100.0);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
ocl::Canny(d_img, d_buf, d_edges, 50.0, 100.0);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_img.upload(img);
|
||||||
|
ocl::Canny(d_img, d_buf, d_edges, 50.0, 100.0);
|
||||||
|
d_edges.download(edges);
|
||||||
|
GPU_FULL_OFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Canny1, testing::Combine(
|
|
||||||
testing::Values(AppertureSize(3), AppertureSize(5)),
|
|
||||||
testing::Values(L2gradient(false), L2gradient(true))));
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif //Have opencl
|
|
91
modules/ocl/perf/perf_color.cpp
Normal file
91
modules/ocl/perf/perf_color.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
|
||||||
|
// Fangfang Bai, fangfang@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"
|
||||||
|
|
||||||
|
///////////// cvtColor////////////////////////
|
||||||
|
TEST(cvtColor)
|
||||||
|
{
|
||||||
|
Mat src, dst;
|
||||||
|
ocl::oclMat d_src, d_dst;
|
||||||
|
|
||||||
|
int all_type[] = {CV_8UC4};
|
||||||
|
std::string type_name[] = {"CV_8UC4"};
|
||||||
|
|
||||||
|
for (int size = Min_Size; size <= Max_Size; size *= Multiple)
|
||||||
|
{
|
||||||
|
for (size_t j = 0; j < sizeof(all_type) / sizeof(int); j++)
|
||||||
|
{
|
||||||
|
gen(src, size, size, all_type[j], 0, 256);
|
||||||
|
SUBTEST << size << "x" << size << "; " << type_name[j] << " ; CV_RGBA2GRAY";
|
||||||
|
|
||||||
|
cvtColor(src, dst, CV_RGBA2GRAY, 4);
|
||||||
|
|
||||||
|
CPU_ON;
|
||||||
|
cvtColor(src, dst, CV_RGBA2GRAY, 4);
|
||||||
|
CPU_OFF;
|
||||||
|
|
||||||
|
d_src.upload(src);
|
||||||
|
|
||||||
|
WARMUP_ON;
|
||||||
|
ocl::cvtColor(d_src, d_dst, CV_RGBA2GRAY, 4);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
ocl::cvtColor(d_src, d_dst, CV_RGBA2GRAY, 4);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_src.upload(src);
|
||||||
|
ocl::cvtColor(d_src, d_dst, CV_RGBA2GRAY, 4);
|
||||||
|
d_dst.download(dst);
|
||||||
|
GPU_FULL_OFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -15,8 +15,7 @@
|
|||||||
// Third party copyrights are property of their respective owners.
|
// Third party copyrights are property of their respective owners.
|
||||||
//
|
//
|
||||||
// @Authors
|
// @Authors
|
||||||
// Fangfang Bai fangfang@multicorewareinc.com
|
// Fangfang Bai, fangfang@multicorewareinc.com
|
||||||
//
|
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without modification,
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
// are permitted provided that the following conditions are met:
|
// are permitted provided that the following conditions are met:
|
||||||
@ -31,7 +30,7 @@
|
|||||||
// * The name of the copyright holders may not be used to endorse or promote products
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
// derived from this software without specific prior written permission.
|
// derived from this software without specific prior written permission.
|
||||||
//
|
//
|
||||||
// This software is provided by the copyright holders and contributors "as is" and
|
// 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
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
// 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,
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
@ -43,78 +42,47 @@
|
|||||||
// the use of this software, even if advised of the possibility of such damage.
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
//
|
//
|
||||||
//M*/
|
//M*/
|
||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
#include <iomanip>
|
|
||||||
|
|
||||||
using namespace cv;
|
///////////// columnSum////////////////////////
|
||||||
using namespace cv::ocl;
|
TEST(columnSum)
|
||||||
using namespace cvtest;
|
|
||||||
using namespace testing;
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
/// ColumnSum
|
|
||||||
|
|
||||||
#ifdef HAVE_OPENCL
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
|
||||||
// ColumnSum
|
|
||||||
|
|
||||||
PARAM_TEST_CASE(ColumnSum)
|
|
||||||
{
|
{
|
||||||
cv::Mat src;
|
Mat src, dst;
|
||||||
//std::vector<cv::ocl::Info> oclinfo;
|
ocl::oclMat d_src, d_dst;
|
||||||
|
|
||||||
virtual void SetUp()
|
for (int size = Min_Size; size <= Max_Size; size *= Multiple)
|
||||||
{
|
{
|
||||||
//int devnums = getDevice(oclinfo);
|
SUBTEST << size << 'x' << size << "; CV_32FC1";
|
||||||
//CV_Assert(devnums > 0);
|
|
||||||
|
gen(src, size, size, CV_32FC1, 0, 256);
|
||||||
|
|
||||||
|
CPU_ON;
|
||||||
|
dst.create(src.size(), src.type());
|
||||||
|
|
||||||
|
for (int i = 1; i < src.rows; ++i)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < src.cols; ++j)
|
||||||
|
{
|
||||||
|
dst.at<float>(i, j) = src.at<float>(i, j) += src.at<float>(i - 1, j);
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
TEST_F(ColumnSum, Performance)
|
|
||||||
{
|
|
||||||
cv::Size size(MWIDTH, MHEIGHT);
|
|
||||||
cv::Mat src = randomMat(size, CV_32FC1);
|
|
||||||
cv::ocl::oclMat d_dst;
|
|
||||||
|
|
||||||
double totalgputick = 0;
|
|
||||||
double totalgputick_kernel = 0;
|
|
||||||
double t1 = 0;
|
|
||||||
double t2 = 0;
|
|
||||||
|
|
||||||
for(int j = 0; j < LOOP_TIMES + 1; j ++)
|
|
||||||
{
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount();//gpu start1
|
|
||||||
|
|
||||||
cv::ocl::oclMat d_src(src);
|
|
||||||
|
|
||||||
t2 = (double)cvGetTickCount(); //kernel
|
|
||||||
cv::ocl::columnSum(d_src, d_dst);
|
|
||||||
t2 = (double)cvGetTickCount() - t2;//kernel
|
|
||||||
|
|
||||||
cv::Mat cpu_dst;
|
|
||||||
d_dst.download (cpu_dst);//download
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount() - t1;//gpu end1
|
|
||||||
|
|
||||||
if(j == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
totalgputick = t1 + totalgputick;
|
|
||||||
totalgputick_kernel = t2 + totalgputick_kernel;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
CPU_OFF;
|
||||||
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
|
|
||||||
|
d_src.upload(src);
|
||||||
|
WARMUP_ON;
|
||||||
|
ocl::columnSum(d_src, d_dst);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
ocl::columnSum(d_src, d_dst);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_src.upload(src);
|
||||||
|
ocl::columnSum(d_src, d_dst);
|
||||||
|
d_dst.download(dst);
|
||||||
|
GPU_FULL_OFF;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
@ -15,7 +15,7 @@
|
|||||||
// Third party copyrights are property of their respective owners.
|
// Third party copyrights are property of their respective owners.
|
||||||
//
|
//
|
||||||
// @Authors
|
// @Authors
|
||||||
// Fangfangbai, fangfang@multicorewareinc.com
|
// Fangfang Bai, fangfang@multicorewareinc.com
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without modification,
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
// are permitted provided that the following conditions are met:
|
// are permitted provided that the following conditions are met:
|
||||||
@ -42,85 +42,48 @@
|
|||||||
// the use of this software, even if advised of the possibility of such damage.
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
//
|
//
|
||||||
//M*/
|
//M*/
|
||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
using namespace std;
|
|
||||||
#ifdef HAVE_CLAMDFFT
|
///////////// dft ////////////////////////
|
||||||
////////////////////////////////////////////////////////////////////////////
|
TEST(dft)
|
||||||
// Dft
|
|
||||||
PARAM_TEST_CASE(Dft, cv::Size, bool)
|
|
||||||
{
|
{
|
||||||
cv::Size dft_size;
|
Mat src, dst;
|
||||||
bool dft_rows;
|
ocl::oclMat d_src, d_dst;
|
||||||
vector<cv::ocl::Info> info;
|
|
||||||
virtual void SetUp()
|
int all_type[] = {CV_32FC1, CV_32FC2};
|
||||||
|
std::string type_name[] = {"CV_32FC1", "CV_32FC2"};
|
||||||
|
|
||||||
|
for (int size = Min_Size; size <= Max_Size; size *= Multiple)
|
||||||
{
|
{
|
||||||
dft_size = GET_PARAM(0);
|
for (size_t j = 0; j < sizeof(all_type) / sizeof(int); j++)
|
||||||
dft_rows = GET_PARAM(1);
|
|
||||||
cv::ocl::getDevice(info);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_P(Dft, C2C)
|
|
||||||
{
|
|
||||||
cv::Mat a = randomMat(dft_size, CV_32FC2, 0.0, 10.0);
|
|
||||||
int flags = 0;
|
|
||||||
flags |= dft_rows ? cv::DFT_ROWS : 0;
|
|
||||||
|
|
||||||
cv::ocl::oclMat d_b;
|
|
||||||
|
|
||||||
double totalgputick = 0;
|
|
||||||
double totalgputick_kernel = 0;
|
|
||||||
double t1 = 0;
|
|
||||||
double t2 = 0;
|
|
||||||
|
|
||||||
for(int j = 0; j < LOOP_TIMES + 1; j ++)
|
|
||||||
{
|
{
|
||||||
|
SUBTEST << size << 'x' << size << "; " << type_name[j] << " ; complex-to-complex";
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount();//gpu start1
|
gen(src, size, size, all_type[j], Scalar::all(0), Scalar::all(1));
|
||||||
|
|
||||||
cv::ocl::oclMat ga = cv::ocl::oclMat(a); //upload
|
dft(src, dst);
|
||||||
|
|
||||||
t2 = (double)cvGetTickCount(); //kernel
|
CPU_ON;
|
||||||
cv::ocl::dft(ga, d_b, a.size(), flags);
|
dft(src, dst);
|
||||||
t2 = (double)cvGetTickCount() - t2;//kernel
|
CPU_OFF;
|
||||||
|
|
||||||
cv::Mat cpu_dst;
|
d_src.upload(src);
|
||||||
d_b.download (cpu_dst);//download
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount() - t1;//gpu end1
|
WARMUP_ON;
|
||||||
|
ocl::dft(d_src, d_dst, Size(size, size));
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
if(j == 0)
|
GPU_ON;
|
||||||
continue;
|
ocl::dft(d_src, d_dst, Size(size, size));
|
||||||
|
;
|
||||||
totalgputick = t1 + totalgputick;
|
GPU_OFF;
|
||||||
totalgputick_kernel = t2 + totalgputick_kernel;
|
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_src.upload(src);
|
||||||
|
ocl::dft(d_src, d_dst, Size(size, size));
|
||||||
|
d_dst.download(dst);
|
||||||
|
GPU_FULL_OFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
}
|
||||||
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TEST_P(Dft, R2CthenC2R)
|
|
||||||
{
|
|
||||||
cv::Mat a = randomMat(dft_size, CV_32FC1, 0.0, 10.0);
|
|
||||||
|
|
||||||
int flags = 0;
|
|
||||||
//flags |= dft_rows ? cv::DFT_ROWS : 0; // not supported yet
|
|
||||||
|
|
||||||
cv::ocl::oclMat d_b, d_c;
|
|
||||||
|
|
||||||
cv::ocl::dft(cv::ocl::oclMat(a), d_b, a.size(), flags);
|
|
||||||
cv::ocl::dft(d_b, d_c, a.size(), flags + cv::DFT_INVERSE + cv::DFT_REAL_OUTPUT);
|
|
||||||
|
|
||||||
EXPECT_MAT_NEAR(a, d_c, a.size().area() * 1e-4, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
//INSTANTIATE_TEST_CASE_P(ocl_DFT, Dft, testing::Combine(
|
|
||||||
// testing::Values(cv::Size(1280, 1024), cv::Size(1920, 1080),cv::Size(1800, 1500)),
|
|
||||||
// testing::Values(false, true)));
|
|
||||||
|
|
||||||
#endif // HAVE_CLAMDFFT
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -16,6 +16,7 @@
|
|||||||
//
|
//
|
||||||
// @Authors
|
// @Authors
|
||||||
// Fangfang Bai, fangfang@multicorewareinc.com
|
// Fangfang Bai, fangfang@multicorewareinc.com
|
||||||
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without modification,
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
// are permitted provided that the following conditions are met:
|
// are permitted provided that the following conditions are met:
|
||||||
//
|
//
|
||||||
@ -41,73 +42,47 @@
|
|||||||
// the use of this software, even if advised of the possibility of such damage.
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
//
|
//
|
||||||
//M*/
|
//M*/
|
||||||
|
|
||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
using namespace std;
|
|
||||||
#ifdef HAVE_CLAMDBLAS
|
///////////// gemm ////////////////////////
|
||||||
////////////////////////////////////////////////////////////////////////////
|
TEST(gemm)
|
||||||
// GEMM
|
|
||||||
PARAM_TEST_CASE(Gemm, int, cv::Size, int)
|
|
||||||
{
|
{
|
||||||
int type;
|
Mat src1, src2, src3, dst;
|
||||||
cv::Size mat_size;
|
ocl::oclMat d_src1, d_src2, d_src3, d_dst;
|
||||||
int flags;
|
|
||||||
vector<cv::ocl::Info> info;
|
for (int size = Min_Size; size <= Max_Size; size *= Multiple)
|
||||||
virtual void SetUp()
|
|
||||||
{
|
{
|
||||||
type = GET_PARAM(0);
|
SUBTEST << size << 'x' << size;
|
||||||
mat_size = GET_PARAM(1);
|
|
||||||
flags = GET_PARAM(2);
|
|
||||||
|
|
||||||
cv::ocl::getDevice(info);
|
gen(src1, size, size, CV_32FC1, Scalar::all(-10), Scalar::all(10));
|
||||||
|
gen(src2, size, size, CV_32FC1, Scalar::all(-10), Scalar::all(10));
|
||||||
|
gen(src3, size, size, CV_32FC1, Scalar::all(-10), Scalar::all(10));
|
||||||
|
|
||||||
|
gemm(src1, src2, 1.0, src3, 1.0, dst);
|
||||||
|
|
||||||
|
CPU_ON;
|
||||||
|
gemm(src1, src2, 1.0, src3, 1.0, dst);
|
||||||
|
CPU_OFF;
|
||||||
|
|
||||||
|
d_src1.upload(src1);
|
||||||
|
d_src2.upload(src2);
|
||||||
|
d_src3.upload(src3);
|
||||||
|
|
||||||
|
WARMUP_ON;
|
||||||
|
ocl::gemm(d_src1, d_src2, 1.0, d_src3, 1.0, d_dst);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
ocl::gemm(d_src1, d_src2, 1.0, d_src3, 1.0, d_dst);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_src1.upload(src1);
|
||||||
|
d_src2.upload(src2);
|
||||||
|
d_src3.upload(src3);
|
||||||
|
ocl::gemm(d_src1, d_src2, 1.0, d_src3, 1.0, d_dst);
|
||||||
|
d_dst.download(dst);
|
||||||
|
GPU_FULL_OFF;
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
TEST_P(Gemm, Performance)
|
|
||||||
{
|
|
||||||
cv::Mat a = randomMat(mat_size, type, 0.0, 10.0);
|
|
||||||
cv::Mat b = randomMat(mat_size, type, 0.0, 10.0);
|
|
||||||
cv::Mat c = randomMat(mat_size, type, 0.0, 10.0);
|
|
||||||
cv::ocl::oclMat ocl_dst;
|
|
||||||
|
|
||||||
double totalgputick = 0;
|
|
||||||
double totalgputick_kernel = 0;
|
|
||||||
double t1 = 0;
|
|
||||||
double t2 = 0;
|
|
||||||
|
|
||||||
for(int j = 0; j < LOOP_TIMES + 1; j ++)
|
|
||||||
{
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount();//gpu start1
|
|
||||||
|
|
||||||
cv::ocl::oclMat ga = cv::ocl::oclMat(a);//upload
|
|
||||||
cv::ocl::oclMat gb = cv::ocl::oclMat(b);//upload
|
|
||||||
cv::ocl::oclMat gc = cv::ocl::oclMat(c);//upload
|
|
||||||
|
|
||||||
t2 = (double)cvGetTickCount(); //kernel
|
|
||||||
cv::ocl::gemm(ga, gb, 1.0, gc, 1.0, ocl_dst, flags);
|
|
||||||
t2 = (double)cvGetTickCount() - t2;//kernel
|
|
||||||
|
|
||||||
cv::Mat cpu_dst;
|
|
||||||
ocl_dst.download (cpu_dst);//download
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount() - t1;//gpu end
|
|
||||||
|
|
||||||
if(j == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
totalgputick = t1 + totalgputick;
|
|
||||||
totalgputick_kernel = t2 + totalgputick_kernel;
|
|
||||||
|
|
||||||
}
|
|
||||||
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(ocl_gemm, Gemm, testing::Combine(
|
|
||||||
testing::Values(CV_32FC1, CV_32FC2/* , CV_64FC1, CV_64FC2*/),
|
|
||||||
testing::Values(cv::Size(512, 512), cv::Size(1024, 1024)),
|
|
||||||
testing::Values(0, (int)cv::GEMM_1_T, (int)cv::GEMM_2_T, (int)(cv::GEMM_1_T + cv::GEMM_2_T))));
|
|
||||||
#endif
|
|
@ -10,12 +10,12 @@
|
|||||||
// License Agreement
|
// License Agreement
|
||||||
// For Open Source Computer Vision Library
|
// For Open Source Computer Vision Library
|
||||||
//
|
//
|
||||||
// Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved.
|
// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
|
||||||
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
|
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
|
||||||
// Third party copyrights are property of their respective owners.
|
// Third party copyrights are property of their respective owners.
|
||||||
//
|
//
|
||||||
// @Authors
|
// @Authors
|
||||||
// Jia Haipeng, jiahaipeng95@gmail.com
|
// Fangfang Bai, fangfang@multicorewareinc.com
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without modification,
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
// are permitted provided that the following conditions are met:
|
// are permitted provided that the following conditions are met:
|
||||||
@ -30,7 +30,7 @@
|
|||||||
// * The name of the copyright holders may not be used to endorse or promote products
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
// derived from this software without specific prior written permission.
|
// derived from this software without specific prior written permission.
|
||||||
//
|
//
|
||||||
// This software is provided by the copyright holders and contributors "as is" and
|
// 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
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
// 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,
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
@ -42,132 +42,97 @@
|
|||||||
// the use of this software, even if advised of the possibility of such damage.
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
//
|
//
|
||||||
//M*/
|
//M*/
|
||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
|
|
||||||
#ifdef HAVE_OPENCL
|
///////////// Haar ////////////////////////
|
||||||
|
namespace cv
|
||||||
|
{
|
||||||
|
namespace ocl
|
||||||
|
{
|
||||||
|
|
||||||
using namespace cvtest;
|
|
||||||
using namespace testing;
|
|
||||||
using namespace std;
|
|
||||||
using namespace cv;
|
|
||||||
extern std::string workdir;
|
|
||||||
struct getRect
|
struct getRect
|
||||||
{
|
{
|
||||||
Rect operator ()(const CvAvgComp &e) const
|
Rect operator()(const CvAvgComp &e) const
|
||||||
{
|
{
|
||||||
return e.rect;
|
return e.rect;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
PARAM_TEST_CASE(HaarTestBase, int, int)
|
class CascadeClassifier_GPU : public OclCascadeClassifier
|
||||||
{
|
{
|
||||||
//std::vector<cv::ocl::Info> oclinfo;
|
public:
|
||||||
cv::ocl::OclCascadeClassifier cascade, nestedCascade;
|
void detectMultiScale(oclMat &image,
|
||||||
cv::CascadeClassifier cpucascade, cpunestedCascade;
|
CV_OUT std::vector<cv::Rect>& faces,
|
||||||
// Mat img;
|
double scaleFactor = 1.1,
|
||||||
|
int minNeighbors = 3, int flags = 0,
|
||||||
double scale;
|
Size minSize = Size(),
|
||||||
int index;
|
Size maxSize = Size())
|
||||||
|
|
||||||
virtual void SetUp()
|
|
||||||
{
|
{
|
||||||
scale = 1.0;
|
(void)maxSize;
|
||||||
index = 0;
|
MemStorage storage(cvCreateMemStorage(0));
|
||||||
string cascadeName = "../../../data/haarcascades/haarcascade_frontalface_alt.xml";
|
//CvMat img=image;
|
||||||
|
CvSeq *objs = oclHaarDetectObjects(image, storage, scaleFactor, minNeighbors, flags, minSize);
|
||||||
|
vector<CvAvgComp> vecAvgComp;
|
||||||
|
Seq<CvAvgComp>(objs).copyTo(vecAvgComp);
|
||||||
|
faces.resize(vecAvgComp.size());
|
||||||
|
std::transform(vecAvgComp.begin(), vecAvgComp.end(), faces.begin(), getRect());
|
||||||
|
}
|
||||||
|
|
||||||
if( (!cascade.load( cascadeName )) || (!cpucascade.load(cascadeName)))
|
|
||||||
{
|
|
||||||
cout << "ERROR: Could not load classifier cascade" << endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//int devnums = getDevice(oclinfo);
|
|
||||||
//CV_Assert(devnums>0);
|
|
||||||
////if you want to use undefault device, set it here
|
|
||||||
////setDevice(oclinfo[0]);
|
|
||||||
//cv::ocl::setBinpath("E:\\");
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
////////////////////////////////faceDetect/////////////////////////////////////////////////
|
|
||||||
|
|
||||||
struct Haar : HaarTestBase {};
|
|
||||||
|
|
||||||
TEST_F(Haar, FaceDetect)
|
|
||||||
{
|
|
||||||
string imgName = workdir + "lena.jpg";
|
|
||||||
Mat img = imread( imgName, 1 );
|
|
||||||
|
|
||||||
if(img.empty())
|
|
||||||
{
|
|
||||||
std::cout << imgName << std::endl;
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
|
|
||||||
//int i = 0;
|
|
||||||
double t = 0;
|
|
||||||
vector<Rect> faces, oclfaces;
|
|
||||||
|
|
||||||
// const static Scalar colors[] = { CV_RGB(0, 0, 255),
|
|
||||||
// CV_RGB(0, 128, 255),
|
|
||||||
// CV_RGB(0, 255, 255),
|
|
||||||
// CV_RGB(0, 255, 0),
|
|
||||||
// CV_RGB(255, 128, 0),
|
|
||||||
// CV_RGB(255, 255, 0),
|
|
||||||
// CV_RGB(255, 0, 0),
|
|
||||||
// CV_RGB(255, 0, 255)
|
|
||||||
// } ;
|
|
||||||
|
|
||||||
Mat gray, smallImg(cvRound (img.rows / scale), cvRound(img.cols / scale), CV_8UC1 );
|
|
||||||
MemStorage storage(cvCreateMemStorage(0));
|
|
||||||
cvtColor( img, gray, CV_BGR2GRAY );
|
|
||||||
resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );
|
|
||||||
equalizeHist( smallImg, smallImg );
|
|
||||||
|
|
||||||
t = (double)cvGetTickCount();
|
|
||||||
for(int k = 0; k < LOOP_TIMES; k++)
|
|
||||||
{
|
|
||||||
cpucascade.detectMultiScale( smallImg, faces, 1.1,
|
|
||||||
3, 0
|
|
||||||
| CV_HAAR_SCALE_IMAGE
|
|
||||||
, Size(30, 30), Size(0, 0) );
|
|
||||||
}
|
|
||||||
t = (double)cvGetTickCount() - t ;
|
|
||||||
printf( "cpudetection time = %g ms\n", t / (LOOP_TIMES * (double)cvGetTickFrequency() * 1000.) );
|
|
||||||
|
|
||||||
cv::ocl::oclMat image;
|
|
||||||
CvSeq *_objects=NULL;
|
|
||||||
t = (double)cvGetTickCount();
|
|
||||||
for(int k = 0; k < LOOP_TIMES; k++)
|
|
||||||
{
|
|
||||||
image.upload(smallImg);
|
|
||||||
_objects = cascade.oclHaarDetectObjects( image, storage, 1.1,
|
|
||||||
3, 0
|
|
||||||
| CV_HAAR_SCALE_IMAGE
|
|
||||||
, Size(30, 30), Size(0, 0) );
|
|
||||||
}
|
|
||||||
t = (double)cvGetTickCount() - t ;
|
|
||||||
printf( "ocldetection time = %g ms\n", t / (LOOP_TIMES * (double)cvGetTickFrequency() * 1000.) );
|
|
||||||
vector<CvAvgComp> vecAvgComp;
|
|
||||||
Seq<CvAvgComp>(_objects).copyTo(vecAvgComp);
|
|
||||||
oclfaces.resize(vecAvgComp.size());
|
|
||||||
std::transform(vecAvgComp.begin(), vecAvgComp.end(), oclfaces.begin(), getRect());
|
|
||||||
|
|
||||||
//for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
|
|
||||||
//{
|
|
||||||
// Mat smallImgROI;
|
|
||||||
// Point center;
|
|
||||||
// Scalar color = colors[i%8];
|
|
||||||
// int radius;
|
|
||||||
// center.x = cvRound((r->x + r->width*0.5)*scale);
|
|
||||||
// center.y = cvRound((r->y + r->height*0.5)*scale);
|
|
||||||
// radius = cvRound((r->width + r->height)*0.25*scale);
|
|
||||||
// circle( img, center, radius, color, 3, 8, 0 );
|
|
||||||
//}
|
|
||||||
//namedWindow("result");
|
|
||||||
//imshow("result",img);
|
|
||||||
//waitKey(0);
|
|
||||||
//destroyAllWindows();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif // HAVE_OPENCL
|
}
|
||||||
|
TEST(Haar)
|
||||||
|
{
|
||||||
|
Mat img = imread(abspath("basketball1.png"), CV_LOAD_IMAGE_GRAYSCALE);
|
||||||
|
|
||||||
|
if (img.empty())
|
||||||
|
{
|
||||||
|
throw runtime_error("can't open basketball1.png");
|
||||||
|
}
|
||||||
|
|
||||||
|
CascadeClassifier faceCascadeCPU;
|
||||||
|
|
||||||
|
if (!faceCascadeCPU.load(abspath("haarcascade_frontalface_alt.xml")))
|
||||||
|
{
|
||||||
|
throw runtime_error("can't load haarcascade_frontalface_alt.xml");
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<Rect> faces;
|
||||||
|
|
||||||
|
SUBTEST << img.cols << "x" << img.rows << "; scale image";
|
||||||
|
CPU_ON;
|
||||||
|
faceCascadeCPU.detectMultiScale(img, faces,
|
||||||
|
1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
|
||||||
|
CPU_OFF;
|
||||||
|
|
||||||
|
ocl::CascadeClassifier_GPU faceCascade;
|
||||||
|
|
||||||
|
if (!faceCascade.load(abspath("haarcascade_frontalface_alt.xml")))
|
||||||
|
{
|
||||||
|
throw runtime_error("can't load haarcascade_frontalface_alt.xml");
|
||||||
|
}
|
||||||
|
|
||||||
|
ocl::oclMat d_img(img);
|
||||||
|
|
||||||
|
faces.clear();
|
||||||
|
|
||||||
|
WARMUP_ON;
|
||||||
|
faceCascade.detectMultiScale(d_img, faces,
|
||||||
|
1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
faces.clear();
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
faceCascade.detectMultiScale(d_img, faces,
|
||||||
|
1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_img.upload(img);
|
||||||
|
faceCascade.detectMultiScale(d_img, faces,
|
||||||
|
1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
|
||||||
|
GPU_FULL_OFF;
|
||||||
|
}
|
@ -15,7 +15,7 @@
|
|||||||
// Third party copyrights are property of their respective owners.
|
// Third party copyrights are property of their respective owners.
|
||||||
//
|
//
|
||||||
// @Authors
|
// @Authors
|
||||||
// Peng Xiao, pengxiao@multicorewareinc.com
|
// Fangfang Bai, fangfang@multicorewareinc.com
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without modification,
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
// are permitted provided that the following conditions are met:
|
// are permitted provided that the following conditions are met:
|
||||||
@ -42,125 +42,47 @@
|
|||||||
// the use of this software, even if advised of the possibility of such damage.
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
//
|
//
|
||||||
//M*/
|
//M*/
|
||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
#include <iomanip>
|
|
||||||
|
|
||||||
#ifdef HAVE_OPENCL
|
///////////// HOG////////////////////////
|
||||||
|
TEST(HOG)
|
||||||
using namespace cv;
|
|
||||||
using namespace cv::ocl;
|
|
||||||
using namespace cvtest;
|
|
||||||
using namespace testing;
|
|
||||||
using namespace std;
|
|
||||||
extern std::string workdir;
|
|
||||||
|
|
||||||
#ifndef MWC_TEST_UTILITY
|
|
||||||
#define MWC_TEST_UTILITY
|
|
||||||
|
|
||||||
// Param class
|
|
||||||
#ifndef IMPLEMENT_PARAM_CLASS
|
|
||||||
#define IMPLEMENT_PARAM_CLASS(name, type) \
|
|
||||||
class name \
|
|
||||||
{ \
|
|
||||||
public: \
|
|
||||||
name ( type arg = type ()) : val_(arg) {} \
|
|
||||||
operator type () const {return val_;} \
|
|
||||||
private: \
|
|
||||||
type val_; \
|
|
||||||
}; \
|
|
||||||
inline void PrintTo( name param, std::ostream* os) \
|
|
||||||
{ \
|
|
||||||
*os << #name << "(" << testing::PrintToString(static_cast< type >(param)) << ")"; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // IMPLEMENT_PARAM_CLASS
|
|
||||||
#endif // MWC_TEST_UTILITY
|
|
||||||
|
|
||||||
IMPLEMENT_PARAM_CLASS(WinSizw48, bool);
|
|
||||||
|
|
||||||
PARAM_TEST_CASE(HOG, WinSizw48, bool)
|
|
||||||
{
|
{
|
||||||
bool is48;
|
Mat src = imread(abspath("road.png"), cv::IMREAD_GRAYSCALE);
|
||||||
vector<float> detector;
|
|
||||||
virtual void SetUp()
|
if (src.empty())
|
||||||
{
|
{
|
||||||
is48 = GET_PARAM(0);
|
throw runtime_error("can't open road.png");
|
||||||
if(is48)
|
|
||||||
{
|
|
||||||
detector = cv::ocl::HOGDescriptor::getPeopleDetector48x96();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
detector = cv::ocl::HOGDescriptor::getPeopleDetector64x128();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_P(HOG, Performance)
|
|
||||||
{
|
|
||||||
cv::Mat img = readImage(workdir + "lena.jpg", cv::IMREAD_GRAYSCALE);
|
|
||||||
ASSERT_FALSE(img.empty());
|
|
||||||
|
|
||||||
// define HOG related arguments
|
|
||||||
float scale = 1.05f;
|
|
||||||
//int nlevels = 13;
|
|
||||||
int gr_threshold = 8;
|
|
||||||
float hit_threshold = 1.4f;
|
|
||||||
//bool hit_threshold_auto = true;
|
|
||||||
|
|
||||||
int win_width = is48 ? 48 : 64;
|
|
||||||
int win_stride_width = 8;
|
|
||||||
int win_stride_height = 8;
|
|
||||||
|
|
||||||
bool gamma_corr = true;
|
|
||||||
|
|
||||||
Size win_size(win_width, win_width * 2); //(64, 128) or (48, 96)
|
|
||||||
Size win_stride(win_stride_width, win_stride_height);
|
|
||||||
|
|
||||||
cv::ocl::HOGDescriptor gpu_hog(win_size, Size(16, 16), Size(8, 8), Size(8, 8), 9,
|
|
||||||
cv::ocl::HOGDescriptor::DEFAULT_WIN_SIGMA, 0.2, gamma_corr,
|
|
||||||
cv::ocl::HOGDescriptor::DEFAULT_NLEVELS);
|
|
||||||
|
|
||||||
gpu_hog.setSVMDetector(detector);
|
|
||||||
|
|
||||||
double totalgputick = 0;
|
|
||||||
double totalgputick_kernel = 0;
|
|
||||||
|
|
||||||
double t1 = 0;
|
|
||||||
double t2 = 0;
|
|
||||||
for(int j = 0; j < LOOP_TIMES + 1; j ++)
|
|
||||||
{
|
|
||||||
t1 = (double)cvGetTickCount();//gpu start1
|
|
||||||
|
|
||||||
ocl::oclMat d_src(img);//upload
|
|
||||||
|
|
||||||
t2 = (double)cvGetTickCount(); //kernel
|
|
||||||
|
|
||||||
vector<Rect> found;
|
|
||||||
gpu_hog.detectMultiScale(d_src, found, hit_threshold, win_stride,
|
|
||||||
Size(0, 0), scale, gr_threshold);
|
|
||||||
|
|
||||||
t2 = (double)cvGetTickCount() - t2;//kernel
|
|
||||||
|
|
||||||
// no download time for HOG
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount() - t1;//gpu end1
|
|
||||||
|
|
||||||
if(j == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
totalgputick = t1 + totalgputick;
|
|
||||||
|
|
||||||
totalgputick_kernel = t2 + totalgputick_kernel;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
cv::HOGDescriptor hog;
|
||||||
|
hog.setSVMDetector(hog.getDefaultPeopleDetector());
|
||||||
|
std::vector<cv::Rect> found_locations;
|
||||||
|
|
||||||
|
SUBTEST << 768 << 'x' << 576 << "; road.png";
|
||||||
|
|
||||||
|
hog.detectMultiScale(src, found_locations);
|
||||||
|
|
||||||
|
CPU_ON;
|
||||||
|
hog.detectMultiScale(src, found_locations);
|
||||||
|
CPU_OFF;
|
||||||
|
|
||||||
|
cv::ocl::HOGDescriptor ocl_hog;
|
||||||
|
ocl_hog.setSVMDetector(ocl_hog.getDefaultPeopleDetector());
|
||||||
|
ocl::oclMat d_src;
|
||||||
|
d_src.upload(src);
|
||||||
|
|
||||||
|
WARMUP_ON;
|
||||||
|
ocl_hog.detectMultiScale(d_src, found_locations);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
ocl_hog.detectMultiScale(d_src, found_locations);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_src.upload(src);
|
||||||
|
ocl_hog.detectMultiScale(d_src, found_locations);
|
||||||
|
GPU_FULL_OFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(GPU_ObjDetect, HOG, testing::Combine(testing::Values(WinSizw48(false), WinSizw48(true)), testing::Values(false)));
|
|
||||||
|
|
||||||
#endif //Have opencl
|
|
File diff suppressed because it is too large
Load Diff
@ -42,191 +42,105 @@
|
|||||||
// the use of this software, even if advised of the possibility of such damage.
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
//
|
//
|
||||||
//M*/
|
//M*/
|
||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
#include <iomanip>
|
|
||||||
#ifdef HAVE_OPENCL
|
|
||||||
using namespace cv;
|
|
||||||
using namespace cv::ocl;
|
|
||||||
using namespace cvtest;
|
|
||||||
using namespace testing;
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
#ifndef MWC_TEST_UTILITY
|
/////////// matchTemplate ////////////////////////
|
||||||
#define MWC_TEST_UTILITY
|
//void InitMatchTemplate()
|
||||||
//////// Utility
|
//{
|
||||||
#ifndef DIFFERENT_SIZES
|
// Mat src; gen(src, 500, 500, CV_32F, 0, 1);
|
||||||
#else
|
// Mat templ; gen(templ, 500, 500, CV_32F, 0, 1);
|
||||||
#undef DIFFERENT_SIZES
|
// ocl::oclMat d_src(src), d_templ(templ), d_dst;
|
||||||
#endif
|
// ocl::matchTemplate(d_src, d_templ, d_dst, CV_TM_CCORR);
|
||||||
#define DIFFERENT_SIZES testing::Values(cv::Size(256, 256), cv::Size(3000, 3000))
|
//}
|
||||||
|
TEST(matchTemplate)
|
||||||
// Param class
|
|
||||||
#ifndef IMPLEMENT_PARAM_CLASS
|
|
||||||
#define IMPLEMENT_PARAM_CLASS(name, type) \
|
|
||||||
class name \
|
|
||||||
{ \
|
|
||||||
public: \
|
|
||||||
name ( type arg = type ()) : val_(arg) {} \
|
|
||||||
operator type () const {return val_;} \
|
|
||||||
private: \
|
|
||||||
type val_; \
|
|
||||||
}; \
|
|
||||||
inline void PrintTo( name param, std::ostream* os) \
|
|
||||||
{ \
|
|
||||||
*os << #name << "(" << testing::PrintToString(static_cast< type >(param)) << ")"; \
|
|
||||||
}
|
|
||||||
|
|
||||||
IMPLEMENT_PARAM_CLASS(Channels, int)
|
|
||||||
#endif // IMPLEMENT_PARAM_CLASS
|
|
||||||
#endif // MWC_TEST_UTILITY
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// MatchTemplate
|
|
||||||
#define ALL_TEMPLATE_METHODS testing::Values(TemplateMethod(cv::TM_SQDIFF), TemplateMethod(cv::TM_CCORR), TemplateMethod(cv::TM_CCOEFF), TemplateMethod(cv::TM_SQDIFF_NORMED), TemplateMethod(cv::TM_CCORR_NORMED), TemplateMethod(cv::TM_CCOEFF_NORMED))
|
|
||||||
|
|
||||||
IMPLEMENT_PARAM_CLASS(TemplateSize, cv::Size);
|
|
||||||
|
|
||||||
const char *TEMPLATE_METHOD_NAMES[6] = {"TM_SQDIFF", "TM_SQDIFF_NORMED", "TM_CCORR", "TM_CCORR_NORMED", "TM_CCOEFF", "TM_CCOEFF_NORMED"};
|
|
||||||
|
|
||||||
PARAM_TEST_CASE(MatchTemplate, cv::Size, TemplateSize, Channels, TemplateMethod)
|
|
||||||
{
|
{
|
||||||
cv::Size size;
|
//InitMatchTemplate();
|
||||||
cv::Size templ_size;
|
|
||||||
int cn;
|
|
||||||
int method;
|
|
||||||
//vector<cv::ocl::Info> oclinfo;
|
|
||||||
|
|
||||||
virtual void SetUp()
|
Mat src, templ, dst;
|
||||||
|
int templ_size = 5;
|
||||||
|
|
||||||
|
|
||||||
|
for (int size = Min_Size; size <= Max_Size; size *= Multiple)
|
||||||
{
|
{
|
||||||
size = GET_PARAM(0);
|
int all_type[] = {CV_32FC1, CV_32FC4};
|
||||||
templ_size = GET_PARAM(1);
|
std::string type_name[] = {"CV_32FC1", "CV_32FC4"};
|
||||||
cn = GET_PARAM(2);
|
|
||||||
method = GET_PARAM(3);
|
for (size_t j = 0; j < sizeof(all_type) / sizeof(int); j++)
|
||||||
//int devnums = getDevice(oclinfo);
|
{
|
||||||
//CV_Assert(devnums > 0);
|
for(templ_size = 5; templ_size <= 5; templ_size *= 5)
|
||||||
|
{
|
||||||
|
gen(src, size, size, all_type[j], 0, 1);
|
||||||
|
|
||||||
|
SUBTEST << src.cols << 'x' << src.rows << "; " << type_name[j] << "; templ " << templ_size << 'x' << templ_size << "; CCORR";
|
||||||
|
|
||||||
|
gen(templ, templ_size, templ_size, all_type[j], 0, 1);
|
||||||
|
|
||||||
|
matchTemplate(src, templ, dst, CV_TM_CCORR);
|
||||||
|
|
||||||
|
CPU_ON;
|
||||||
|
matchTemplate(src, templ, dst, CV_TM_CCORR);
|
||||||
|
CPU_OFF;
|
||||||
|
|
||||||
|
ocl::oclMat d_src(src), d_templ, d_dst;
|
||||||
|
|
||||||
|
d_templ.upload(templ);
|
||||||
|
|
||||||
|
WARMUP_ON;
|
||||||
|
ocl::matchTemplate(d_src, d_templ, d_dst, CV_TM_CCORR);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
ocl::matchTemplate(d_src, d_templ, d_dst, CV_TM_CCORR);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_src.upload(src);
|
||||||
|
d_templ.upload(templ);
|
||||||
|
ocl::matchTemplate(d_src, d_templ, d_dst, CV_TM_CCORR);
|
||||||
|
d_dst.download(dst);
|
||||||
|
GPU_FULL_OFF;
|
||||||
}
|
}
|
||||||
};
|
|
||||||
struct MatchTemplate8U : MatchTemplate {};
|
|
||||||
|
|
||||||
TEST_P(MatchTemplate8U, Performance)
|
|
||||||
{
|
|
||||||
std::cout << "Method: " << TEMPLATE_METHOD_NAMES[method] << std::endl;
|
|
||||||
std::cout << "Image Size: (" << size.width << ", " << size.height << ")" << std::endl;
|
|
||||||
std::cout << "Template Size: (" << templ_size.width << ", " << templ_size.height << ")" << std::endl;
|
|
||||||
std::cout << "Channels: " << cn << std::endl;
|
|
||||||
|
|
||||||
cv::Mat image = randomMat(size, CV_MAKETYPE(CV_8U, cn));
|
|
||||||
cv::Mat templ = randomMat(templ_size, CV_MAKETYPE(CV_8U, cn));
|
|
||||||
cv::Mat dst_gold;
|
|
||||||
cv::ocl::oclMat dst;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
double totalgputick = 0;
|
|
||||||
double totalgputick_kernel = 0;
|
|
||||||
|
|
||||||
double t1 = 0;
|
|
||||||
double t2 = 0;
|
|
||||||
for(int j = 0; j < LOOP_TIMES + 1; j ++)
|
|
||||||
{
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount();//gpu start1
|
|
||||||
|
|
||||||
cv::ocl::oclMat ocl_image = cv::ocl::oclMat(image);//upload
|
|
||||||
cv::ocl::oclMat ocl_templ = cv::ocl::oclMat(templ);//upload
|
|
||||||
|
|
||||||
t2 = (double)cvGetTickCount(); //kernel
|
|
||||||
cv::ocl::matchTemplate(ocl_image, ocl_templ, dst, method);
|
|
||||||
t2 = (double)cvGetTickCount() - t2;//kernel
|
|
||||||
|
|
||||||
cv::Mat cpu_dst;
|
|
||||||
dst.download (cpu_dst);//download
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount() - t1;//gpu end1
|
|
||||||
|
|
||||||
if(j == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
totalgputick = t1 + totalgputick;
|
|
||||||
totalgputick_kernel = t2 + totalgputick_kernel;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
int all_type_8U[] = {CV_8UC1};
|
||||||
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
std::string type_name_8U[] = {"CV_8UC1"};
|
||||||
|
|
||||||
|
for (size_t j = 0; j < sizeof(all_type_8U) / sizeof(int); j++)
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
struct MatchTemplate32F : MatchTemplate {};
|
|
||||||
TEST_P(MatchTemplate32F, Performance)
|
|
||||||
{
|
|
||||||
std::cout << "Method: " << TEMPLATE_METHOD_NAMES[method] << std::endl;
|
|
||||||
std::cout << "Image Size: (" << size.width << ", " << size.height << ")" << std::endl;
|
|
||||||
std::cout << "Template Size: (" << templ_size.width << ", " << templ_size.height << ")" << std::endl;
|
|
||||||
std::cout << "Channels: " << cn << std::endl;
|
|
||||||
cv::Mat image = randomMat(size, CV_MAKETYPE(CV_32F, cn));
|
|
||||||
cv::Mat templ = randomMat(templ_size, CV_MAKETYPE(CV_32F, cn));
|
|
||||||
|
|
||||||
cv::Mat dst_gold;
|
|
||||||
cv::ocl::oclMat dst;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
double totalgputick = 0;
|
|
||||||
double totalgputick_kernel = 0;
|
|
||||||
|
|
||||||
double t1 = 0;
|
|
||||||
double t2 = 0;
|
|
||||||
for(int j = 0; j < LOOP_TIMES; j ++)
|
|
||||||
{
|
{
|
||||||
|
for(templ_size = 5; templ_size <= 5; templ_size *= 5)
|
||||||
|
{
|
||||||
|
SUBTEST << src.cols << 'x' << src.rows << "; " << type_name_8U[j] << "; templ " << templ_size << 'x' << templ_size << "; CCORR_NORMED";
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount();//gpu start1
|
gen(src, size, size, all_type_8U[j], 0, 255);
|
||||||
|
|
||||||
cv::ocl::oclMat ocl_image = cv::ocl::oclMat(image);//upload
|
gen(templ, templ_size, templ_size, all_type_8U[j], 0, 255);
|
||||||
cv::ocl::oclMat ocl_templ = cv::ocl::oclMat(templ);//upload
|
|
||||||
|
|
||||||
t2 = (double)cvGetTickCount(); //kernel
|
matchTemplate(src, templ, dst, CV_TM_CCORR_NORMED);
|
||||||
cv::ocl::matchTemplate(ocl_image, ocl_templ, dst, method);
|
|
||||||
t2 = (double)cvGetTickCount() - t2;//kernel
|
|
||||||
|
|
||||||
cv::Mat cpu_dst;
|
CPU_ON;
|
||||||
dst.download (cpu_dst);//download
|
matchTemplate(src, templ, dst, CV_TM_CCORR_NORMED);
|
||||||
|
CPU_OFF;
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount() - t1;//gpu end1
|
ocl::oclMat d_src(src);
|
||||||
|
ocl::oclMat d_templ(templ), d_dst;
|
||||||
|
|
||||||
totalgputick = t1 + totalgputick;
|
WARMUP_ON;
|
||||||
|
ocl::matchTemplate(d_src, d_templ, d_dst, CV_TM_CCORR_NORMED);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
totalgputick_kernel = t2 + totalgputick_kernel;
|
GPU_ON;
|
||||||
|
ocl::matchTemplate(d_src, d_templ, d_dst, CV_TM_CCORR_NORMED);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_src.upload(src);
|
||||||
|
d_templ.upload(templ);
|
||||||
|
ocl::matchTemplate(d_src, d_templ, d_dst, CV_TM_CCORR_NORMED);
|
||||||
|
d_dst.download(dst);
|
||||||
|
GPU_FULL_OFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, MatchTemplate8U,
|
|
||||||
testing::Combine(
|
|
||||||
testing::Values(cv::Size(1280, 1024), cv::Size(MWIDTH, MHEIGHT), cv::Size(1800, 1500)),
|
|
||||||
testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16))/*, TemplateSize(cv::Size(30, 30))*/),
|
|
||||||
testing::Values(Channels(1), Channels(4)/*, Channels(3)*/),
|
|
||||||
ALL_TEMPLATE_METHODS
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, MatchTemplate32F, testing::Combine(
|
|
||||||
testing::Values(cv::Size(1280, 1024), cv::Size(MWIDTH, MHEIGHT), cv::Size(1800, 1500)),
|
|
||||||
testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16))/*, TemplateSize(cv::Size(30, 30))*/),
|
|
||||||
testing::Values(Channels(1), Channels(4) /*, Channels(3)*/),
|
|
||||||
testing::Values(TemplateMethod(cv::TM_SQDIFF), TemplateMethod(cv::TM_CCORR))));
|
|
||||||
|
|
||||||
#endif //HAVE_OPENCL
|
|
@ -10,12 +10,12 @@
|
|||||||
// License Agreement
|
// License Agreement
|
||||||
// For Open Source Computer Vision Library
|
// For Open Source Computer Vision Library
|
||||||
//
|
//
|
||||||
// Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved.
|
// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
|
||||||
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
|
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
|
||||||
// Third party copyrights are property of their respective owners.
|
// Third party copyrights are property of their respective owners.
|
||||||
//
|
//
|
||||||
// @Authors
|
// @Authors
|
||||||
// Jia Haipeng, jiahaipeng95@gmail.com
|
// Fangfang Bai, fangfang@multicorewareinc.com
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without modification,
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
// are permitted provided that the following conditions are met:
|
// are permitted provided that the following conditions are met:
|
||||||
@ -30,7 +30,7 @@
|
|||||||
// * The name of the copyright holders may not be used to endorse or promote products
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
// derived from this software without specific prior written permission.
|
// derived from this software without specific prior written permission.
|
||||||
//
|
//
|
||||||
// This software is provided by the copyright holders and contributors "as is" and
|
// 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
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
// 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,
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
@ -42,697 +42,140 @@
|
|||||||
// the use of this software, even if advised of the possibility of such damage.
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
//
|
//
|
||||||
//M*/
|
//M*/
|
||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
|
|
||||||
#ifdef HAVE_OPENCL
|
///////////// ConvertTo////////////////////////
|
||||||
|
TEST(ConvertTo)
|
||||||
using namespace cvtest;
|
|
||||||
using namespace testing;
|
|
||||||
using namespace std;
|
|
||||||
using namespace cv::ocl;
|
|
||||||
////////////////////////////////converto/////////////////////////////////////////////////
|
|
||||||
PARAM_TEST_CASE(ConvertToTestBase, MatType, MatType)
|
|
||||||
{
|
{
|
||||||
int type;
|
Mat src, dst;
|
||||||
int dst_type;
|
ocl::oclMat d_src, d_dst;
|
||||||
|
|
||||||
//src mat
|
int all_type[] = {CV_8UC1, CV_8UC4};
|
||||||
cv::Mat mat;
|
std::string type_name[] = {"CV_8UC1", "CV_8UC4"};
|
||||||
cv::Mat dst;
|
|
||||||
|
|
||||||
// set up roi
|
for (int size = Min_Size; size <= Max_Size; size *= Multiple)
|
||||||
int roicols;
|
|
||||||
int roirows;
|
|
||||||
int srcx;
|
|
||||||
int srcy;
|
|
||||||
int dstx;
|
|
||||||
int dsty;
|
|
||||||
|
|
||||||
//src mat with roi
|
|
||||||
cv::Mat mat_roi;
|
|
||||||
cv::Mat dst_roi;
|
|
||||||
//std::vector<cv::ocl::Info> oclinfo;
|
|
||||||
//ocl dst mat for testing
|
|
||||||
cv::ocl::oclMat gdst_whole;
|
|
||||||
|
|
||||||
//ocl mat with roi
|
|
||||||
cv::ocl::oclMat gmat;
|
|
||||||
cv::ocl::oclMat gdst;
|
|
||||||
|
|
||||||
virtual void SetUp()
|
|
||||||
{
|
{
|
||||||
type = GET_PARAM(0);
|
for (size_t j = 0; j < sizeof(all_type) / sizeof(int); j++)
|
||||||
dst_type = GET_PARAM(1);
|
{
|
||||||
|
SUBTEST << size << 'x' << size << "; " << type_name[j] << " to 32FC1";
|
||||||
|
|
||||||
cv::RNG &rng = TS::ptr()->get_rng();
|
gen(src, size, size, all_type[j], 0, 256);
|
||||||
cv::Size size(MWIDTH, MHEIGHT);
|
//gen(dst, size, size, all_type[j], 0, 256);
|
||||||
|
|
||||||
mat = randomMat(rng, size, type, 5, 16, false);
|
//d_dst.upload(dst);
|
||||||
dst = randomMat(rng, size, type, 5, 16, false);
|
|
||||||
//int devnums = getDevice(oclinfo);
|
src.convertTo(dst, CV_32FC1);
|
||||||
//CV_Assert(devnums > 0);
|
|
||||||
////if you want to use undefault device, set it here
|
CPU_ON;
|
||||||
////setDevice(oclinfo[0]);
|
src.convertTo(dst, CV_32FC1);
|
||||||
//setBinpath(CLBINPATH);
|
CPU_OFF;
|
||||||
|
|
||||||
|
d_src.upload(src);
|
||||||
|
|
||||||
|
WARMUP_ON;
|
||||||
|
d_src.convertTo(d_dst, CV_32FC1);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
d_src.convertTo(d_dst, CV_32FC1);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_src.upload(src);
|
||||||
|
d_src.convertTo(d_dst, CV_32FC1);
|
||||||
|
d_dst.download(dst);
|
||||||
|
GPU_FULL_OFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Has_roi(int b)
|
|
||||||
{
|
|
||||||
//cv::RNG& rng = TS::ptr()->get_rng();
|
|
||||||
if(b)
|
|
||||||
{
|
|
||||||
//randomize ROI
|
|
||||||
roicols = mat.cols - 1; //start
|
|
||||||
roirows = mat.rows - 1;
|
|
||||||
srcx = 1;
|
|
||||||
srcy = 1;
|
|
||||||
dstx = 1;
|
|
||||||
dsty = 1;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
roicols = mat.cols;
|
|
||||||
roirows = mat.rows;
|
|
||||||
srcx = 0;
|
|
||||||
srcy = 0;
|
|
||||||
dstx = 0;
|
|
||||||
dsty = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
mat_roi = mat(Rect(srcx, srcy, roicols, roirows));
|
|
||||||
dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
|
|
||||||
|
|
||||||
//gdst_whole = dst;
|
|
||||||
//gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows));
|
|
||||||
|
|
||||||
//gmat = mat_roi;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
struct ConvertTo : ConvertToTestBase {};
|
|
||||||
|
|
||||||
TEST_P(ConvertTo, Accuracy)
|
|
||||||
{
|
|
||||||
#ifndef PRINT_KERNEL_RUN_TIME
|
|
||||||
double totalcputick = 0;
|
|
||||||
double totalgputick = 0;
|
|
||||||
double totalgputick_kernel = 0;
|
|
||||||
double t0 = 0;
|
|
||||||
double t1 = 0;
|
|
||||||
double t2 = 0;
|
|
||||||
for(int k = LOOPROISTART; k < LOOPROIEND; k++)
|
|
||||||
{
|
|
||||||
totalcputick = 0;
|
|
||||||
totalgputick = 0;
|
|
||||||
totalgputick_kernel = 0;
|
|
||||||
for(int j = 0; j < LOOP_TIMES + 1; j ++)
|
|
||||||
{
|
|
||||||
Has_roi(k);
|
|
||||||
|
|
||||||
t0 = (double)cvGetTickCount();//cpu start
|
|
||||||
mat_roi.convertTo(dst_roi, dst_type);
|
|
||||||
t0 = (double)cvGetTickCount() - t0;//cpu end
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount();//gpu start1
|
|
||||||
gdst_whole = dst;
|
|
||||||
gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
|
|
||||||
|
|
||||||
gmat = mat_roi;
|
|
||||||
t2 = (double)cvGetTickCount(); //kernel
|
|
||||||
gmat.convertTo(gdst, dst_type);
|
|
||||||
t2 = (double)cvGetTickCount() - t2;//kernel
|
|
||||||
cv::Mat cpu_dst;
|
|
||||||
gdst_whole.download (cpu_dst);//download
|
|
||||||
t1 = (double)cvGetTickCount() - t1;//gpu end1
|
|
||||||
if(j == 0)
|
|
||||||
continue;
|
|
||||||
totalgputick = t1 + totalgputick;
|
|
||||||
totalcputick = t0 + totalcputick;
|
|
||||||
totalgputick_kernel = t2 + totalgputick_kernel;
|
|
||||||
|
|
||||||
}
|
|
||||||
if(k == 0)
|
|
||||||
{
|
|
||||||
cout << "no roi\n";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cout << "with roi\n";
|
|
||||||
};
|
|
||||||
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
|
|
||||||
{
|
|
||||||
Has_roi(j);
|
|
||||||
gdst_whole = dst;
|
|
||||||
gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
|
|
||||||
|
|
||||||
gmat = mat_roi;
|
|
||||||
if(j == 0)
|
|
||||||
{
|
|
||||||
cout << "no roi:";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cout << "\nwith roi:";
|
|
||||||
};
|
|
||||||
gmat.convertTo(gdst, dst_type);
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
///////////// copyTo////////////////////////
|
||||||
|
TEST(copyTo)
|
||||||
///////////////////////////////////////////copyto/////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
PARAM_TEST_CASE(CopyToTestBase, MatType, bool)
|
|
||||||
{
|
{
|
||||||
int type;
|
Mat src, dst;
|
||||||
|
ocl::oclMat d_src, d_dst;
|
||||||
|
|
||||||
cv::Mat mat;
|
int all_type[] = {CV_8UC1, CV_8UC4};
|
||||||
cv::Mat mask;
|
std::string type_name[] = {"CV_8UC1", "CV_8UC4"};
|
||||||
cv::Mat dst;
|
|
||||||
|
|
||||||
// set up roi
|
for (int size = Min_Size; size <= Max_Size; size *= Multiple)
|
||||||
int roicols;
|
|
||||||
int roirows;
|
|
||||||
int srcx;
|
|
||||||
int srcy;
|
|
||||||
int dstx;
|
|
||||||
int dsty;
|
|
||||||
int maskx;
|
|
||||||
int masky;
|
|
||||||
|
|
||||||
//src mat with roi
|
|
||||||
cv::Mat mat_roi;
|
|
||||||
cv::Mat mask_roi;
|
|
||||||
cv::Mat dst_roi;
|
|
||||||
//std::vector<cv::ocl::Info> oclinfo;
|
|
||||||
//ocl dst mat for testing
|
|
||||||
cv::ocl::oclMat gdst_whole;
|
|
||||||
|
|
||||||
//ocl mat with roi
|
|
||||||
cv::ocl::oclMat gmat;
|
|
||||||
cv::ocl::oclMat gdst;
|
|
||||||
cv::ocl::oclMat gmask;
|
|
||||||
|
|
||||||
virtual void SetUp()
|
|
||||||
{
|
{
|
||||||
type = GET_PARAM(0);
|
for (size_t j = 0; j < sizeof(all_type) / sizeof(int); j++)
|
||||||
|
{
|
||||||
|
SUBTEST << size << 'x' << size << "; " << type_name[j] ;
|
||||||
|
|
||||||
cv::RNG &rng = TS::ptr()->get_rng();
|
gen(src, size, size, all_type[j], 0, 256);
|
||||||
cv::Size size(MWIDTH, MHEIGHT);
|
//gen(dst, size, size, all_type[j], 0, 256);
|
||||||
|
|
||||||
mat = randomMat(rng, size, type, 5, 16, false);
|
//d_dst.upload(dst);
|
||||||
dst = randomMat(rng, size, type, 5, 16, false);
|
|
||||||
mask = randomMat(rng, size, CV_8UC1, 0, 2, false);
|
|
||||||
|
|
||||||
cv::threshold(mask, mask, 0.5, 255., CV_8UC1);
|
src.copyTo(dst);
|
||||||
//int devnums = getDevice(oclinfo);
|
|
||||||
//CV_Assert(devnums > 0);
|
CPU_ON;
|
||||||
////if you want to use undefault device, set it here
|
src.copyTo(dst);
|
||||||
////setDevice(oclinfo[0]);
|
CPU_OFF;
|
||||||
//setBinpath(CLBINPATH);
|
|
||||||
|
d_src.upload(src);
|
||||||
|
|
||||||
|
WARMUP_ON;
|
||||||
|
d_src.copyTo(d_dst);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
d_src.copyTo(d_dst);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_src.upload(src);
|
||||||
|
d_src.copyTo(d_dst);
|
||||||
|
d_dst.download(dst);
|
||||||
|
GPU_FULL_OFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Has_roi(int b)
|
|
||||||
{
|
|
||||||
//cv::RNG& rng = TS::ptr()->get_rng();
|
|
||||||
if(b)
|
|
||||||
{
|
|
||||||
//randomize ROI
|
|
||||||
roicols = mat.cols - 1; //start
|
|
||||||
roirows = mat.rows - 1;
|
|
||||||
srcx = 1;
|
|
||||||
srcy = 1;
|
|
||||||
dstx = 1;
|
|
||||||
dsty = 1;
|
|
||||||
maskx = 1;
|
|
||||||
masky = 1;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
roicols = mat.cols;
|
|
||||||
roirows = mat.rows;
|
|
||||||
srcx = 0;
|
|
||||||
srcy = 0;
|
|
||||||
dstx = 0;
|
|
||||||
dsty = 0;
|
|
||||||
maskx = 0;
|
|
||||||
masky = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
mat_roi = mat(Rect(srcx, srcy, roicols, roirows));
|
|
||||||
mask_roi = mask(Rect(maskx, masky, roicols, roirows));
|
|
||||||
dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
|
|
||||||
|
|
||||||
//gdst_whole = dst;
|
|
||||||
//gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows));
|
|
||||||
|
|
||||||
//gmat = mat_roi;
|
|
||||||
//gmask = mask_roi;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CopyTo : CopyToTestBase {};
|
|
||||||
|
|
||||||
TEST_P(CopyTo, Without_mask)
|
|
||||||
{
|
|
||||||
#ifndef PRINT_KERNEL_RUN_TIME
|
|
||||||
double totalcputick = 0;
|
|
||||||
double totalgputick = 0;
|
|
||||||
double totalgputick_kernel = 0;
|
|
||||||
double t0 = 0;
|
|
||||||
double t1 = 0;
|
|
||||||
double t2 = 0;
|
|
||||||
for(int k = LOOPROISTART; k < LOOPROIEND; k++)
|
|
||||||
{
|
|
||||||
totalcputick = 0;
|
|
||||||
totalgputick = 0;
|
|
||||||
totalgputick_kernel = 0;
|
|
||||||
for(int j = 0; j < LOOP_TIMES + 1; j ++)
|
|
||||||
{
|
|
||||||
Has_roi(k);
|
|
||||||
|
|
||||||
t0 = (double)cvGetTickCount();//cpu start
|
|
||||||
mat_roi.copyTo(dst_roi);
|
|
||||||
t0 = (double)cvGetTickCount() - t0;//cpu end
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount();//gpu start1
|
|
||||||
gdst_whole = dst;
|
|
||||||
gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
|
|
||||||
|
|
||||||
gmat = mat_roi;
|
|
||||||
t2 = (double)cvGetTickCount(); //kernel
|
|
||||||
gmat.copyTo(gdst);
|
|
||||||
t2 = (double)cvGetTickCount() - t2;//kernel
|
|
||||||
cv::Mat cpu_dst;
|
|
||||||
gdst_whole.download (cpu_dst);//download
|
|
||||||
t1 = (double)cvGetTickCount() - t1;//gpu end1
|
|
||||||
if(j == 0)
|
|
||||||
continue;
|
|
||||||
totalgputick = t1 + totalgputick;
|
|
||||||
totalcputick = t0 + totalcputick;
|
|
||||||
totalgputick_kernel = t2 + totalgputick_kernel;
|
|
||||||
|
|
||||||
}
|
|
||||||
if(k == 0)
|
|
||||||
{
|
|
||||||
cout << "no roi\n";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cout << "with roi\n";
|
|
||||||
};
|
|
||||||
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
|
|
||||||
{
|
|
||||||
Has_roi(j);
|
|
||||||
gdst_whole = dst;
|
|
||||||
gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
|
|
||||||
|
|
||||||
gmat = mat_roi;
|
|
||||||
|
|
||||||
if(j == 0)
|
|
||||||
{
|
|
||||||
cout << "no roi:";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cout << "\nwith roi:";
|
|
||||||
};
|
|
||||||
gmat.copyTo(gdst);
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
///////////// setTo////////////////////////
|
||||||
TEST_P(CopyTo, With_mask)
|
TEST(setTo)
|
||||||
{
|
{
|
||||||
#ifndef PRINT_KERNEL_RUN_TIME
|
Mat src, dst;
|
||||||
double totalcputick = 0;
|
Scalar val(1, 2, 3, 4);
|
||||||
double totalgputick = 0;
|
ocl::oclMat d_src, d_dst;
|
||||||
double totalgputick_kernel = 0;
|
|
||||||
double t0 = 0;
|
int all_type[] = {CV_8UC1, CV_8UC4};
|
||||||
double t1 = 0;
|
std::string type_name[] = {"CV_8UC1", "CV_8UC4"};
|
||||||
double t2 = 0;
|
|
||||||
for(int k = LOOPROISTART; k < LOOPROIEND; k++)
|
for (int size = Min_Size; size <= Max_Size; size *= Multiple)
|
||||||
{
|
{
|
||||||
totalcputick = 0;
|
for (size_t j = 0; j < sizeof(all_type) / sizeof(int); j++)
|
||||||
totalgputick = 0;
|
|
||||||
totalgputick_kernel = 0;
|
|
||||||
for(int j = 0; j < LOOP_TIMES + 1; j ++)
|
|
||||||
{
|
{
|
||||||
Has_roi(k);
|
SUBTEST << size << 'x' << size << "; " << type_name[j] ;
|
||||||
|
|
||||||
t0 = (double)cvGetTickCount();//cpu start
|
gen(src, size, size, all_type[j], 0, 256);
|
||||||
mat_roi.copyTo(dst_roi, mask_roi);
|
|
||||||
t0 = (double)cvGetTickCount() - t0;//cpu end
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount();//gpu start1
|
src.setTo(val);
|
||||||
gdst_whole = dst;
|
|
||||||
gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
|
|
||||||
|
|
||||||
gmat = mat_roi;
|
CPU_ON;
|
||||||
gmask = mask_roi;
|
src.setTo(val);
|
||||||
t2 = (double)cvGetTickCount(); //kernel
|
CPU_OFF;
|
||||||
gmat.copyTo(gdst, gmask);
|
|
||||||
t2 = (double)cvGetTickCount() - t2;//kernel
|
d_src.upload(src);
|
||||||
cv::Mat cpu_dst;
|
|
||||||
gdst_whole.download (cpu_dst);//download
|
WARMUP_ON;
|
||||||
t1 = (double)cvGetTickCount() - t1;//gpu end1
|
d_src.setTo(val);
|
||||||
if(j == 0)
|
WARMUP_OFF;
|
||||||
continue;
|
|
||||||
totalgputick = t1 + totalgputick;
|
GPU_ON;
|
||||||
totalcputick = t0 + totalcputick;
|
d_src.setTo(val);
|
||||||
totalgputick_kernel = t2 + totalgputick_kernel;
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_src.upload(src);
|
||||||
|
d_src.setTo(val);
|
||||||
|
GPU_FULL_OFF;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if(k == 0)
|
|
||||||
{
|
|
||||||
cout << "no roi\n";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cout << "with roi\n";
|
|
||||||
};
|
|
||||||
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
|
|
||||||
{
|
|
||||||
Has_roi(j);
|
|
||||||
gdst_whole = dst;
|
|
||||||
gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
|
|
||||||
|
|
||||||
gmat = mat_roi;
|
|
||||||
gmask = mask_roi;
|
|
||||||
|
|
||||||
if(j == 0)
|
|
||||||
{
|
|
||||||
cout << "no roi:";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cout << "\nwith roi:";
|
|
||||||
};
|
|
||||||
gmat.copyTo(gdst, gmask);
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////copyto/////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
PARAM_TEST_CASE(SetToTestBase, MatType, bool)
|
|
||||||
{
|
|
||||||
int type;
|
|
||||||
cv::Scalar val;
|
|
||||||
|
|
||||||
cv::Mat mat;
|
|
||||||
cv::Mat mask;
|
|
||||||
|
|
||||||
// set up roi
|
|
||||||
int roicols;
|
|
||||||
int roirows;
|
|
||||||
int srcx;
|
|
||||||
int srcy;
|
|
||||||
int maskx;
|
|
||||||
int masky;
|
|
||||||
|
|
||||||
//src mat with roi
|
|
||||||
cv::Mat mat_roi;
|
|
||||||
cv::Mat mask_roi;
|
|
||||||
//std::vector<cv::ocl::Info> oclinfo;
|
|
||||||
//ocl dst mat for testing
|
|
||||||
cv::ocl::oclMat gmat_whole;
|
|
||||||
|
|
||||||
//ocl mat with roi
|
|
||||||
cv::ocl::oclMat gmat;
|
|
||||||
cv::ocl::oclMat gmask;
|
|
||||||
|
|
||||||
virtual void SetUp()
|
|
||||||
{
|
|
||||||
type = GET_PARAM(0);
|
|
||||||
|
|
||||||
cv::RNG &rng = TS::ptr()->get_rng();
|
|
||||||
cv::Size size(MWIDTH, MHEIGHT);
|
|
||||||
|
|
||||||
mat = randomMat(rng, size, type, 5, 16, false);
|
|
||||||
mask = randomMat(rng, size, CV_8UC1, 0, 2, false);
|
|
||||||
|
|
||||||
cv::threshold(mask, mask, 0.5, 255., CV_8UC1);
|
|
||||||
val = cv::Scalar(rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0));
|
|
||||||
//int devnums = getDevice(oclinfo);
|
|
||||||
//CV_Assert(devnums > 0);
|
|
||||||
////if you want to use undefault device, set it here
|
|
||||||
////setDevice(oclinfo[0]);
|
|
||||||
//setBinpath(CLBINPATH);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Has_roi(int b)
|
|
||||||
{
|
|
||||||
//cv::RNG& rng = TS::ptr()->get_rng();
|
|
||||||
if(b)
|
|
||||||
{
|
|
||||||
//randomize ROI
|
|
||||||
roicols = mat.cols - 1; //start
|
|
||||||
roirows = mat.rows - 1;
|
|
||||||
srcx = 1;
|
|
||||||
srcy = 1;
|
|
||||||
maskx = 1;
|
|
||||||
masky = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
roicols = mat.cols;
|
|
||||||
roirows = mat.rows;
|
|
||||||
srcx = 0;
|
|
||||||
srcy = 0;
|
|
||||||
maskx = 0;
|
|
||||||
masky = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
mat_roi = mat(Rect(srcx, srcy, roicols, roirows));
|
|
||||||
mask_roi = mask(Rect(maskx, masky, roicols, roirows));
|
|
||||||
|
|
||||||
//gmat_whole = mat;
|
|
||||||
//gmat = gmat_whole(Rect(srcx,srcy,roicols,roirows));
|
|
||||||
|
|
||||||
//gmask = mask_roi;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SetTo : SetToTestBase {};
|
|
||||||
|
|
||||||
TEST_P(SetTo, Without_mask)
|
|
||||||
{
|
|
||||||
#ifndef PRINT_KERNEL_RUN_TIME
|
|
||||||
double totalcputick = 0;
|
|
||||||
double totalgputick = 0;
|
|
||||||
double totalgputick_kernel = 0;
|
|
||||||
double t0 = 0;
|
|
||||||
double t1 = 0;
|
|
||||||
double t2 = 0;
|
|
||||||
for(int k = LOOPROISTART; k < LOOPROIEND; k++)
|
|
||||||
{
|
|
||||||
totalcputick = 0;
|
|
||||||
totalgputick = 0;
|
|
||||||
totalgputick_kernel = 0;
|
|
||||||
for(int j = 0; j < LOOP_TIMES + 1; j ++)
|
|
||||||
{
|
|
||||||
Has_roi(k);
|
|
||||||
|
|
||||||
t0 = (double)cvGetTickCount();//cpu start
|
|
||||||
mat_roi.setTo(val);
|
|
||||||
t0 = (double)cvGetTickCount() - t0;//cpu end
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount();//gpu start1
|
|
||||||
gmat_whole = mat;
|
|
||||||
gmat = gmat_whole(Rect(srcx, srcy, roicols, roirows));
|
|
||||||
t2 = (double)cvGetTickCount(); //kernel
|
|
||||||
gmat.setTo(val);
|
|
||||||
t2 = (double)cvGetTickCount() - t2;//kernel
|
|
||||||
cv::Mat cpu_dst;
|
|
||||||
gmat_whole.download(cpu_dst);//download
|
|
||||||
t1 = (double)cvGetTickCount() - t1;//gpu end1
|
|
||||||
if(j == 0)
|
|
||||||
continue;
|
|
||||||
totalgputick = t1 + totalgputick;
|
|
||||||
totalcputick = t0 + totalcputick;
|
|
||||||
totalgputick_kernel = t2 + totalgputick_kernel;
|
|
||||||
|
|
||||||
}
|
|
||||||
if(k == 0)
|
|
||||||
{
|
|
||||||
cout << "no roi\n";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cout << "with roi\n";
|
|
||||||
};
|
|
||||||
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
|
|
||||||
{
|
|
||||||
Has_roi(j);
|
|
||||||
gmat_whole = mat;
|
|
||||||
gmat = gmat_whole(Rect(srcx, srcy, roicols, roirows));
|
|
||||||
|
|
||||||
if(j == 0)
|
|
||||||
{
|
|
||||||
cout << "no roi:";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cout << "\nwith roi:";
|
|
||||||
};
|
|
||||||
gmat.setTo(val);
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_P(SetTo, With_mask)
|
|
||||||
{
|
|
||||||
#ifndef PRINT_KERNEL_RUN_TIME
|
|
||||||
double totalcputick = 0;
|
|
||||||
double totalgputick = 0;
|
|
||||||
double totalgputick_kernel = 0;
|
|
||||||
double t0 = 0;
|
|
||||||
double t1 = 0;
|
|
||||||
double t2 = 0;
|
|
||||||
for(int k = LOOPROISTART; k < LOOPROIEND; k++)
|
|
||||||
{
|
|
||||||
totalcputick = 0;
|
|
||||||
totalgputick = 0;
|
|
||||||
totalgputick_kernel = 0;
|
|
||||||
for(int j = 0; j < LOOP_TIMES + 1; j ++)
|
|
||||||
{
|
|
||||||
Has_roi(k);
|
|
||||||
|
|
||||||
t0 = (double)cvGetTickCount();//cpu start
|
|
||||||
mat_roi.setTo(val, mask_roi);
|
|
||||||
t0 = (double)cvGetTickCount() - t0;//cpu end
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount();//gpu start1
|
|
||||||
gmat_whole = mat;
|
|
||||||
gmat = gmat_whole(Rect(srcx, srcy, roicols, roirows));
|
|
||||||
|
|
||||||
gmask = mask_roi;
|
|
||||||
t2 = (double)cvGetTickCount(); //kernel
|
|
||||||
gmat.setTo(val, gmask);
|
|
||||||
t2 = (double)cvGetTickCount() - t2;//kernel
|
|
||||||
cv::Mat cpu_dst;
|
|
||||||
gmat_whole.download(cpu_dst);//download
|
|
||||||
t1 = (double)cvGetTickCount() - t1;//gpu end1
|
|
||||||
if(j == 0)
|
|
||||||
continue;
|
|
||||||
totalgputick = t1 + totalgputick;
|
|
||||||
totalcputick = t0 + totalcputick;
|
|
||||||
totalgputick_kernel = t2 + totalgputick_kernel;
|
|
||||||
|
|
||||||
}
|
|
||||||
if(k == 0)
|
|
||||||
{
|
|
||||||
cout << "no roi\n";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cout << "with roi\n";
|
|
||||||
};
|
|
||||||
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
|
|
||||||
{
|
|
||||||
Has_roi(j);
|
|
||||||
gmat_whole = mat;
|
|
||||||
gmat = gmat_whole(Rect(srcx, srcy, roicols, roirows));
|
|
||||||
|
|
||||||
gmask = mask_roi;
|
|
||||||
|
|
||||||
if(j == 0)
|
|
||||||
{
|
|
||||||
cout << "no roi:";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cout << "\nwith roi:";
|
|
||||||
};
|
|
||||||
gmat.setTo(val, gmask);
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
PARAM_TEST_CASE(DataTransfer, MatType, bool)
|
|
||||||
{
|
|
||||||
int type;
|
|
||||||
cv::Mat mat;
|
|
||||||
cv::ocl::oclMat gmat_whole;
|
|
||||||
|
|
||||||
virtual void SetUp()
|
|
||||||
{
|
|
||||||
type = GET_PARAM(0);
|
|
||||||
cv::RNG &rng = TS::ptr()->get_rng();
|
|
||||||
cv::Size size(MWIDTH, MHEIGHT);
|
|
||||||
mat = randomMat(rng, size, type, 5, 16, false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
TEST_P(DataTransfer, perf)
|
|
||||||
{
|
|
||||||
double totaluploadtick = 0;
|
|
||||||
double totaldownloadtick = 0;
|
|
||||||
double totaltick = 0;
|
|
||||||
double t0 = 0;
|
|
||||||
double t1 = 0;
|
|
||||||
cv::Mat cpu_dst;
|
|
||||||
for(int j = 0; j < LOOP_TIMES + 1; j ++)
|
|
||||||
{
|
|
||||||
t0 = (double)cvGetTickCount();
|
|
||||||
gmat_whole.upload(mat);//upload
|
|
||||||
t0 = (double)cvGetTickCount() - t0;
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount();
|
|
||||||
gmat_whole.download(cpu_dst);//download
|
|
||||||
t1 = (double)cvGetTickCount() - t1;
|
|
||||||
|
|
||||||
if(j == 0)
|
|
||||||
continue;
|
|
||||||
totaluploadtick = t0 + totaluploadtick;
|
|
||||||
totaldownloadtick = t1 + totaldownloadtick;
|
|
||||||
}
|
|
||||||
totaltick = totaluploadtick + totaldownloadtick;
|
|
||||||
cout << "average upload time is " << totaluploadtick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average download time is " << totaldownloadtick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average data transfer time is " << totaltick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
}
|
|
||||||
//**********test************
|
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(MatrixOperation, ConvertTo, Combine(
|
|
||||||
Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4),
|
|
||||||
Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4)));
|
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(MatrixOperation, CopyTo, Combine(
|
|
||||||
Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4),
|
|
||||||
Values(false))); // Values(false) is the reserved parameter
|
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(MatrixOperation, SetTo, Combine(
|
|
||||||
Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4),
|
|
||||||
Values(false))); // Values(false) is the reserved parameter
|
|
||||||
INSTANTIATE_TEST_CASE_P(MatrixOperation, DataTransfer, Combine(
|
|
||||||
Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4),
|
|
||||||
Values(false))); // Values(false) is the reserved parameter
|
|
||||||
#endif
|
|
||||||
|
84
modules/ocl/perf/perf_norm.cpp
Normal file
84
modules/ocl/perf/perf_norm.cpp
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
/*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
|
||||||
|
// Fangfang Bai, fangfang@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"
|
||||||
|
|
||||||
|
///////////// norm////////////////////////
|
||||||
|
TEST(norm)
|
||||||
|
{
|
||||||
|
Mat src, buf;
|
||||||
|
ocl::oclMat d_src, d_buf;
|
||||||
|
|
||||||
|
|
||||||
|
for (int size = Min_Size; size <= Max_Size; size *= Multiple)
|
||||||
|
{
|
||||||
|
SUBTEST << size << 'x' << size << "; CV_8UC1; NORM_INF";
|
||||||
|
|
||||||
|
gen(src, size, size, CV_8UC1, Scalar::all(0), Scalar::all(1));
|
||||||
|
gen(buf, size, size, CV_8UC1, Scalar::all(0), Scalar::all(1));
|
||||||
|
|
||||||
|
norm(src, NORM_INF);
|
||||||
|
|
||||||
|
CPU_ON;
|
||||||
|
norm(src, NORM_INF);
|
||||||
|
CPU_OFF;
|
||||||
|
|
||||||
|
d_src.upload(src);
|
||||||
|
d_buf.upload(buf);
|
||||||
|
|
||||||
|
WARMUP_ON;
|
||||||
|
ocl::norm(d_src, d_buf, NORM_INF);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
ocl::norm(d_src, d_buf, NORM_INF);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_src.upload(src);
|
||||||
|
ocl::norm(d_src, d_buf, NORM_INF);
|
||||||
|
GPU_FULL_OFF;
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////
|
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||||
//
|
//
|
||||||
@ -15,7 +15,7 @@
|
|||||||
// Third party copyrights are property of their respective owners.
|
// Third party copyrights are property of their respective owners.
|
||||||
//
|
//
|
||||||
// @Authors
|
// @Authors
|
||||||
// fangfang bai, fangfang@multicorewareinc.com
|
// Fangfang Bai, fangfang@multicorewareinc.com
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without modification,
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
// are permitted provided that the following conditions are met:
|
// are permitted provided that the following conditions are met:
|
||||||
@ -30,7 +30,7 @@
|
|||||||
// * The name of the copyright holders may not be used to endorse or promote products
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
// derived from this software without specific prior written permission.
|
// derived from this software without specific prior written permission.
|
||||||
//
|
//
|
||||||
// This software is provided by the copyright holders and contributors "as is" and
|
// 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
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
// 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,
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
@ -42,96 +42,46 @@
|
|||||||
// the use of this software, even if advised of the possibility of such damage.
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
//
|
//
|
||||||
//M*/
|
//M*/
|
||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
#include <iomanip>
|
|
||||||
|
|
||||||
#ifdef HAVE_OPENCL
|
///////////// pyrDown //////////////////////
|
||||||
|
TEST(pyrDown)
|
||||||
using namespace cv;
|
|
||||||
using namespace cv::ocl;
|
|
||||||
using namespace cvtest;
|
|
||||||
using namespace testing;
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
PARAM_TEST_CASE(PyrDown, MatType, int)
|
|
||||||
{
|
{
|
||||||
int type;
|
Mat src, dst;
|
||||||
int channels;
|
int all_type[] = {CV_8UC1, CV_8UC4};
|
||||||
//src mat
|
std::string type_name[] = {"CV_8UC1", "CV_8UC4"};
|
||||||
cv::Mat mat1;
|
|
||||||
cv::Mat dst;
|
|
||||||
|
|
||||||
//std::vector<cv::ocl::Info> oclinfo;
|
for (int size = Min_Size; size <= Max_Size; size *= Multiple)
|
||||||
//ocl dst mat for testing
|
|
||||||
|
|
||||||
cv::ocl::oclMat gmat1;
|
|
||||||
cv::ocl::oclMat gdst;
|
|
||||||
|
|
||||||
|
|
||||||
virtual void SetUp()
|
|
||||||
{
|
{
|
||||||
type = GET_PARAM(0);
|
for (size_t j = 0; j < sizeof(all_type) / sizeof(int); j++)
|
||||||
channels = GET_PARAM(1);
|
|
||||||
//int devnums = getDevice(oclinfo);
|
|
||||||
//CV_Assert(devnums > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#define VARNAME(A) string(#A);
|
|
||||||
|
|
||||||
////////////////////////////////PyrDown/////////////////////////////////////////////////
|
|
||||||
TEST_P(PyrDown, Mat)
|
|
||||||
{
|
|
||||||
cv::Size size(MWIDTH, MHEIGHT);
|
|
||||||
cv::RNG &rng = TS::ptr()->get_rng();
|
|
||||||
mat1 = randomMat(rng, size, CV_MAKETYPE(type, channels), 5, 16, false);
|
|
||||||
|
|
||||||
|
|
||||||
cv::ocl::oclMat gdst;
|
|
||||||
double totalgputick = 0;
|
|
||||||
double totalgputick_kernel = 0;
|
|
||||||
|
|
||||||
double t1 = 0;
|
|
||||||
double t2 = 0;
|
|
||||||
|
|
||||||
for (int j = 0; j < LOOP_TIMES + 1; j ++)
|
|
||||||
{
|
{
|
||||||
|
SUBTEST << size << 'x' << size << "; " << type_name[j] ;
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount();//gpu start1
|
gen(src, size, size, all_type[j], 0, 256);
|
||||||
|
|
||||||
cv::ocl::oclMat gmat1(mat1);
|
pyrDown(src, dst);
|
||||||
|
|
||||||
t2 = (double)cvGetTickCount(); //kernel
|
CPU_ON;
|
||||||
cv::ocl::pyrDown(gmat1, gdst);
|
pyrDown(src, dst);
|
||||||
t2 = (double)cvGetTickCount() - t2;//kernel
|
CPU_OFF;
|
||||||
|
|
||||||
cv::Mat cpu_dst;
|
ocl::oclMat d_src(src);
|
||||||
gdst.download(cpu_dst);
|
ocl::oclMat d_dst;
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount() - t1;//gpu end1
|
WARMUP_ON;
|
||||||
|
ocl::pyrDown(d_src, d_dst);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
if (j == 0)
|
GPU_ON;
|
||||||
{
|
ocl::pyrDown(d_src, d_dst);
|
||||||
continue;
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_src.upload(src);
|
||||||
|
ocl::pyrDown(d_src, d_dst);
|
||||||
|
d_dst.download(dst);
|
||||||
|
GPU_FULL_OFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
totalgputick = t1 + totalgputick;
|
|
||||||
|
|
||||||
totalgputick_kernel = t2 + totalgputick_kernel;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//********test****************
|
|
||||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, PyrDown, Combine(
|
|
||||||
Values(CV_8U, CV_32F), Values(1, 4)));
|
|
||||||
|
|
||||||
|
|
||||||
#endif // HAVE_OPENCL
|
|
||||||
|
143
modules/ocl/perf/perf_pyrlk.cpp
Normal file
143
modules/ocl/perf/perf_pyrlk.cpp
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
/*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
|
||||||
|
// Fangfang Bai, fangfang@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"
|
||||||
|
|
||||||
|
///////////// PyrLKOpticalFlow ////////////////////////
|
||||||
|
TEST(PyrLKOpticalFlow)
|
||||||
|
{
|
||||||
|
std::string images1[] = {"rubberwhale1.png", "aloeL.jpg"};
|
||||||
|
std::string images2[] = {"rubberwhale2.png", "aloeR.jpg"};
|
||||||
|
|
||||||
|
for (size_t i = 0; i < sizeof(images1) / sizeof(std::string); i++)
|
||||||
|
{
|
||||||
|
Mat frame0 = imread(abspath(images1[i]), i == 0 ? IMREAD_COLOR : IMREAD_GRAYSCALE);
|
||||||
|
|
||||||
|
if (frame0.empty())
|
||||||
|
{
|
||||||
|
std::string errstr = "can't open " + images1[i];
|
||||||
|
throw runtime_error(errstr);
|
||||||
|
}
|
||||||
|
|
||||||
|
Mat frame1 = imread(abspath(images2[i]), i == 0 ? IMREAD_COLOR : IMREAD_GRAYSCALE);
|
||||||
|
|
||||||
|
if (frame1.empty())
|
||||||
|
{
|
||||||
|
std::string errstr = "can't open " + images2[i];
|
||||||
|
throw runtime_error(errstr);
|
||||||
|
}
|
||||||
|
|
||||||
|
Mat gray_frame;
|
||||||
|
|
||||||
|
if (i == 0)
|
||||||
|
{
|
||||||
|
cvtColor(frame0, gray_frame, COLOR_BGR2GRAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int points = Min_Size; points <= Max_Size; points *= Multiple)
|
||||||
|
{
|
||||||
|
if (i == 0)
|
||||||
|
SUBTEST << frame0.cols << "x" << frame0.rows << "; color; " << points << " points";
|
||||||
|
else
|
||||||
|
SUBTEST << frame0.cols << "x" << frame0.rows << "; gray; " << points << " points";
|
||||||
|
Mat nextPts_cpu;
|
||||||
|
Mat status_cpu;
|
||||||
|
|
||||||
|
vector<Point2f> pts;
|
||||||
|
goodFeaturesToTrack(i == 0 ? gray_frame : frame0, pts, points, 0.01, 0.0);
|
||||||
|
|
||||||
|
vector<Point2f> nextPts;
|
||||||
|
vector<unsigned char> status;
|
||||||
|
|
||||||
|
vector<float> err;
|
||||||
|
|
||||||
|
calcOpticalFlowPyrLK(frame0, frame1, pts, nextPts, status, err);
|
||||||
|
|
||||||
|
CPU_ON;
|
||||||
|
calcOpticalFlowPyrLK(frame0, frame1, pts, nextPts, status, err);
|
||||||
|
CPU_OFF;
|
||||||
|
|
||||||
|
ocl::PyrLKOpticalFlow d_pyrLK;
|
||||||
|
|
||||||
|
ocl::oclMat d_frame0(frame0);
|
||||||
|
ocl::oclMat d_frame1(frame1);
|
||||||
|
|
||||||
|
ocl::oclMat d_pts;
|
||||||
|
Mat pts_mat(1, (int)pts.size(), CV_32FC2, (void *)&pts[0]);
|
||||||
|
d_pts.upload(pts_mat);
|
||||||
|
|
||||||
|
ocl::oclMat d_nextPts;
|
||||||
|
ocl::oclMat d_status;
|
||||||
|
ocl::oclMat d_err;
|
||||||
|
|
||||||
|
WARMUP_ON;
|
||||||
|
d_pyrLK.sparse(d_frame0, d_frame1, d_pts, d_nextPts, d_status, &d_err);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
d_pyrLK.sparse(d_frame0, d_frame1, d_pts, d_nextPts, d_status, &d_err);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_frame0.upload(frame0);
|
||||||
|
d_frame1.upload(frame1);
|
||||||
|
d_pts.upload(pts_mat);
|
||||||
|
d_pyrLK.sparse(d_frame0, d_frame1, d_pts, d_nextPts, d_status, &d_err);
|
||||||
|
|
||||||
|
if (!d_nextPts.empty())
|
||||||
|
{
|
||||||
|
d_nextPts.download(nextPts_cpu);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!d_status.empty())
|
||||||
|
{
|
||||||
|
d_status.download(status_cpu);
|
||||||
|
}
|
||||||
|
|
||||||
|
GPU_FULL_OFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -15,7 +15,7 @@
|
|||||||
// Third party copyrights are property of their respective owners.
|
// Third party copyrights are property of their respective owners.
|
||||||
//
|
//
|
||||||
// @Authors
|
// @Authors
|
||||||
// fangfang bai fangfang@multicorewareinc.com
|
// Fangfang Bai, fangfang@multicorewareinc.com
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without modification,
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
// are permitted provided that the following conditions are met:
|
// are permitted provided that the following conditions are met:
|
||||||
@ -30,7 +30,7 @@
|
|||||||
// * The name of the copyright holders may not be used to endorse or promote products
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
// derived from this software without specific prior written permission.
|
// derived from this software without specific prior written permission.
|
||||||
//
|
//
|
||||||
// This software is provided by the copyright holders and contributors "as is" and
|
// 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
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
// 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,
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
@ -42,80 +42,46 @@
|
|||||||
// the use of this software, even if advised of the possibility of such damage.
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
//
|
//
|
||||||
//M*/
|
//M*/
|
||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
#include <iomanip>
|
|
||||||
#ifdef HAVE_OPENCL
|
|
||||||
using namespace cv;
|
|
||||||
using namespace cv::ocl;
|
|
||||||
using namespace cvtest;
|
|
||||||
using namespace testing;
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
|
///////////// pyrUp ////////////////////////
|
||||||
PARAM_TEST_CASE(PyrUp, MatType, int)
|
TEST(pyrUp)
|
||||||
{
|
{
|
||||||
int type;
|
Mat src, dst;
|
||||||
int channels;
|
int all_type[] = {CV_8UC1, CV_8UC4};
|
||||||
//std::vector<cv::ocl::Info> oclinfo;
|
std::string type_name[] = {"CV_8UC1", "CV_8UC4"};
|
||||||
|
|
||||||
virtual void SetUp()
|
for (int size = 500; size <= 2000; size *= 2)
|
||||||
{
|
{
|
||||||
type = GET_PARAM(0);
|
for (size_t j = 0; j < sizeof(all_type) / sizeof(int); j++)
|
||||||
channels = GET_PARAM(1);
|
|
||||||
//int devnums = getDevice(oclinfo);
|
|
||||||
//CV_Assert(devnums > 0);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_P(PyrUp, Performance)
|
|
||||||
{
|
|
||||||
cv::Size size(MWIDTH, MHEIGHT);
|
|
||||||
cv::Mat src = randomMat(size, CV_MAKETYPE(type, channels));
|
|
||||||
cv::Mat dst_gold;
|
|
||||||
cv::ocl::oclMat dst;
|
|
||||||
|
|
||||||
|
|
||||||
double totalgputick = 0;
|
|
||||||
double totalgputick_kernel = 0;
|
|
||||||
|
|
||||||
double t1 = 0;
|
|
||||||
double t2 = 0;
|
|
||||||
|
|
||||||
for (int j = 0; j < LOOP_TIMES + 1; j ++)
|
|
||||||
{
|
{
|
||||||
t1 = (double)cvGetTickCount();//gpu start1
|
SUBTEST << size << 'x' << size << "; " << type_name[j] ;
|
||||||
|
|
||||||
cv::ocl::oclMat srcMat = cv::ocl::oclMat(src);//upload
|
gen(src, size, size, all_type[j], 0, 256);
|
||||||
|
|
||||||
t2 = (double)cvGetTickCount(); //kernel
|
pyrUp(src, dst);
|
||||||
cv::ocl::pyrUp(srcMat, dst);
|
|
||||||
t2 = (double)cvGetTickCount() - t2;//kernel
|
|
||||||
|
|
||||||
cv::Mat cpu_dst;
|
CPU_ON;
|
||||||
dst.download(cpu_dst); //download
|
pyrUp(src, dst);
|
||||||
|
CPU_OFF;
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount() - t1;//gpu end1
|
ocl::oclMat d_src(src);
|
||||||
|
ocl::oclMat d_dst;
|
||||||
|
|
||||||
if (j == 0)
|
WARMUP_ON;
|
||||||
{
|
ocl::pyrUp(d_src, d_dst);
|
||||||
continue;
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
ocl::pyrUp(d_src, d_dst);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_src.upload(src);
|
||||||
|
ocl::pyrUp(d_src, d_dst);
|
||||||
|
d_dst.download(dst);
|
||||||
|
GPU_FULL_OFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
totalgputick = t1 + totalgputick;
|
|
||||||
|
|
||||||
totalgputick_kernel = t2 + totalgputick_kernel;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, PyrUp, Combine(
|
|
||||||
Values(CV_8U, CV_32F), Values(1, 4)));
|
|
||||||
|
|
||||||
#endif // HAVE_OPENCL
|
|
@ -10,12 +10,12 @@
|
|||||||
// License Agreement
|
// License Agreement
|
||||||
// For Open Source Computer Vision Library
|
// For Open Source Computer Vision Library
|
||||||
//
|
//
|
||||||
// Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved.
|
// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
|
||||||
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
|
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
|
||||||
// Third party copyrights are property of their respective owners.
|
// Third party copyrights are property of their respective owners.
|
||||||
//
|
//
|
||||||
// @Authors
|
// @Authors
|
||||||
// Jia Haipeng, jiahaipeng95@gmail.com
|
// Fangfang Bai, fangfang@multicorewareinc.com
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without modification,
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
// are permitted provided that the following conditions are met:
|
// are permitted provided that the following conditions are met:
|
||||||
@ -30,7 +30,7 @@
|
|||||||
// * The name of the copyright holders may not be used to endorse or promote products
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
// derived from this software without specific prior written permission.
|
// derived from this software without specific prior written permission.
|
||||||
//
|
//
|
||||||
// This software is provided by the copyright holders and contributors "as is" and
|
// 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
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
// 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,
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
@ -42,446 +42,109 @@
|
|||||||
// the use of this software, even if advised of the possibility of such damage.
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
//
|
//
|
||||||
//M*/
|
//M*/
|
||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
|
|
||||||
#ifdef HAVE_OPENCL
|
///////////// Merge////////////////////////
|
||||||
|
TEST(Merge)
|
||||||
using namespace cvtest;
|
|
||||||
using namespace testing;
|
|
||||||
using namespace std;
|
|
||||||
using namespace cv::ocl;
|
|
||||||
PARAM_TEST_CASE(MergeTestBase, MatType, int)
|
|
||||||
{
|
{
|
||||||
int type;
|
Mat dst;
|
||||||
int channels;
|
ocl::oclMat d_dst;
|
||||||
|
|
||||||
//src mat
|
int channels = 4;
|
||||||
cv::Mat mat1;
|
int all_type[] = {CV_8UC1, CV_32FC1};
|
||||||
cv::Mat mat2;
|
std::string type_name[] = {"CV_8UC1", "CV_32FC1"};
|
||||||
cv::Mat mat3;
|
|
||||||
cv::Mat mat4;
|
|
||||||
|
|
||||||
//dst mat
|
for (int size = Min_Size; size <= Max_Size; size *= Multiple)
|
||||||
cv::Mat dst;
|
|
||||||
|
|
||||||
// set up roi
|
|
||||||
int roicols;
|
|
||||||
int roirows;
|
|
||||||
int src1x;
|
|
||||||
int src1y;
|
|
||||||
int src2x;
|
|
||||||
int src2y;
|
|
||||||
int src3x;
|
|
||||||
int src3y;
|
|
||||||
int src4x;
|
|
||||||
int src4y;
|
|
||||||
int dstx;
|
|
||||||
int dsty;
|
|
||||||
|
|
||||||
//src mat with roi
|
|
||||||
cv::Mat mat1_roi;
|
|
||||||
cv::Mat mat2_roi;
|
|
||||||
cv::Mat mat3_roi;
|
|
||||||
cv::Mat mat4_roi;
|
|
||||||
|
|
||||||
//dst mat with roi
|
|
||||||
cv::Mat dst_roi;
|
|
||||||
//std::vector<cv::ocl::Info> oclinfo;
|
|
||||||
//ocl dst mat for testing
|
|
||||||
cv::ocl::oclMat gdst_whole;
|
|
||||||
|
|
||||||
//ocl mat with roi
|
|
||||||
cv::ocl::oclMat gmat1;
|
|
||||||
cv::ocl::oclMat gmat2;
|
|
||||||
cv::ocl::oclMat gmat3;
|
|
||||||
cv::ocl::oclMat gmat4;
|
|
||||||
cv::ocl::oclMat gdst;
|
|
||||||
|
|
||||||
virtual void SetUp()
|
|
||||||
{
|
{
|
||||||
type = GET_PARAM(0);
|
for (size_t j = 0; j < sizeof(all_type) / sizeof(int); j++)
|
||||||
channels = GET_PARAM(1);
|
|
||||||
|
|
||||||
cv::RNG &rng = TS::ptr()->get_rng();
|
|
||||||
cv::Size size(MWIDTH, MHEIGHT);
|
|
||||||
|
|
||||||
mat1 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false);
|
|
||||||
mat2 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false);
|
|
||||||
mat3 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false);
|
|
||||||
mat4 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false);
|
|
||||||
dst = randomMat(rng, size, CV_MAKETYPE(type, channels), 5, 16, false);
|
|
||||||
//int devnums = getDevice(oclinfo);
|
|
||||||
//CV_Assert(devnums > 0);
|
|
||||||
////if you want to use undefault device, set it here
|
|
||||||
////setDevice(oclinfo[0]);
|
|
||||||
//setBinpath(CLBINPATH);
|
|
||||||
}
|
|
||||||
void Has_roi(int b)
|
|
||||||
{
|
{
|
||||||
//cv::RNG& rng = TS::ptr()->get_rng();
|
SUBTEST << size << 'x' << size << "; " << type_name[j] ;
|
||||||
if(b)
|
Size size1 = Size(size, size);
|
||||||
|
std::vector<Mat> src(channels);
|
||||||
|
|
||||||
|
for (int i = 0; i < channels; ++i)
|
||||||
{
|
{
|
||||||
//randomize ROI
|
src[i] = Mat(size1, all_type[j], cv::Scalar::all(i));
|
||||||
roicols = mat1.cols - 1; //start
|
|
||||||
roirows = mat1.rows - 1;
|
|
||||||
src1x = 1;
|
|
||||||
src1y = 1;
|
|
||||||
src2x = 1;
|
|
||||||
src2y = 1;
|
|
||||||
src3x = 1;
|
|
||||||
src3y = 1;
|
|
||||||
src4x = 1;
|
|
||||||
src4y = 1;
|
|
||||||
dstx = 1;
|
|
||||||
dsty = 1;
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
roicols = mat1.cols;
|
|
||||||
roirows = mat1.rows;
|
|
||||||
src1x = 0;
|
|
||||||
src1y = 0;
|
|
||||||
src2x = 0;
|
|
||||||
src2y = 0;
|
|
||||||
src3x = 0;
|
|
||||||
src3y = 0;
|
|
||||||
src4x = 0;
|
|
||||||
src4y = 0;
|
|
||||||
dstx = 0;
|
|
||||||
dsty = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
|
|
||||||
mat2_roi = mat2(Rect(src2x, src2y, roicols, roirows));
|
|
||||||
mat3_roi = mat3(Rect(src3x, src3y, roicols, roirows));
|
|
||||||
mat4_roi = mat4(Rect(src4x, src4y, roicols, roirows));
|
|
||||||
|
|
||||||
|
|
||||||
dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
merge(src, dst);
|
||||||
|
|
||||||
struct Merge : MergeTestBase {};
|
CPU_ON;
|
||||||
|
merge(src, dst);
|
||||||
|
CPU_OFF;
|
||||||
|
|
||||||
TEST_P(Merge, Accuracy)
|
std::vector<ocl::oclMat> d_src(channels);
|
||||||
{
|
|
||||||
#ifndef PRINT_KERNEL_RUN_TIME
|
for (int i = 0; i < channels; ++i)
|
||||||
double totalcputick = 0;
|
|
||||||
double totalgputick = 0;
|
|
||||||
double totalgputick_kernel = 0;
|
|
||||||
double t0 = 0;
|
|
||||||
double t1 = 0;
|
|
||||||
double t2 = 0;
|
|
||||||
for(int k = LOOPROISTART; k < LOOPROIEND; k++)
|
|
||||||
{
|
{
|
||||||
totalcputick = 0;
|
d_src[i] = ocl::oclMat(size1, all_type[j], cv::Scalar::all(i));
|
||||||
totalgputick = 0;
|
}
|
||||||
totalgputick_kernel = 0;
|
|
||||||
for(int j = 0; j < LOOP_TIMES + 1; j ++)
|
WARMUP_ON;
|
||||||
|
ocl::merge(d_src, d_dst);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
ocl::merge(d_src, d_dst);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
|
||||||
|
for (int i = 0; i < channels; ++i)
|
||||||
{
|
{
|
||||||
Has_roi(k);
|
d_src[i] = ocl::oclMat(size1, CV_8U, cv::Scalar::all(i));
|
||||||
std::vector<cv::Mat> dev_src;
|
}
|
||||||
dev_src.push_back(mat1_roi);
|
|
||||||
dev_src.push_back(mat2_roi);
|
|
||||||
dev_src.push_back(mat3_roi);
|
|
||||||
dev_src.push_back(mat4_roi);
|
|
||||||
t0 = (double)cvGetTickCount();//cpu start
|
|
||||||
cv::merge(dev_src, dst_roi);
|
|
||||||
t0 = (double)cvGetTickCount() - t0;//cpu end
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount();//gpu start1 ]
|
ocl::merge(d_src, d_dst);
|
||||||
gmat1 = mat1_roi;
|
d_dst.download(dst);
|
||||||
gmat2 = mat2_roi;
|
GPU_FULL_OFF;
|
||||||
gmat3 = mat3_roi;
|
}
|
||||||
gmat4 = mat4_roi;
|
|
||||||
gdst_whole = dst;
|
|
||||||
gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
|
|
||||||
std::vector<cv::ocl::oclMat> dev_gsrc;
|
|
||||||
dev_gsrc.push_back(gmat1);
|
|
||||||
dev_gsrc.push_back(gmat2);
|
|
||||||
dev_gsrc.push_back(gmat3);
|
|
||||||
dev_gsrc.push_back(gmat4);
|
|
||||||
t2 = (double)cvGetTickCount(); //kernel
|
|
||||||
cv::ocl::merge(dev_gsrc, gdst);
|
|
||||||
t2 = (double)cvGetTickCount() - t2;//kernel
|
|
||||||
cv::Mat cpu_dst;
|
|
||||||
gdst_whole.download (cpu_dst);//download
|
|
||||||
t1 = (double)cvGetTickCount() - t1;//gpu end1
|
|
||||||
|
|
||||||
if(j == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
totalgputick = t1 + totalgputick;
|
|
||||||
totalcputick = t0 + totalcputick;
|
|
||||||
totalgputick_kernel = t2 + totalgputick_kernel;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
if(k == 0)
|
|
||||||
{
|
|
||||||
cout << "no roi\n";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cout << "with roi\n";
|
|
||||||
};
|
|
||||||
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
|
|
||||||
{
|
|
||||||
Has_roi(j);
|
|
||||||
gmat1 = mat1_roi;
|
|
||||||
gmat2 = mat2_roi;
|
|
||||||
gmat3 = mat3_roi;
|
|
||||||
gmat4 = mat4_roi;
|
|
||||||
gdst_whole = dst;
|
|
||||||
gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
|
|
||||||
std::vector<cv::ocl::oclMat> dev_gsrc;
|
|
||||||
dev_gsrc.push_back(gmat1);
|
|
||||||
dev_gsrc.push_back(gmat2);
|
|
||||||
dev_gsrc.push_back(gmat3);
|
|
||||||
dev_gsrc.push_back(gmat4);
|
|
||||||
|
|
||||||
if(j == 0)
|
|
||||||
{
|
|
||||||
cout << "no roi:";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cout << "\nwith roi:";
|
|
||||||
};
|
|
||||||
cv::ocl::merge(dev_gsrc, gdst);
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////// Split////////////////////////
|
||||||
PARAM_TEST_CASE(SplitTestBase, MatType, int)
|
TEST(Split)
|
||||||
{
|
{
|
||||||
int type;
|
//int channels = 4;
|
||||||
int channels;
|
int all_type[] = {CV_8UC1, CV_32FC1};
|
||||||
|
std::string type_name[] = {"CV_8UC1", "CV_32FC1"};
|
||||||
|
|
||||||
//src mat
|
for (int size = Min_Size; size <= Max_Size; size *= Multiple)
|
||||||
cv::Mat mat;
|
|
||||||
|
|
||||||
//dstmat
|
|
||||||
cv::Mat dst1;
|
|
||||||
cv::Mat dst2;
|
|
||||||
cv::Mat dst3;
|
|
||||||
cv::Mat dst4;
|
|
||||||
|
|
||||||
// set up roi
|
|
||||||
int roicols;
|
|
||||||
int roirows;
|
|
||||||
int srcx;
|
|
||||||
int srcy;
|
|
||||||
int dst1x;
|
|
||||||
int dst1y;
|
|
||||||
int dst2x;
|
|
||||||
int dst2y;
|
|
||||||
int dst3x;
|
|
||||||
int dst3y;
|
|
||||||
int dst4x;
|
|
||||||
int dst4y;
|
|
||||||
|
|
||||||
//src mat with roi
|
|
||||||
cv::Mat mat_roi;
|
|
||||||
|
|
||||||
//dst mat with roi
|
|
||||||
cv::Mat dst1_roi;
|
|
||||||
cv::Mat dst2_roi;
|
|
||||||
cv::Mat dst3_roi;
|
|
||||||
cv::Mat dst4_roi;
|
|
||||||
//std::vector<cv::ocl::Info> oclinfo;
|
|
||||||
//ocl dst mat for testing
|
|
||||||
cv::ocl::oclMat gdst1_whole;
|
|
||||||
cv::ocl::oclMat gdst2_whole;
|
|
||||||
cv::ocl::oclMat gdst3_whole;
|
|
||||||
cv::ocl::oclMat gdst4_whole;
|
|
||||||
|
|
||||||
//ocl mat with roi
|
|
||||||
cv::ocl::oclMat gmat;
|
|
||||||
cv::ocl::oclMat gdst1;
|
|
||||||
cv::ocl::oclMat gdst2;
|
|
||||||
cv::ocl::oclMat gdst3;
|
|
||||||
cv::ocl::oclMat gdst4;
|
|
||||||
|
|
||||||
virtual void SetUp()
|
|
||||||
{
|
{
|
||||||
type = GET_PARAM(0);
|
for (size_t j = 0; j < sizeof(all_type) / sizeof(int); j++)
|
||||||
channels = GET_PARAM(1);
|
{
|
||||||
|
SUBTEST << size << 'x' << size << "; " << type_name[j];
|
||||||
|
Size size1 = Size(size, size);
|
||||||
|
|
||||||
cv::RNG &rng = TS::ptr()->get_rng();
|
Mat src(size1, CV_MAKE_TYPE(all_type[j], 4), cv::Scalar(1, 2, 3, 4));
|
||||||
cv::Size size(MWIDTH, MHEIGHT);
|
|
||||||
|
|
||||||
mat = randomMat(rng, size, CV_MAKETYPE(type, channels), 5, 16, false);
|
std::vector<cv::Mat> dst;
|
||||||
dst1 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false);
|
|
||||||
dst2 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false);
|
split(src, dst);
|
||||||
dst3 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false);
|
|
||||||
dst4 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false);
|
CPU_ON;
|
||||||
//int devnums = getDevice(oclinfo);
|
split(src, dst);
|
||||||
//CV_Assert(devnums > 0);
|
CPU_OFF;
|
||||||
////if you want to use undefault device, set it here
|
|
||||||
////setDevice(oclinfo[0]);
|
ocl::oclMat d_src(size1, CV_MAKE_TYPE(all_type[j], 4), cv::Scalar(1, 2, 3, 4));
|
||||||
//setBinpath(CLBINPATH);
|
std::vector<cv::ocl::oclMat> d_dst;
|
||||||
|
|
||||||
|
WARMUP_ON;
|
||||||
|
ocl::split(d_src, d_dst);
|
||||||
|
WARMUP_OFF;
|
||||||
|
|
||||||
|
GPU_ON;
|
||||||
|
ocl::split(d_src, d_dst);
|
||||||
|
;
|
||||||
|
GPU_OFF;
|
||||||
|
|
||||||
|
GPU_FULL_ON;
|
||||||
|
d_src.upload(src);
|
||||||
|
ocl::split(d_src, d_dst);
|
||||||
|
GPU_FULL_OFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Has_roi(int b)
|
|
||||||
{
|
|
||||||
//cv::RNG& rng = TS::ptr()->get_rng();
|
|
||||||
if(b)
|
|
||||||
{
|
|
||||||
//randomize ROI
|
|
||||||
roicols = mat.cols - 1; //start
|
|
||||||
roirows = mat.rows - 1;
|
|
||||||
srcx = 1;
|
|
||||||
srcx = 1;
|
|
||||||
dst1x = 1;
|
|
||||||
dst1y = 1;
|
|
||||||
dst2x = 1;
|
|
||||||
dst2y = 1;
|
|
||||||
dst3x = 1;
|
|
||||||
dst3y = 1;
|
|
||||||
dst4x = 1;
|
|
||||||
dst4y = 1;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
roicols = mat.cols;
|
|
||||||
roirows = mat.rows;
|
|
||||||
srcx = 0;
|
|
||||||
srcy = 0;
|
|
||||||
dst1x = 0;
|
|
||||||
dst1y = 0;
|
|
||||||
dst2x = 0;
|
|
||||||
dst2y = 0;
|
|
||||||
dst3x = 0;
|
|
||||||
dst3y = 0;
|
|
||||||
dst4x = 0;
|
|
||||||
dst4y = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
mat_roi = mat(Rect(srcx, srcy, roicols, roirows));
|
|
||||||
|
|
||||||
dst1_roi = dst1(Rect(dst1x, dst1y, roicols, roirows));
|
|
||||||
dst2_roi = dst2(Rect(dst2x, dst2y, roicols, roirows));
|
|
||||||
dst3_roi = dst3(Rect(dst3x, dst3y, roicols, roirows));
|
|
||||||
dst4_roi = dst4(Rect(dst4x, dst4y, roicols, roirows));
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Split : SplitTestBase {};
|
|
||||||
|
|
||||||
TEST_P(Split, Accuracy)
|
|
||||||
{
|
|
||||||
#ifndef PRINT_KERNEL_RUN_TIME
|
|
||||||
double totalcputick = 0;
|
|
||||||
double totalgputick = 0;
|
|
||||||
double totalgputick_kernel = 0;
|
|
||||||
double t0 = 0;
|
|
||||||
double t1 = 0;
|
|
||||||
double t2 = 0;
|
|
||||||
for(int k = LOOPROISTART; k < LOOPROIEND; k++)
|
|
||||||
{
|
|
||||||
totalcputick = 0;
|
|
||||||
totalgputick = 0;
|
|
||||||
totalgputick_kernel = 0;
|
|
||||||
for(int j = 0; j < LOOP_TIMES + 1; j ++)
|
|
||||||
{
|
|
||||||
Has_roi(k);
|
|
||||||
cv::Mat dev_dst[4] = {dst1_roi, dst2_roi, dst3_roi, dst4_roi};
|
|
||||||
cv::ocl::oclMat dev_gdst[4] = {gdst1, gdst2, gdst3, gdst4};
|
|
||||||
t0 = (double)cvGetTickCount();//cpu start
|
|
||||||
cv::split(mat_roi, dev_dst);
|
|
||||||
t0 = (double)cvGetTickCount() - t0;//cpu end
|
|
||||||
|
|
||||||
t1 = (double)cvGetTickCount();//gpu start1
|
|
||||||
gdst1_whole = dst1;
|
|
||||||
gdst1 = gdst1_whole(Rect(dst1x, dst1y, roicols, roirows));
|
|
||||||
|
|
||||||
gdst2_whole = dst2;
|
|
||||||
gdst2 = gdst2_whole(Rect(dst2x, dst2y, roicols, roirows));
|
|
||||||
|
|
||||||
gdst3_whole = dst3;
|
|
||||||
gdst3 = gdst3_whole(Rect(dst3x, dst3y, roicols, roirows));
|
|
||||||
|
|
||||||
gdst4_whole = dst4;
|
|
||||||
gdst4 = gdst4_whole(Rect(dst4x, dst4y, roicols, roirows));
|
|
||||||
|
|
||||||
gmat = mat_roi;
|
|
||||||
t2 = (double)cvGetTickCount(); //kernel
|
|
||||||
cv::ocl::split(gmat, dev_gdst);
|
|
||||||
t2 = (double)cvGetTickCount() - t2;//kernel
|
|
||||||
cv::Mat cpu_dst1;
|
|
||||||
cv::Mat cpu_dst2;
|
|
||||||
cv::Mat cpu_dst3;
|
|
||||||
cv::Mat cpu_dst4;
|
|
||||||
gdst1_whole.download(cpu_dst1);
|
|
||||||
gdst2_whole.download(cpu_dst2);
|
|
||||||
gdst3_whole.download(cpu_dst3);
|
|
||||||
gdst4_whole.download(cpu_dst4);
|
|
||||||
t1 = (double)cvGetTickCount() - t1;//gpu end1
|
|
||||||
if(j == 0)
|
|
||||||
continue;
|
|
||||||
totalgputick = t1 + totalgputick;
|
|
||||||
totalcputick = t0 + totalcputick;
|
|
||||||
totalgputick_kernel = t2 + totalgputick_kernel;
|
|
||||||
|
|
||||||
}
|
|
||||||
if(k == 0)
|
|
||||||
{
|
|
||||||
cout << "no roi\n";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cout << "with roi\n";
|
|
||||||
};
|
|
||||||
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
|
|
||||||
{
|
|
||||||
Has_roi(j);
|
|
||||||
//cv::Mat dev_dst[4] = {dst1_roi, dst2_roi, dst3_roi, dst4_roi};
|
|
||||||
cv::ocl::oclMat dev_gdst[4] = {gdst1, gdst2, gdst3, gdst4};
|
|
||||||
gdst1_whole = dst1;
|
|
||||||
gdst1 = gdst1_whole(Rect(dst1x, dst1y, roicols, roirows));
|
|
||||||
|
|
||||||
gdst2_whole = dst2;
|
|
||||||
gdst2 = gdst2_whole(Rect(dst2x, dst2y, roicols, roirows));
|
|
||||||
|
|
||||||
gdst3_whole = dst3;
|
|
||||||
gdst3 = gdst3_whole(Rect(dst3x, dst3y, roicols, roirows));
|
|
||||||
|
|
||||||
gdst4_whole = dst4;
|
|
||||||
gdst4 = gdst4_whole(Rect(dst4x, dst4y, roicols, roirows));
|
|
||||||
gmat = mat_roi;
|
|
||||||
if(j == 0)
|
|
||||||
{
|
|
||||||
cout << "no roi:";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cout << "\nwith roi:";
|
|
||||||
};
|
|
||||||
cv::ocl::split(gmat, dev_gdst);
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//*************test*****************
|
|
||||||
INSTANTIATE_TEST_CASE_P(SplitMerge, Merge, Combine(
|
|
||||||
Values(CV_8UC4, CV_32FC4), Values(1, 4)));
|
|
||||||
|
|
||||||
INSTANTIATE_TEST_CASE_P(SplitMerge, Split , Combine(
|
|
||||||
Values(CV_8U, CV_32S, CV_32F), Values(1, 4)));
|
|
||||||
|
|
||||||
#endif // HAVE_OPENCL
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user