merged the trunk r8735:8766, r8769, r8777:8780, r8790 and r8800:8811
This commit is contained in:
parent
b156e2f7ed
commit
162f9fd7ea
9
3rdparty/zlib/CMakeLists.txt
vendored
9
3rdparty/zlib/CMakeLists.txt
vendored
@ -8,6 +8,7 @@ project(${ZLIB_LIBRARY} C)
|
|||||||
include(CheckFunctionExists)
|
include(CheckFunctionExists)
|
||||||
include(CheckIncludeFile)
|
include(CheckIncludeFile)
|
||||||
include(CheckCSourceCompiles)
|
include(CheckCSourceCompiles)
|
||||||
|
include(CheckTypeSize)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Check for fseeko
|
# Check for fseeko
|
||||||
@ -27,6 +28,14 @@ if(MSVC)
|
|||||||
add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
|
add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
#
|
||||||
|
# Check to see if we have large file support
|
||||||
|
#
|
||||||
|
check_type_size(off64_t OFF64_T)
|
||||||
|
if(HAVE_OFF64_T)
|
||||||
|
add_definitions(-D_LARGEFILE64_SOURCE=1)
|
||||||
|
endif()
|
||||||
|
|
||||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.cmakein"
|
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.cmakein"
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/zconf.h" @ONLY)
|
"${CMAKE_CURRENT_BINARY_DIR}/zconf.h" @ONLY)
|
||||||
ocv_include_directories("${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}")
|
ocv_include_directories("${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
|
@ -116,14 +116,14 @@ OCV_OPTION(WITH_CUDA "Include NVidia Cuda Runtime support" ON
|
|||||||
OCV_OPTION(WITH_CUFFT "Include NVidia Cuda Fast Fourier Transform (FFT) library support" ON IF (CMAKE_VERSION VERSION_GREATER "2.8" AND NOT ANDROID AND NOT IOS) )
|
OCV_OPTION(WITH_CUFFT "Include NVidia Cuda Fast Fourier Transform (FFT) library support" ON IF (CMAKE_VERSION VERSION_GREATER "2.8" AND NOT ANDROID AND NOT IOS) )
|
||||||
OCV_OPTION(WITH_EIGEN "Include Eigen2/Eigen3 support" ON)
|
OCV_OPTION(WITH_EIGEN "Include Eigen2/Eigen3 support" ON)
|
||||||
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 AND NOT IOS) )
|
OCV_OPTION(WITH_GSTREAMER "Include Gstreamer support" ON IF (UNIX AND NOT APPLE AND NOT ANDROID) )
|
||||||
OCV_OPTION(WITH_GTK "Include GTK support" ON IF (UNIX AND NOT APPLE AND NOT ANDROID AND NOT IOS) )
|
OCV_OPTION(WITH_GTK "Include GTK support" ON IF (UNIX AND NOT APPLE AND NOT ANDROID) )
|
||||||
OCV_OPTION(WITH_IMAGEIO "ImageIO support for OS X" OFF IF APPLE)
|
OCV_OPTION(WITH_IMAGEIO "ImageIO support for OS X" OFF IF APPLE)
|
||||||
OCV_OPTION(WITH_IPP "Include Intel IPP support" OFF IF (MSVC OR X86 OR X86_64) )
|
OCV_OPTION(WITH_IPP "Include Intel IPP support" OFF IF (MSVC OR X86 OR X86_64) )
|
||||||
OCV_OPTION(WITH_JASPER "Include JPEG2K support" ON IF (NOT IOS) )
|
OCV_OPTION(WITH_JASPER "Include JPEG2K support" ON IF (NOT IOS) )
|
||||||
OCV_OPTION(WITH_JPEG "Include JPEG support" ON IF (NOT IOS) )
|
OCV_OPTION(WITH_JPEG "Include JPEG support" ON IF (NOT IOS) )
|
||||||
OCV_OPTION(WITH_OPENEXR "Include ILM support via OpenEXR" ON IF (NOT IOS) )
|
OCV_OPTION(WITH_OPENEXR "Include ILM support via OpenEXR" ON IF (NOT IOS) )
|
||||||
OCV_OPTION(WITH_OPENGL "Include OpenGL support" OFF IF (NOT ANDROID AND NOT IOS AND NOT APPLE) )
|
OCV_OPTION(WITH_OPENGL "Include OpenGL support" OFF IF (NOT ANDROID AND NOT APPLE) )
|
||||||
OCV_OPTION(WITH_OPENNI "Include OpenNI support" OFF IF (NOT ANDROID AND NOT IOS) )
|
OCV_OPTION(WITH_OPENNI "Include OpenNI support" OFF IF (NOT ANDROID AND NOT IOS) )
|
||||||
OCV_OPTION(WITH_PNG "Include PNG support" ON IF (NOT IOS) )
|
OCV_OPTION(WITH_PNG "Include PNG support" ON IF (NOT IOS) )
|
||||||
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) )
|
||||||
@ -131,10 +131,10 @@ OCV_OPTION(WITH_QT "Build with Qt Backend support" OFF
|
|||||||
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_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 AND NOT IOS) )
|
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 APPLE AND NOT ANDROID AND NOT IOS) )
|
OCV_OPTION(WITH_V4L "Include Video 4 Linux support" ON IF (UNIX AND NOT APPLE AND NOT ANDROID) )
|
||||||
OCV_OPTION(WITH_VIDEOINPUT "Build HighGUI with DirectShow support" ON IF WIN32 )
|
OCV_OPTION(WITH_VIDEOINPUT "Build HighGUI with DirectShow support" ON IF WIN32 )
|
||||||
OCV_OPTION(WITH_XIMEA "Include XIMEA cameras support" OFF IF WIN32 )
|
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 AND NOT IOS) )
|
OCV_OPTION(WITH_XINE "Include Xine support (GPL)" OFF IF (UNIX AND NOT APPLE AND NOT ANDROID AND NOT IOS) )
|
||||||
|
|
||||||
# OpenCV build components
|
# OpenCV build components
|
||||||
@ -149,8 +149,14 @@ OCV_OPTION(BUILD_TESTS "Build accuracy & regression tests"
|
|||||||
OCV_OPTION(BUILD_WITH_DEBUG_INFO "Include debug info into debug libs (not MSCV only)" ON )
|
OCV_OPTION(BUILD_WITH_DEBUG_INFO "Include debug info into debug libs (not MSCV only)" ON )
|
||||||
OCV_OPTION(BUILD_WITH_STATIC_CRT "Enables use of staticaly linked CRT for staticaly linked OpenCV" ON IF MSVC )
|
OCV_OPTION(BUILD_WITH_STATIC_CRT "Enables use of staticaly linked CRT for staticaly linked OpenCV" ON IF MSVC )
|
||||||
OCV_OPTION(BUILD_FAT_JAVA_LIB "Create fat java wrapper containing the whole OpenCV library" ON IF ANDROID AND NOT BUILD_SHARED_LIBS AND CMAKE_COMPILER_IS_GNUCXX )
|
OCV_OPTION(BUILD_FAT_JAVA_LIB "Create fat java wrapper containing the whole OpenCV library" ON IF ANDROID AND NOT BUILD_SHARED_LIBS AND CMAKE_COMPILER_IS_GNUCXX )
|
||||||
OCV_OPTION(BUILD_ANDROID_SERVICE "TBD" OFF IF ANDROID )
|
OCV_OPTION(BUILD_ANDROID_SERVICE "TBD" OFF IF ANDROID AND ANDROID_USE_STLPORT AND ANDROID_SOURCE_TREE )
|
||||||
OCV_OPTION(BUILD_ANDROID_PACKAGE "TBD" OFF IF ANDROID )
|
|
||||||
|
if(DEFINED BUILD_opencv_nonfree AND NOT BUILD_opencv_nonfree)
|
||||||
|
OCV_OPTION(BUILD_ANDROID_PACKAGE "TBD" OFF IF ANDROID )
|
||||||
|
else()
|
||||||
|
unset(BUILD_ANDROID_PACKAGE CACHE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
# 3rd party libs
|
# 3rd party libs
|
||||||
OCV_OPTION(BUILD_ZLIB "Build zlib from source" WIN32 OR IOS OR APPLE )
|
OCV_OPTION(BUILD_ZLIB "Build zlib from source" WIN32 OR IOS OR APPLE )
|
||||||
@ -332,15 +338,6 @@ if(UNIX)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
#
|
|
||||||
# Check to see if we have large file support (needed by zlib)
|
|
||||||
#
|
|
||||||
include(CheckTypeSize)
|
|
||||||
check_type_size(off64_t OFF64_T)
|
|
||||||
if(HAVE_OFF64_T)
|
|
||||||
add_definitions(-D_LARGEFILE64_SOURCE=1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(cmake/OpenCVPCHSupport.cmake REQUIRED)
|
include(cmake/OpenCVPCHSupport.cmake REQUIRED)
|
||||||
include(cmake/OpenCVModule.cmake REQUIRED)
|
include(cmake/OpenCVModule.cmake REQUIRED)
|
||||||
|
|
||||||
@ -530,7 +527,7 @@ if(ANDROID)
|
|||||||
endif()
|
endif()
|
||||||
status(" android tool:" ANDROID_EXECUTABLE THEN "${ANDROID_EXECUTABLE} (${ANDROID_TOOLS_Pkg_Desc})" ELSE NO)
|
status(" android tool:" ANDROID_EXECUTABLE THEN "${ANDROID_EXECUTABLE} (${ANDROID_TOOLS_Pkg_Desc})" ELSE NO)
|
||||||
status(" ant:" ANT_EXECUTABLE THEN "${ANT_EXECUTABLE} (ver ${ANT_VERSION})" ELSE NO)
|
status(" ant:" ANT_EXECUTABLE THEN "${ANT_EXECUTABLE} (ver ${ANT_VERSION})" ELSE NO)
|
||||||
status(" Build service:" BUILD_ANDROID_SERVICE THEN YES ELSE NO)
|
status(" Google Play package:" BUILD_ANDROID_PACKAGE THEN YES ELSE NO)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ========================== GUI ==========================
|
# ========================== GUI ==========================
|
||||||
|
@ -2,14 +2,13 @@ set(engine OpenCVEngine)
|
|||||||
set(JNI_LIB_NAME ${engine} ${engine}_jni)
|
set(JNI_LIB_NAME ${engine} ${engine}_jni)
|
||||||
add_android_project(opencv_engine "${CMAKE_CURRENT_SOURCE_DIR}" SDK_TARGET 8 ${ANDROID_SDK_TARGET} IGNORE_JAVA ON)
|
add_android_project(opencv_engine "${CMAKE_CURRENT_SOURCE_DIR}" SDK_TARGET 8 ${ANDROID_SDK_TARGET} IGNORE_JAVA ON)
|
||||||
|
|
||||||
link_directories("${ANDROID_SOURCE_TREE}/out/target/product/generic/system/lib" "${ANDROID_SOURCE_TREE}/bin_${ANDROID_ARCH_NAME}/system/lib")
|
link_directories("${ANDROID_SOURCE_TREE}/out/target/product/generic/system/lib" "${ANDROID_SOURCE_TREE}/out/target/product/${ANDROID_PRODUCT}/system/lib" "${ANDROID_SOURCE_TREE}/bin_${ANDROID_ARCH_NAME}/system/lib")
|
||||||
|
|
||||||
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-allow-shlib-undefined")
|
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-allow-shlib-undefined")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
file(GLOB engine_files "jni/BinderComponent/*.cpp" "jni/BinderComponent/*.h" "jni/include/*.h")
|
file(GLOB engine_files "jni/BinderComponent/*.cpp" "jni/BinderComponent/*.h" "jni/include/*.h")
|
||||||
|
|
||||||
include_directories(jni/BinderComponent jni/include "${ANDROID_SOURCE_TREE}/frameworks/base/include" "${ANDROID_SOURCE_TREE}/system/core/include")
|
include_directories(jni/BinderComponent jni/include)
|
||||||
|
include_directories(SYSTEM "${ANDROID_SOURCE_TREE}/frameworks/base/include" "${ANDROID_SOURCE_TREE}/system/core/include")
|
||||||
add_library(${engine} SHARED ${engine_files})
|
add_library(${engine} SHARED ${engine_files})
|
||||||
target_link_libraries(${engine} z binder log utils)
|
target_link_libraries(${engine} z binder log utils)
|
||||||
|
|
||||||
|
@ -278,8 +278,6 @@ macro(add_android_project target path)
|
|||||||
get_target_property(android_proj_jni_location "${JNI_LIB_NAME}" LOCATION)
|
get_target_property(android_proj_jni_location "${JNI_LIB_NAME}" LOCATION)
|
||||||
add_custom_command(TARGET ${JNI_LIB_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} --strip-unneeded "${android_proj_jni_location}")
|
add_custom_command(TARGET ${JNI_LIB_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} --strip-unneeded "${android_proj_jni_location}")
|
||||||
endif()
|
endif()
|
||||||
else()
|
|
||||||
unset(JNI_LIB_NAME)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# build java part
|
# build java part
|
||||||
@ -302,6 +300,8 @@ macro(add_android_project target path)
|
|||||||
DEPENDS ${android_proj_file_deps} ${JNI_LIB_NAME})
|
DEPENDS ${android_proj_file_deps} ${JNI_LIB_NAME})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
unset(JNI_LIB_NAME)
|
||||||
|
|
||||||
add_custom_target(${target} ALL SOURCES "${android_proj_bin_dir}/bin/${target}-debug.apk" )
|
add_custom_target(${target} ALL SOURCES "${android_proj_bin_dir}/bin/${target}-debug.apk" )
|
||||||
if(NOT android_proj_IGNORE_JAVA)
|
if(NOT android_proj_IGNORE_JAVA)
|
||||||
add_dependencies(${target} opencv_java)
|
add_dependencies(${target} opencv_java)
|
||||||
|
@ -30,7 +30,11 @@ if(PYTHON_EXECUTABLE)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT ANDROID AND NOT IOS)
|
if(NOT ANDROID AND NOT IOS)
|
||||||
find_host_package(PythonLibs ${PYTHON_VERSION_FULL})
|
if(CMAKE_VERSION VERSION_GREATER 2.8.8)
|
||||||
|
find_host_package(PythonLibs ${PYTHON_VERSION_FULL} EXACT)
|
||||||
|
else()
|
||||||
|
find_host_package(PythonLibs ${PYTHON_VERSION_FULL})
|
||||||
|
endif()
|
||||||
# cmake 2.4 (at least on Ubuntu 8.04 (hardy)) don't define PYTHONLIBS_FOUND
|
# cmake 2.4 (at least on Ubuntu 8.04 (hardy)) don't define PYTHONLIBS_FOUND
|
||||||
if(NOT PYTHONLIBS_FOUND AND PYTHON_INCLUDE_PATH)
|
if(NOT PYTHONLIBS_FOUND AND PYTHON_INCLUDE_PATH)
|
||||||
set(PYTHONLIBS_FOUND ON)
|
set(PYTHONLIBS_FOUND ON)
|
||||||
|
@ -7,11 +7,11 @@ if(BUILD_ZLIB)
|
|||||||
ocv_clear_vars(ZLIB_FOUND)
|
ocv_clear_vars(ZLIB_FOUND)
|
||||||
else()
|
else()
|
||||||
include(FindZLIB)
|
include(FindZLIB)
|
||||||
|
if(ZLIB_VERSION_STRING)
|
||||||
|
#cmake 2.8.2 bug - it fails to determine zlib version
|
||||||
|
unset(ZLIB_VERSION_STRING CACHE)
|
||||||
|
endif()
|
||||||
if(ZLIB_FOUND)
|
if(ZLIB_FOUND)
|
||||||
if(ZLIB_VERSION_STRING)
|
|
||||||
#cmake 2.8.2 bug - it fails to determine zlib version
|
|
||||||
unset(ZLIB_VERSION_STRING CACHE)
|
|
||||||
endif()
|
|
||||||
ocv_parse_header2(ZLIB "${ZLIB_INCLUDE_DIR}/zlib.h" ZLIB_VERSION "")
|
ocv_parse_header2(ZLIB "${ZLIB_INCLUDE_DIR}/zlib.h" ZLIB_VERSION "")
|
||||||
endif()
|
endif()
|
||||||
if(ZLIB_FOUND AND ANDROID)
|
if(ZLIB_FOUND AND ANDROID)
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
# XIMEA_LIBRARY_DIR - XIMEA libraries folder
|
# XIMEA_LIBRARY_DIR - XIMEA libraries folder
|
||||||
#
|
#
|
||||||
# Created: 5 Aug 2011 by Marian Zajko (marian.zajko@ximea.com)
|
# Created: 5 Aug 2011 by Marian Zajko (marian.zajko@ximea.com)
|
||||||
|
# Updated: 25 June 2012 by Igor Kuzmin (parafin@ximea.com)
|
||||||
#
|
#
|
||||||
|
|
||||||
set(XIMEA_FOUND)
|
set(XIMEA_FOUND)
|
||||||
@ -20,10 +21,16 @@ if(WIN32)
|
|||||||
|
|
||||||
if(EXISTS XIMEA_PATH)
|
if(EXISTS XIMEA_PATH)
|
||||||
set(XIMEA_FOUND 1)
|
set(XIMEA_FOUND 1)
|
||||||
|
|
||||||
# set LIB folders
|
# set LIB folders
|
||||||
set(XIMEA_LIBRARY_DIR "${XIMEA_PATH}\\x86")
|
set(XIMEA_LIBRARY_DIR "${XIMEA_PATH}/x86")
|
||||||
|
else()
|
||||||
|
set(XIMEA_FOUND 0)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
if(EXISTS /opt/XIMEA)
|
||||||
|
set(XIMEA_FOUND 1)
|
||||||
|
# set folders
|
||||||
|
set(XIMEA_PATH /opt/XIMEA/include)
|
||||||
else()
|
else()
|
||||||
set(XIMEA_FOUND 0)
|
set(XIMEA_FOUND 0)
|
||||||
endif()
|
endif()
|
||||||
|
Binary file not shown.
After Width: | Height: | Size: 54 KiB |
Binary file not shown.
After Width: | Height: | Size: 57 KiB |
@ -2366,7 +2366,8 @@ void cvStereoRectify( const CvMat* _cameraMatrix1, const CvMat* _cameraMatrix2,
|
|||||||
// calculate global Z rotation
|
// calculate global Z rotation
|
||||||
cvCrossProduct(&t,&uu,&ww);
|
cvCrossProduct(&t,&uu,&ww);
|
||||||
double nw = cvNorm(&ww, 0, CV_L2);
|
double nw = cvNorm(&ww, 0, CV_L2);
|
||||||
cvConvertScale(&ww, &ww, acos(fabs(c)/nt)/nw);
|
if (nw > 0.0)
|
||||||
|
cvConvertScale(&ww, &ww, acos(fabs(c)/nt)/nw);
|
||||||
cvRodrigues2(&ww, &wR);
|
cvRodrigues2(&ww, &wR);
|
||||||
|
|
||||||
// apply to both views
|
// apply to both views
|
||||||
|
@ -1 +1 @@
|
|||||||
ocv_define_module(contrib opencv_imgproc opencv_calib3d opencv_features2d opencv_highgui opencv_ml opencv_video opencv_objdetect)
|
ocv_define_module(contrib opencv_imgproc opencv_calib3d opencv_features2d opencv_ml opencv_video opencv_objdetect OPTIONAL opencv_highgui)
|
||||||
|
@ -44,7 +44,10 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
#include "opencv2/highgui/highgui.hpp"
|
#include "opencv2/opencv_modules.hpp"
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
|
# include "opencv2/highgui/highgui.hpp"
|
||||||
|
#endif
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
|
||||||
@ -907,13 +910,16 @@ void ChamferMatcher::Template::show() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
circle(templ_color,Point(center.x + pad, center.y + pad),1,CV_RGB(0,255,0));
|
circle(templ_color,Point(center.x + pad, center.y + pad),1,CV_RGB(0,255,0));
|
||||||
|
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
namedWindow("templ",1);
|
namedWindow("templ",1);
|
||||||
imshow("templ",templ_color);
|
imshow("templ",templ_color);
|
||||||
|
|
||||||
cvWaitKey(0);
|
cvWaitKey(0);
|
||||||
|
#else
|
||||||
|
CV_Error(CV_StsNotImplemented, "OpenCV has been compiled without GUI support");
|
||||||
|
#endif
|
||||||
|
|
||||||
templ_color.release();
|
templ_color.release();
|
||||||
}
|
}
|
||||||
|
@ -39,10 +39,16 @@
|
|||||||
// 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*/
|
||||||
|
|
||||||
|
#define SHOW_DEBUG_IMAGES 0
|
||||||
|
|
||||||
#include "opencv2/core/core.hpp"
|
#include "opencv2/core/core.hpp"
|
||||||
#include "opencv2/calib3d/calib3d.hpp"
|
#include "opencv2/calib3d/calib3d.hpp"
|
||||||
|
|
||||||
#include "opencv2/highgui/highgui.hpp"
|
#if SHOW_DEBUG_IMAGES
|
||||||
|
# include "opencv2/highgui/highgui.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@ -58,7 +64,6 @@
|
|||||||
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
|
||||||
#define SHOW_DEBUG_IMAGES 0
|
|
||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
|
||||||
inline static
|
inline static
|
||||||
|
@ -588,11 +588,11 @@ GetSetElem
|
|||||||
----------
|
----------
|
||||||
Finds a set element by its index.
|
Finds a set element by its index.
|
||||||
|
|
||||||
.. ocv:cfunction:: CvSetElem* cvGetSetElem( const CvSet* set_header, int index )
|
.. ocv:cfunction:: CvSetElem* cvGetSetElem( const CvSet* set_header, int idx )
|
||||||
|
|
||||||
:param set_header: Set
|
:param set_header: Set
|
||||||
|
|
||||||
:param index: Index of the set element within a sequence
|
:param idx: Index of the set element within a sequence
|
||||||
|
|
||||||
The function finds a set element by its index. The function returns the pointer to it or 0 if the index is invalid or the corresponding node is free. The function supports negative indices as it uses
|
The function finds a set element by its index. The function returns the pointer to it or 0 if the index is invalid or the corresponding node is free. The function supports negative indices as it uses
|
||||||
:ocv:cfunc:`GetSeqElem`
|
:ocv:cfunc:`GetSeqElem`
|
||||||
|
@ -1491,7 +1491,9 @@ void MatOp_GEMM::multiply(const MatExpr& e, double s, MatExpr& res) const
|
|||||||
void MatOp_GEMM::transpose(const MatExpr& e, MatExpr& res) const
|
void MatOp_GEMM::transpose(const MatExpr& e, MatExpr& res) const
|
||||||
{
|
{
|
||||||
res = e;
|
res = e;
|
||||||
res.flags ^= CV_GEMM_A_T | CV_GEMM_B_T | CV_GEMM_C_T;
|
res.flags = (!(e.flags & CV_GEMM_A_T) ? CV_GEMM_B_T : 0) |
|
||||||
|
(!(e.flags & CV_GEMM_B_T) ? CV_GEMM_A_T : 0) |
|
||||||
|
(!(e.flags & CV_GEMM_C_T) ? CV_GEMM_C_T : 0);
|
||||||
swap(res.a, res.b);
|
swap(res.a, res.b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -473,20 +473,59 @@ string format( const char* fmt, ... )
|
|||||||
|
|
||||||
string tempfile( const char* suffix )
|
string tempfile( const char* suffix )
|
||||||
{
|
{
|
||||||
char buf[L_tmpnam];
|
#if defined WIN32 || defined _WIN32
|
||||||
char* name = 0;
|
char temp_dir[MAX_PATH + 1] = { 0 };
|
||||||
#ifdef ANDROID
|
char temp_file[MAX_PATH + 1] = { 0 };
|
||||||
strcpy(buf, "/sdcard/__opencv_temp_XXXXXX");
|
|
||||||
name = mktemp(buf);
|
::GetTempPathA(sizeof(temp_dir), temp_dir);
|
||||||
#else
|
if(0 == ::GetTempFileNameA(temp_dir, "__opencv_temp.", 0, temp_file))
|
||||||
name = tmpnam(buf);
|
return string();
|
||||||
#endif
|
|
||||||
if (*name == '\\')
|
string name = temp_file;
|
||||||
++name;
|
if(suffix)
|
||||||
string n(name);
|
{
|
||||||
if (suffix != 0)
|
if (suffix[0] != '.')
|
||||||
n += (n[n.size()-1] == '.' && suffix[0] == '.' ? suffix + 1 : suffix);
|
return name + "." + suffix;
|
||||||
return n;
|
else
|
||||||
|
return name + suffix;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return name;
|
||||||
|
# else
|
||||||
|
# ifdef ANDROID
|
||||||
|
//char defaultTemplate[] = "/mnt/sdcard/__opencv_temp.XXXXXX";
|
||||||
|
char defaultTemplate[] = "/data/local/tmp/__opencv_temp.XXXXXX";
|
||||||
|
# else
|
||||||
|
char defaultTemplate[] = "/tmp/__opencv_temp.XXXXXX";
|
||||||
|
# endif
|
||||||
|
|
||||||
|
string fname;
|
||||||
|
const char *temp_dir = getenv("OPENCV_TEMP_PATH");
|
||||||
|
if(temp_dir == 0 || temp_dir[0] == 0)
|
||||||
|
fname = defaultTemplate;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fname = temp_dir;
|
||||||
|
char ech = fname[fname.size() - 1];
|
||||||
|
if(ech != '/' && ech != '\\')
|
||||||
|
fname += "/";
|
||||||
|
fname += "__opencv_temp.XXXXXX";
|
||||||
|
}
|
||||||
|
|
||||||
|
const int fd = mkstemp((char*)fname.c_str());
|
||||||
|
if(fd == -1) return "";
|
||||||
|
close(fd);
|
||||||
|
remove(fname.c_str());
|
||||||
|
|
||||||
|
if(suffix)
|
||||||
|
{
|
||||||
|
if (suffix[0] != '.')
|
||||||
|
fname = fname + "." + suffix;
|
||||||
|
else
|
||||||
|
fname += suffix;
|
||||||
|
}
|
||||||
|
return fname;
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static CvErrorCallback customErrorCallback = 0;
|
static CvErrorCallback customErrorCallback = 0;
|
||||||
|
@ -560,7 +560,7 @@ static void inRange(const Mat& src, const Mat& lb, const Mat& rb, Mat& dst)
|
|||||||
NAryMatIterator it(arrays, planes);
|
NAryMatIterator it(arrays, planes);
|
||||||
size_t total = planes[0].total();
|
size_t total = planes[0].total();
|
||||||
size_t i, nplanes = it.nplanes;
|
size_t i, nplanes = it.nplanes;
|
||||||
int depth = src.depth(), cn = src.channels();
|
int depth = src.depth(), cn = src.channels();
|
||||||
|
|
||||||
for( i = 0; i < nplanes; i++, ++it )
|
for( i = 0; i < nplanes; i++, ++it )
|
||||||
{
|
{
|
||||||
@ -608,7 +608,7 @@ static void inRangeS(const Mat& src, const Scalar& lb, const Scalar& rb, Mat& ds
|
|||||||
NAryMatIterator it(arrays, planes);
|
NAryMatIterator it(arrays, planes);
|
||||||
size_t total = planes[0].total();
|
size_t total = planes[0].total();
|
||||||
size_t i, nplanes = it.nplanes;
|
size_t i, nplanes = it.nplanes;
|
||||||
int depth = src.depth(), cn = src.channels();
|
int depth = src.depth(), cn = src.channels();
|
||||||
union { double d[4]; float f[4]; int i[4];} lbuf, rbuf;
|
union { double d[4]; float f[4]; int i[4];} lbuf, rbuf;
|
||||||
int wtype = CV_MAKETYPE(depth <= CV_32S ? CV_32S : depth, cn);
|
int wtype = CV_MAKETYPE(depth <= CV_32S ? CV_32S : depth, cn);
|
||||||
scalarToRawData(lb, lbuf.d, wtype, cn);
|
scalarToRawData(lb, lbuf.d, wtype, cn);
|
||||||
@ -903,7 +903,7 @@ static void exp(const Mat& src, Mat& dst)
|
|||||||
NAryMatIterator it(arrays, planes);
|
NAryMatIterator it(arrays, planes);
|
||||||
size_t j, total = planes[0].total()*src.channels();
|
size_t j, total = planes[0].total()*src.channels();
|
||||||
size_t i, nplanes = it.nplanes;
|
size_t i, nplanes = it.nplanes;
|
||||||
int depth = src.depth();
|
int depth = src.depth();
|
||||||
|
|
||||||
for( i = 0; i < nplanes; i++, ++it )
|
for( i = 0; i < nplanes; i++, ++it )
|
||||||
{
|
{
|
||||||
@ -932,7 +932,7 @@ static void log(const Mat& src, Mat& dst)
|
|||||||
NAryMatIterator it(arrays, planes);
|
NAryMatIterator it(arrays, planes);
|
||||||
size_t j, total = planes[0].total()*src.channels();
|
size_t j, total = planes[0].total()*src.channels();
|
||||||
size_t i, nplanes = it.nplanes;
|
size_t i, nplanes = it.nplanes;
|
||||||
int depth = src.depth();
|
int depth = src.depth();
|
||||||
|
|
||||||
for( i = 0; i < nplanes; i++, ++it )
|
for( i = 0; i < nplanes; i++, ++it )
|
||||||
{
|
{
|
||||||
@ -1022,7 +1022,7 @@ static void cartToPolar(const Mat& mx, const Mat& my, Mat& mmag, Mat& mangle, bo
|
|||||||
NAryMatIterator it(arrays, planes);
|
NAryMatIterator it(arrays, planes);
|
||||||
size_t j, total = planes[0].total();
|
size_t j, total = planes[0].total();
|
||||||
size_t i, nplanes = it.nplanes;
|
size_t i, nplanes = it.nplanes;
|
||||||
int depth = mx.depth();
|
int depth = mx.depth();
|
||||||
double scale = angleInDegrees ? 180/CV_PI : 1;
|
double scale = angleInDegrees ? 180/CV_PI : 1;
|
||||||
|
|
||||||
for( i = 0; i < nplanes; i++, ++it )
|
for( i = 0; i < nplanes; i++, ++it )
|
||||||
@ -1364,7 +1364,7 @@ TEST_P(ElemWiseTest, accuracy)
|
|||||||
|
|
||||||
double maxErr = op->getMaxErr(depth);
|
double maxErr = op->getMaxErr(depth);
|
||||||
vector<int> pos;
|
vector<int> pos;
|
||||||
ASSERT_PRED_FORMAT2(cvtest::MatComparator(maxErr, op->context), dst0, dst) << "\nsrc[0] ~ " << cvtest::MatInfo(!src.empty() ? src[0] : Mat()) << "\ntestCase #" << testIdx << "\n";
|
ASSERT_PRED_FORMAT2(cvtest::MatComparator(maxErr, op->context), dst0, dst) << "\nsrc[0] ~ " << cvtest::MatInfo(!src.empty() ? src[0] : Mat()) << "\ntestCase #" << testIdx << "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -389,7 +389,8 @@ protected:
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
FileStorage fs("test.xml", FileStorage::WRITE);
|
string fname = cv::tempfile(".xml");
|
||||||
|
FileStorage fs(fname, FileStorage::WRITE);
|
||||||
vector<int> mi, mi2, mi3, mi4;
|
vector<int> mi, mi2, mi3, mi4;
|
||||||
vector<Mat> mv, mv2, mv3, mv4;
|
vector<Mat> mv, mv2, mv3, mv4;
|
||||||
Mat m(10, 9, CV_32F);
|
Mat m(10, 9, CV_32F);
|
||||||
@ -403,7 +404,7 @@ protected:
|
|||||||
fs << "mv3" << mv3;
|
fs << "mv3" << mv3;
|
||||||
fs << "empty" << empty;
|
fs << "empty" << empty;
|
||||||
fs.release();
|
fs.release();
|
||||||
fs.open("test.xml", FileStorage::READ);
|
fs.open(fname, FileStorage::READ);
|
||||||
fs["mi"] >> mi2;
|
fs["mi"] >> mi2;
|
||||||
fs["mv"] >> mv2;
|
fs["mv"] >> mv2;
|
||||||
fs["mi3"] >> mi4;
|
fs["mi3"] >> mi4;
|
||||||
@ -439,7 +440,7 @@ protected:
|
|||||||
int N = 1000, M = 1200000;
|
int N = 1000, M = 1200000;
|
||||||
Mat mat(M, N, CV_32F);
|
Mat mat(M, N, CV_32F);
|
||||||
rng.fill(mat, RNG::UNIFORM, 0, 1);
|
rng.fill(mat, RNG::UNIFORM, 0, 1);
|
||||||
FileStorage fs("test.xml", FileStorage::WRITE);
|
FileStorage fs(cv::tempfile(".xml"), FileStorage::WRITE);
|
||||||
fs << "mat" << mat;
|
fs << "mat" << mat;
|
||||||
fs.release();
|
fs.release();
|
||||||
}
|
}
|
||||||
|
@ -750,6 +750,21 @@ bool CV_OperationsTest::TestTemplateMat()
|
|||||||
if (Mat3w(1, 1).channels() != 3) throw test_excep();
|
if (Mat3w(1, 1).channels() != 3) throw test_excep();
|
||||||
if (Mat3s(1, 1).channels() != 3) throw test_excep();
|
if (Mat3s(1, 1).channels() != 3) throw test_excep();
|
||||||
|
|
||||||
|
vector<Mat_<float> > mvf, mvf2;
|
||||||
|
Mat_<Vec2f> mf2;
|
||||||
|
mvf.push_back(Mat_<float>::ones(4, 3));
|
||||||
|
mvf.push_back(Mat_<float>::zeros(4, 3));
|
||||||
|
merge(mvf, mf2);
|
||||||
|
split(mf2, mvf2);
|
||||||
|
CV_Assert( norm(mvf2[0], mvf[0], CV_C) == 0 &&
|
||||||
|
norm(mvf2[1], mvf[1], CV_C) == 0 );
|
||||||
|
|
||||||
|
{
|
||||||
|
Mat a(2,2,CV_32F,1.f);
|
||||||
|
Mat b(1,2,CV_32F,1.f);
|
||||||
|
Mat c = (a*b.t()).t();
|
||||||
|
CV_Assert( norm(c, CV_L1) == 4. );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (const test_excep& e)
|
catch (const test_excep& e)
|
||||||
{
|
{
|
||||||
|
@ -94,9 +94,9 @@ Finds keypoints in an image and computes their descriptors
|
|||||||
|
|
||||||
:param useProvidedKeypoints: If it is true, then the method will use the provided vector of keypoints instead of detecting them.
|
:param useProvidedKeypoints: If it is true, then the method will use the provided vector of keypoints instead of detecting them.
|
||||||
|
|
||||||
FREAK
|
FREAK
|
||||||
-----
|
-----
|
||||||
.. ocv:class:: FREAK
|
.. ocv:class:: FREAK : public DescriptorExtractor
|
||||||
|
|
||||||
Class implementing the FREAK (*Fast Retina Keypoint*) keypoint descriptor, described in [AOV12]_. The algorithm propose a novel keypoint descriptor inspired by the human visual system and more precisely the retina, coined Fast Retina Key- point (FREAK). A cascade of binary strings is computed by efficiently comparing image intensities over a retinal sampling pattern. FREAKs are in general faster to compute with lower memory load and also more robust than SIFT, SURF or BRISK. They are competitive alternatives to existing keypoints in particular for embedded applications.
|
Class implementing the FREAK (*Fast Retina Keypoint*) keypoint descriptor, described in [AOV12]_. The algorithm propose a novel keypoint descriptor inspired by the human visual system and more precisely the retina, coined Fast Retina Key- point (FREAK). A cascade of binary strings is computed by efficiently comparing image intensities over a retinal sampling pattern. FREAKs are in general faster to compute with lower memory load and also more robust than SIFT, SURF or BRISK. They are competitive alternatives to existing keypoints in particular for embedded applications.
|
||||||
|
|
||||||
@ -106,12 +106,12 @@ FREAK::FREAK
|
|||||||
------------
|
------------
|
||||||
The FREAK constructor
|
The FREAK constructor
|
||||||
|
|
||||||
.. ocv:function:: FREAK::FREAK(bool orientationNormalized = true, bool scaleNormalized = true, float patternScale = 22.0f, int nbOctave = 4, const vector<int>& selectedPairs = vector<int>())
|
.. ocv:function:: FREAK::FREAK( bool orientationNormalized=true, bool scaleNormalized=true, float patternScale=22.0f, int nOctaves=4, const vector<int>& selectedPairs=vector<int>() )
|
||||||
|
|
||||||
:param orientationNormalized: Enable orientation normalization.
|
:param orientationNormalized: Enable orientation normalization.
|
||||||
:param scaleNormalized: Enable scale normalization.
|
:param scaleNormalized: Enable scale normalization.
|
||||||
:param patternScale: Scaling of the description pattern.
|
:param patternScale: Scaling of the description pattern.
|
||||||
:param nbOctave: Number of octaves covered by the detected keypoints.
|
:param nOctaves: Number of octaves covered by the detected keypoints.
|
||||||
:param selectedPairs: (Optional) user defined selected pairs indexes,
|
:param selectedPairs: (Optional) user defined selected pairs indexes,
|
||||||
|
|
||||||
FREAK::selectPairs
|
FREAK::selectPairs
|
||||||
@ -126,4 +126,3 @@ We notice that for keypoint matching applications, image content has little effe
|
|||||||
:param keypoints: Set of detected keypoints
|
:param keypoints: Set of detected keypoints
|
||||||
:param corrThresh: Correlation threshold.
|
:param corrThresh: Correlation threshold.
|
||||||
:param verbose: Prints pair selection informations.
|
:param verbose: Prints pair selection informations.
|
||||||
|
|
@ -328,7 +328,7 @@ public:
|
|||||||
float patternScale = 22.0f,
|
float patternScale = 22.0f,
|
||||||
int nOctaves = 4,
|
int nOctaves = 4,
|
||||||
const vector<int>& selectedPairs = vector<int>());
|
const vector<int>& selectedPairs = vector<int>());
|
||||||
FREAK( const FREAK& rhs );
|
FREAK( const FREAK& rhs );
|
||||||
FREAK& operator=( const FREAK& );
|
FREAK& operator=( const FREAK& );
|
||||||
|
|
||||||
virtual ~FREAK();
|
virtual ~FREAK();
|
||||||
@ -349,20 +349,20 @@ public:
|
|||||||
vector<int> selectPairs( const vector<Mat>& images, vector<vector<KeyPoint> >& keypoints,
|
vector<int> selectPairs( const vector<Mat>& images, vector<vector<KeyPoint> >& keypoints,
|
||||||
const double corrThresh = 0.7, bool verbose = true );
|
const double corrThresh = 0.7, bool verbose = true );
|
||||||
|
|
||||||
AlgorithmInfo* info() const;
|
AlgorithmInfo* info() const;
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
NB_SCALES = 64, NB_PAIRS = 512, NB_ORIENPAIRS = 45
|
NB_SCALES = 64, NB_PAIRS = 512, NB_ORIENPAIRS = 45
|
||||||
};
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void computeImpl( const Mat& image, vector<KeyPoint>& keypoints, Mat& descriptors ) const;
|
virtual void computeImpl( const Mat& image, vector<KeyPoint>& keypoints, Mat& descriptors ) const;
|
||||||
void buildPattern();
|
void buildPattern();
|
||||||
uchar meanIntensity( const Mat& image, const Mat& integral, const float kp_x, const float kp_y,
|
uchar meanIntensity( const Mat& image, const Mat& integral, const float kp_x, const float kp_y,
|
||||||
const unsigned int scale, const unsigned int rot, const unsigned int point ) const;
|
const unsigned int scale, const unsigned int rot, const unsigned int point ) const;
|
||||||
|
|
||||||
bool orientationNormalized; //true if the orientation is normalized, false otherwise
|
bool orientationNormalized; //true if the orientation is normalized, false otherwise
|
||||||
bool scaleNormalized; //true if the scale is normalized, false otherwise
|
bool scaleNormalized; //true if the scale is normalized, false otherwise
|
||||||
double patternScale; //scaling of the pattern
|
double patternScale; //scaling of the pattern
|
||||||
int nOctaves; //number of octaves
|
int nOctaves; //number of octaves
|
||||||
@ -372,28 +372,28 @@ protected:
|
|||||||
int nOctaves0;
|
int nOctaves0;
|
||||||
vector<int> selectedPairs0;
|
vector<int> selectedPairs0;
|
||||||
|
|
||||||
struct PatternPoint
|
struct PatternPoint
|
||||||
{
|
{
|
||||||
float x; // x coordinate relative to center
|
float x; // x coordinate relative to center
|
||||||
float y; // x coordinate relative to center
|
float y; // x coordinate relative to center
|
||||||
float sigma; // Gaussian smoothing sigma
|
float sigma; // Gaussian smoothing sigma
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DescriptionPair
|
struct DescriptionPair
|
||||||
{
|
{
|
||||||
uchar i; // index of the first point
|
uchar i; // index of the first point
|
||||||
uchar j; // index of the second point
|
uchar j; // index of the second point
|
||||||
};
|
};
|
||||||
|
|
||||||
struct OrientationPair
|
struct OrientationPair
|
||||||
{
|
{
|
||||||
uchar i; // index of the first point
|
uchar i; // index of the first point
|
||||||
uchar j; // index of the second point
|
uchar j; // index of the second point
|
||||||
int weight_dx; // dx/(norm_sq))*4096
|
int weight_dx; // dx/(norm_sq))*4096
|
||||||
int weight_dy; // dy/(norm_sq))*4096
|
int weight_dy; // dy/(norm_sq))*4096
|
||||||
};
|
};
|
||||||
|
|
||||||
vector<PatternPoint> patternLookup; // look-up table for the pattern points (position+sigma of all points at all scales and orientation)
|
vector<PatternPoint> patternLookup; // look-up table for the pattern points (position+sigma of all points at all scales and orientation)
|
||||||
int patternSizes[NB_SCALES]; // size of the pattern at a specific scale (used to check if a point is within image boundaries)
|
int patternSizes[NB_SCALES]; // size of the pattern at a specific scale (used to check if a point is within image boundaries)
|
||||||
DescriptionPair descriptionPairs[NB_PAIRS];
|
DescriptionPair descriptionPairs[NB_PAIRS];
|
||||||
OrientationPair orientationPairs[NB_ORIENPAIRS];
|
OrientationPair orientationPairs[NB_ORIENPAIRS];
|
||||||
@ -641,8 +641,8 @@ protected:
|
|||||||
class CV_EXPORTS AdjusterAdapter: public FeatureDetector
|
class CV_EXPORTS AdjusterAdapter: public FeatureDetector
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/** pure virtual interface
|
/** pure virtual interface
|
||||||
*/
|
*/
|
||||||
virtual ~AdjusterAdapter() {}
|
virtual ~AdjusterAdapter() {}
|
||||||
/** too few features were detected so, adjust the detector params accordingly
|
/** too few features were detected so, adjust the detector params accordingly
|
||||||
* \param min the minimum number of desired features
|
* \param min the minimum number of desired features
|
||||||
@ -682,7 +682,7 @@ public:
|
|||||||
/** \param adjuster an AdjusterAdapter that will do the detection and parameter adjustment
|
/** \param adjuster an AdjusterAdapter that will do the detection and parameter adjustment
|
||||||
* \param max_features the maximum desired number of features
|
* \param max_features the maximum desired number of features
|
||||||
* \param max_iters the maximum number of times to try to adjust the feature detector params
|
* \param max_iters the maximum number of times to try to adjust the feature detector params
|
||||||
* for the FastAdjuster this can be high, but with Star or Surf this can get time consuming
|
* for the FastAdjuster this can be high, but with Star or Surf this can get time consuming
|
||||||
* \param min_features the minimum desired features
|
* \param min_features the minimum desired features
|
||||||
*/
|
*/
|
||||||
DynamicAdaptedFeatureDetector( const Ptr<AdjusterAdapter>& adjuster, int min_features=400, int max_features=500, int max_iters=5 );
|
DynamicAdaptedFeatureDetector( const Ptr<AdjusterAdapter>& adjuster, int min_features=400, int max_features=500, int max_iters=5 );
|
||||||
@ -693,8 +693,8 @@ protected:
|
|||||||
virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
|
virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DynamicAdaptedFeatureDetector& operator=(const DynamicAdaptedFeatureDetector&);
|
DynamicAdaptedFeatureDetector& operator=(const DynamicAdaptedFeatureDetector&);
|
||||||
DynamicAdaptedFeatureDetector(const DynamicAdaptedFeatureDetector&);
|
DynamicAdaptedFeatureDetector(const DynamicAdaptedFeatureDetector&);
|
||||||
|
|
||||||
int escape_iters_;
|
int escape_iters_;
|
||||||
int min_features_, max_features_;
|
int min_features_, max_features_;
|
||||||
@ -792,7 +792,7 @@ public:
|
|||||||
virtual bool empty() const;
|
virtual bool empty() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void computeImpl( const Mat& image, vector<KeyPoint>& keypoints, Mat& descriptors ) const;
|
virtual void computeImpl( const Mat& image, vector<KeyPoint>& keypoints, Mat& descriptors ) const;
|
||||||
|
|
||||||
Ptr<DescriptorExtractor> descriptorExtractor;
|
Ptr<DescriptorExtractor> descriptorExtractor;
|
||||||
};
|
};
|
||||||
@ -962,7 +962,7 @@ class CV_EXPORTS_W DescriptorMatcher : public Algorithm
|
|||||||
public:
|
public:
|
||||||
virtual ~DescriptorMatcher();
|
virtual ~DescriptorMatcher();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add descriptors to train descriptor collection.
|
* Add descriptors to train descriptor collection.
|
||||||
* descriptors Descriptors to add. Each descriptors[i] is a descriptors set from one image.
|
* descriptors Descriptors to add. Each descriptors[i] is a descriptors set from one image.
|
||||||
*/
|
*/
|
||||||
@ -1078,7 +1078,7 @@ protected:
|
|||||||
static bool isMaskedOut( const vector<Mat>& masks, int queryIdx );
|
static bool isMaskedOut( const vector<Mat>& masks, int queryIdx );
|
||||||
|
|
||||||
static Mat clone_op( Mat m ) { return m.clone(); }
|
static Mat clone_op( Mat m ) { return m.clone(); }
|
||||||
void checkMasks( const vector<Mat>& masks, int queryDescriptorsCount ) const;
|
void checkMasks( const vector<Mat>& masks, int queryDescriptorsCount ) const;
|
||||||
|
|
||||||
// Collection of descriptors from train images.
|
// Collection of descriptors from train images.
|
||||||
vector<Mat> trainDescCollection;
|
vector<Mat> trainDescCollection;
|
||||||
|
@ -175,18 +175,18 @@ void cv::gpu::HOGDescriptor::setSVMDetector(const vector<float>& _detector)
|
|||||||
|
|
||||||
cv::gpu::GpuMat cv::gpu::HOGDescriptor::getBuffer(const Size& sz, int type, GpuMat& buf)
|
cv::gpu::GpuMat cv::gpu::HOGDescriptor::getBuffer(const Size& sz, int type, GpuMat& buf)
|
||||||
{
|
{
|
||||||
if (buf.empty() || buf.type() != type)
|
if (buf.empty() || buf.type() != type)
|
||||||
buf.create(sz, type);
|
buf.create(sz, type);
|
||||||
else
|
else
|
||||||
if (buf.cols < sz.width || buf.rows < sz.height)
|
if (buf.cols < sz.width || buf.rows < sz.height)
|
||||||
buf.create(std::max(buf.rows, sz.height), std::max(buf.cols, sz.width), type);
|
buf.create(std::max(buf.rows, sz.height), std::max(buf.cols, sz.width), type);
|
||||||
|
|
||||||
return buf(Rect(Point(0,0), sz));
|
return buf(Rect(Point(0,0), sz));
|
||||||
}
|
}
|
||||||
|
|
||||||
cv::gpu::GpuMat cv::gpu::HOGDescriptor::getBuffer(int rows, int cols, int type, GpuMat& buf)
|
cv::gpu::GpuMat cv::gpu::HOGDescriptor::getBuffer(int rows, int cols, int type, GpuMat& buf)
|
||||||
{
|
{
|
||||||
return getBuffer(Size(cols, rows), type, buf);
|
return getBuffer(Size(cols, rows), type, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -202,7 +202,7 @@ void cv::gpu::HOGDescriptor::computeGradient(const GpuMat& img, GpuMat& _grad, G
|
|||||||
|
|
||||||
float angleScale = (float)(nbins / CV_PI);
|
float angleScale = (float)(nbins / CV_PI);
|
||||||
switch (img.type())
|
switch (img.type())
|
||||||
{
|
{
|
||||||
case CV_8UC1:
|
case CV_8UC1:
|
||||||
hog::compute_gradients_8UC1(nbins, img.rows, img.cols, img, angleScale, _grad, _qangle, gamma_correction);
|
hog::compute_gradients_8UC1(nbins, img.rows, img.cols, img, angleScale, _grad, _qangle, gamma_correction);
|
||||||
break;
|
break;
|
||||||
@ -220,11 +220,11 @@ void cv::gpu::HOGDescriptor::computeBlockHistograms(const GpuMat& img)
|
|||||||
size_t block_hist_size = getBlockHistogramSize();
|
size_t block_hist_size = getBlockHistogramSize();
|
||||||
Size blocks_per_img = numPartsWithin(img.size(), block_size, block_stride);
|
Size blocks_per_img = numPartsWithin(img.size(), block_size, block_stride);
|
||||||
|
|
||||||
// block_hists.create(1, block_hist_size * blocks_per_img.area(), CV_32F);
|
// block_hists.create(1, block_hist_size * blocks_per_img.area(), CV_32F);
|
||||||
block_hists = getBuffer(1, static_cast<int>(block_hist_size * blocks_per_img.area()), CV_32F, block_hists_buf);
|
block_hists = getBuffer(1, static_cast<int>(block_hist_size * blocks_per_img.area()), CV_32F, block_hists_buf);
|
||||||
|
|
||||||
hog::compute_hists(nbins, block_stride.width, block_stride.height, img.rows, img.cols,
|
hog::compute_hists(nbins, block_stride.width, block_stride.height, img.rows, img.cols,
|
||||||
grad, qangle, (float)getWinSigma(), block_hists.ptr<float>());
|
grad, qangle, (float)getWinSigma(), block_hists.ptr<float>());
|
||||||
|
|
||||||
hog::normalize_hists(nbins, block_stride.width, block_stride.height, img.rows, img.cols,
|
hog::normalize_hists(nbins, block_stride.width, block_stride.height, img.rows, img.cols,
|
||||||
block_hists.ptr<float>(), (float)threshold_L2hys);
|
block_hists.ptr<float>(), (float)threshold_L2hys);
|
||||||
@ -277,7 +277,7 @@ void cv::gpu::HOGDescriptor::detect(const GpuMat& img, vector<Point>& hits, doub
|
|||||||
|
|
||||||
Size wins_per_img = numPartsWithin(img.size(), win_size, win_stride);
|
Size wins_per_img = numPartsWithin(img.size(), win_size, win_stride);
|
||||||
// labels.create(1, wins_per_img.area(), CV_8U);
|
// labels.create(1, wins_per_img.area(), CV_8U);
|
||||||
labels = getBuffer(1, wins_per_img.area(), CV_8U, labels_buf);
|
labels = getBuffer(1, wins_per_img.area(), CV_8U, labels_buf);
|
||||||
|
|
||||||
hog::classify_hists(win_size.height, win_size.width, block_stride.height, block_stride.width,
|
hog::classify_hists(win_size.height, win_size.width, block_stride.height, block_stride.width,
|
||||||
win_stride.height, win_stride.width, img.rows, img.cols, block_hists.ptr<float>(),
|
win_stride.height, win_stride.width, img.rows, img.cols, block_hists.ptr<float>(),
|
||||||
@ -297,10 +297,10 @@ void cv::gpu::HOGDescriptor::detect(const GpuMat& img, vector<Point>& hits, doub
|
|||||||
|
|
||||||
|
|
||||||
void cv::gpu::HOGDescriptor::detectMultiScale(const GpuMat& img, vector<Rect>& found_locations, double hit_threshold,
|
void cv::gpu::HOGDescriptor::detectMultiScale(const GpuMat& img, vector<Rect>& found_locations, double hit_threshold,
|
||||||
Size win_stride, Size padding, double scale0, int group_threshold)
|
Size win_stride, Size padding, double scale0, int group_threshold)
|
||||||
{
|
{
|
||||||
|
|
||||||
CV_Assert(img.type() == CV_8UC1 || img.type() == CV_8UC4);
|
CV_Assert(img.type() == CV_8UC1 || img.type() == CV_8UC4);
|
||||||
|
|
||||||
vector<double> level_scale;
|
vector<double> level_scale;
|
||||||
double scale = 1.;
|
double scale = 1.;
|
||||||
@ -316,15 +316,15 @@ void cv::gpu::HOGDescriptor::detectMultiScale(const GpuMat& img, vector<Rect>& f
|
|||||||
}
|
}
|
||||||
levels = std::max(levels, 1);
|
levels = std::max(levels, 1);
|
||||||
level_scale.resize(levels);
|
level_scale.resize(levels);
|
||||||
image_scales.resize(levels);
|
image_scales.resize(levels);
|
||||||
|
|
||||||
std::vector<Rect> all_candidates;
|
std::vector<Rect> all_candidates;
|
||||||
vector<Point> locations;
|
vector<Point> locations;
|
||||||
|
|
||||||
for (size_t i = 0; i < level_scale.size(); i++)
|
for (size_t i = 0; i < level_scale.size(); i++)
|
||||||
{
|
{
|
||||||
double _scale = level_scale[i];
|
scale = level_scale[i];
|
||||||
Size sz(cvRound(img.cols / _scale), cvRound(img.rows / _scale));
|
Size sz(cvRound(img.cols / scale), cvRound(img.rows / scale));
|
||||||
GpuMat smaller_img;
|
GpuMat smaller_img;
|
||||||
|
|
||||||
if (sz == img.size())
|
if (sz == img.size())
|
||||||
@ -333,11 +333,11 @@ void cv::gpu::HOGDescriptor::detectMultiScale(const GpuMat& img, vector<Rect>& f
|
|||||||
{
|
{
|
||||||
image_scales[i].create(sz, img.type());
|
image_scales[i].create(sz, img.type());
|
||||||
switch (img.type())
|
switch (img.type())
|
||||||
{
|
{
|
||||||
case CV_8UC1: hog::resize_8UC1(img, image_scales[i]); break;
|
case CV_8UC1: hog::resize_8UC1(img, image_scales[i]); break;
|
||||||
case CV_8UC4: hog::resize_8UC4(img, image_scales[i]); break;
|
case CV_8UC4: hog::resize_8UC4(img, image_scales[i]); break;
|
||||||
}
|
}
|
||||||
smaller_img = image_scales[i];
|
smaller_img = image_scales[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
detect(smaller_img, locations, hit_threshold, win_stride, padding);
|
detect(smaller_img, locations, hit_threshold, win_stride, padding);
|
||||||
|
@ -84,10 +84,9 @@ if(HAVE_QT)
|
|||||||
QT4_WRAP_CPP(_MOC_OUTFILES src/window_QT.h)
|
QT4_WRAP_CPP(_MOC_OUTFILES src/window_QT.h)
|
||||||
|
|
||||||
list(APPEND HIGHGUI_LIBRARIES ${QT_LIBRARIES} ${QT_QTTEST_LIBRARY})
|
list(APPEND HIGHGUI_LIBRARIES ${QT_LIBRARIES} ${QT_QTTEST_LIBRARY})
|
||||||
list(APPEND highgui_srcs src/window_QT.cpp ${_MOC_OUTFILES} ${_RCC_OUTFILES} )
|
list(APPEND highgui_srcs src/window_QT.cpp ${_MOC_OUTFILES} ${_RCC_OUTFILES})
|
||||||
|
ocv_check_flag_support(CXX -Wno-missing-declarations _have_flag)
|
||||||
ocv_check_flag_support(CXX -Wno-missing-declarations HAVE_CXX_WNO_MISSING_DECLARATIONS)
|
if(${_have_flag})
|
||||||
if(HAVE_CXX_WNO_MISSING_DECLARATIONS)
|
|
||||||
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(WIN32)
|
||||||
@ -150,7 +149,9 @@ endif(HAVE_opencv_androidcamera)
|
|||||||
if(HAVE_XIMEA)
|
if(HAVE_XIMEA)
|
||||||
list(APPEND highgui_srcs src/cap_ximea.cpp)
|
list(APPEND highgui_srcs src/cap_ximea.cpp)
|
||||||
ocv_include_directories(${XIMEA_PATH})
|
ocv_include_directories(${XIMEA_PATH})
|
||||||
link_directories(${XIMEA_LIBRARY_DIR})
|
if(XIMEA_LIBRARY_DIR)
|
||||||
|
link_directories(${XIMEA_LIBRARY_DIR})
|
||||||
|
endif()
|
||||||
list(APPEND HIGHGUI_LIBRARIES m3api)
|
list(APPEND HIGHGUI_LIBRARIES m3api)
|
||||||
endif(HAVE_XIMEA)
|
endif(HAVE_XIMEA)
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
|
|
||||||
#include "xiApi.h"
|
#include "xiApi.h"
|
||||||
#include "xiExt.h"
|
#include "xiExt.h"
|
||||||
|
#include "m3Api.h"
|
||||||
|
|
||||||
/**********************************************************************************/
|
/**********************************************************************************/
|
||||||
|
|
||||||
@ -18,20 +18,20 @@ public:
|
|||||||
virtual bool setProperty(int, double);
|
virtual bool setProperty(int, double);
|
||||||
virtual bool grabFrame();
|
virtual bool grabFrame();
|
||||||
virtual IplImage* retrieveFrame(int);
|
virtual IplImage* retrieveFrame(int);
|
||||||
virtual int getCaptureDomain() { return CV_CAP_XIAPI; } // Return the type of the capture object: CV_CAP_VFW, etc...
|
virtual int getCaptureDomain() { return CV_CAP_XIAPI; } // Return the type of the capture object: CV_CAP_VFW, etc...
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void init();
|
void init();
|
||||||
void errMsg(char* msg, int errNum);
|
void errMsg(const char* msg, int errNum);
|
||||||
IplImage* frame;
|
IplImage* frame;
|
||||||
|
|
||||||
HANDLE hmv;
|
HANDLE hmv;
|
||||||
DWORD numDevices;
|
DWORD numDevices;
|
||||||
XI_IMG image;
|
XI_IMG image;
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
int format;
|
int format;
|
||||||
int timeout;
|
int timeout;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**********************************************************************************/
|
/**********************************************************************************/
|
||||||
@ -43,7 +43,7 @@ CvCapture* cvCreateCameraCapture_XIMEA( int index )
|
|||||||
if( capture->open( index ))
|
if( capture->open( index ))
|
||||||
return capture;
|
return capture;
|
||||||
|
|
||||||
delete capture;
|
delete capture;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,8 +51,9 @@ CvCapture* cvCreateCameraCapture_XIMEA( int index )
|
|||||||
// Enumerate connected devices
|
// Enumerate connected devices
|
||||||
void CvCaptureCAM_XIMEA::init()
|
void CvCaptureCAM_XIMEA::init()
|
||||||
{
|
{
|
||||||
xiGetNumberDevices( &numDevices);
|
xiGetNumberDevices( &numDevices);
|
||||||
hmv = NULL;
|
hmv = NULL;
|
||||||
|
memset(&image, 0, sizeof(XI_IMG));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -60,57 +61,85 @@ void CvCaptureCAM_XIMEA::init()
|
|||||||
// Initialize camera input
|
// Initialize camera input
|
||||||
bool CvCaptureCAM_XIMEA::open( int wIndex )
|
bool CvCaptureCAM_XIMEA::open( int wIndex )
|
||||||
{
|
{
|
||||||
int mvret = XI_OK;
|
int mvret = XI_OK;
|
||||||
|
|
||||||
if(numDevices == 0)
|
if(numDevices == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if((mvret = xiOpenDevice( wIndex, &hmv)) != XI_OK)
|
if((mvret = xiOpenDevice( wIndex, &hmv)) != XI_OK)
|
||||||
{
|
{
|
||||||
errMsg("Open XI_DEVICE failed", mvret);
|
errMsg("Open XI_DEVICE failed", mvret);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// always use auto exposure/gain
|
// always use auto exposure/gain
|
||||||
xiSetParamInt( hmv, XI_PRM_AEAG, 1);
|
mvret = xiSetParamInt( hmv, XI_PRM_AEAG, 1);
|
||||||
|
if(mvret != XI_OK) goto error;
|
||||||
|
|
||||||
// always use auto white ballance
|
// always use auto white ballance
|
||||||
xiSetParamInt( hmv, XI_PRM_AUTO_WB, 1);
|
mvret = xiSetParamInt( hmv, XI_PRM_AUTO_WB, 1);
|
||||||
|
if(mvret != XI_OK) goto error;
|
||||||
|
|
||||||
xiGetParamInt( hmv, XI_PRM_WIDTH, &width);
|
mvret = xiGetParamInt( hmv, XI_PRM_WIDTH, &width);
|
||||||
xiGetParamInt( hmv, XI_PRM_HEIGHT, &height);
|
if(mvret != XI_OK) goto error;
|
||||||
|
|
||||||
// default image format RGB24
|
mvret = xiGetParamInt( hmv, XI_PRM_HEIGHT, &height);
|
||||||
xiSetParamInt( hmv, XI_PRM_IMAGE_DATA_FORMAT, XI_RGB24);
|
if(mvret != XI_OK) goto error;
|
||||||
format = XI_RGB24;
|
|
||||||
// allocate frame buffer for RGB24 image
|
|
||||||
frame = cvCreateImage(cvSize( width, height), IPL_DEPTH_8U, 3);
|
|
||||||
|
|
||||||
//default capture timeout 10s
|
// default image format RGB24
|
||||||
timeout = 10000;
|
format = XI_RGB24;
|
||||||
|
mvret = xiSetParamInt( hmv, XI_PRM_IMAGE_DATA_FORMAT, format);
|
||||||
|
if(mvret != XI_OK) goto error;
|
||||||
|
|
||||||
return true;
|
// allocate frame buffer for RGB24 image
|
||||||
|
frame = cvCreateImage(cvSize( width, height), IPL_DEPTH_8U, 3);
|
||||||
|
|
||||||
|
//default capture timeout 10s
|
||||||
|
timeout = 10000;
|
||||||
|
|
||||||
|
mvret = xiStartAcquisition(hmv);
|
||||||
|
if(mvret != XI_OK)
|
||||||
|
{
|
||||||
|
errMsg("StartAcquisition XI_DEVICE failed", mvret);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
error:
|
||||||
|
xiCloseDevice(hmv);
|
||||||
|
hmv = NULL;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************************/
|
/**********************************************************************************/
|
||||||
|
|
||||||
void CvCaptureCAM_XIMEA::close()
|
void CvCaptureCAM_XIMEA::close()
|
||||||
{
|
{
|
||||||
xiCloseDevice(hmv);
|
xiStopAcquisition(hmv);
|
||||||
hmv = NULL;
|
xiCloseDevice(hmv);
|
||||||
|
hmv = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************************/
|
/**********************************************************************************/
|
||||||
|
|
||||||
bool CvCaptureCAM_XIMEA::grabFrame()
|
bool CvCaptureCAM_XIMEA::grabFrame()
|
||||||
{
|
{
|
||||||
int mvret = XI_OK;
|
image.size = sizeof(XI_IMG);
|
||||||
image.size = sizeof(XI_IMG);
|
int mvret = xiGetImage( hmv, timeout, &image);
|
||||||
if((mvret = xiGetImage( hmv, timeout, &image)) != XI_OK)
|
|
||||||
{
|
if(mvret == MM40_ACQUISITION_STOPED)
|
||||||
errMsg("Error during GetImage", mvret);
|
{
|
||||||
return false;
|
xiStartAcquisition(hmv);
|
||||||
}
|
mvret = xiGetImage(hmv, timeout, &image);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(mvret != XI_OK)
|
||||||
|
{
|
||||||
|
errMsg("Error during GetImage", mvret);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,136 +147,150 @@ bool CvCaptureCAM_XIMEA::grabFrame()
|
|||||||
|
|
||||||
IplImage* CvCaptureCAM_XIMEA::retrieveFrame(int)
|
IplImage* CvCaptureCAM_XIMEA::retrieveFrame(int)
|
||||||
{
|
{
|
||||||
// update cvImage after format has changed
|
// update cvImage after format has changed
|
||||||
if( image.width != width || image.height != height || image.frm != format)
|
if( (int)image.width != width || (int)image.height != height || image.frm != (XI_IMG_FORMAT)format)
|
||||||
{
|
{
|
||||||
cvReleaseImage(&frame);
|
cvReleaseImage(&frame);
|
||||||
switch( image.frm)
|
switch( image.frm)
|
||||||
{
|
{
|
||||||
case XI_MONO8 : frame = cvCreateImage(cvSize( image.width, image.height), IPL_DEPTH_8U, 1); break;
|
case XI_MONO8 : frame = cvCreateImage(cvSize( image.width, image.height), IPL_DEPTH_8U, 1); break;
|
||||||
case XI_MONO16 : frame = cvCreateImage(cvSize( image.width, image.height), IPL_DEPTH_16U, 1); break;
|
case XI_MONO16 : frame = cvCreateImage(cvSize( image.width, image.height), IPL_DEPTH_16U, 1); break;
|
||||||
case XI_RGB24 : frame = cvCreateImage(cvSize( image.width, image.height), IPL_DEPTH_8U, 3); break;
|
case XI_RGB24 : frame = cvCreateImage(cvSize( image.width, image.height), IPL_DEPTH_8U, 3); break;
|
||||||
case XI_RGB32 : frame = cvCreateImage(cvSize( image.width, image.height), IPL_DEPTH_8U, 4); break;
|
case XI_RGB32 : frame = cvCreateImage(cvSize( image.width, image.height), IPL_DEPTH_8U, 4); break;
|
||||||
}
|
default :
|
||||||
// update global image format
|
return frame;
|
||||||
format = image.frm;
|
}
|
||||||
width = image.width;
|
// update global image format
|
||||||
height = image.height;
|
format = image.frm;
|
||||||
}
|
width = image.width;
|
||||||
|
height = image.height;
|
||||||
|
}
|
||||||
|
|
||||||
// copy pixel data
|
// copy pixel data
|
||||||
switch( image.frm)
|
switch( image.frm)
|
||||||
{
|
{
|
||||||
case XI_MONO8 : memcpy( frame->imageData, image.bp, image.width*image.height); break;
|
case XI_MONO8 : memcpy( frame->imageData, image.bp, image.width*image.height); break;
|
||||||
case XI_MONO16 : memcpy( frame->imageData, image.bp, image.width*image.height*sizeof(WORD)); break;
|
case XI_MONO16 : memcpy( frame->imageData, image.bp, image.width*image.height*sizeof(WORD)); break;
|
||||||
case XI_RGB24 : memcpy( frame->imageData, image.bp, image.width*image.height*3); break;
|
case XI_RGB24 : memcpy( frame->imageData, image.bp, image.width*image.height*3); break;
|
||||||
case XI_RGB32 : memcpy( frame->imageData, image.bp, image.width*image.height*sizeof(DWORD)); break;
|
case XI_RGB32 : memcpy( frame->imageData, image.bp, image.width*image.height*sizeof(DWORD)); break;
|
||||||
}
|
default: break;
|
||||||
return frame;
|
}
|
||||||
|
return frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************************/
|
/**********************************************************************************/
|
||||||
|
|
||||||
double CvCaptureCAM_XIMEA::getProperty( int property_id )
|
double CvCaptureCAM_XIMEA::getProperty( int property_id )
|
||||||
{
|
{
|
||||||
if(hmv == NULL)
|
if(hmv == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
int ival = 0;
|
int ival = 0;
|
||||||
float fval = 0;
|
float fval = 0;
|
||||||
|
|
||||||
switch( property_id )
|
switch( property_id )
|
||||||
{
|
{
|
||||||
// OCV parameters
|
// OCV parameters
|
||||||
case CV_CAP_PROP_POS_FRAMES : return (double) image.nframe;
|
case CV_CAP_PROP_POS_FRAMES : return (double) image.nframe;
|
||||||
case CV_CAP_PROP_FRAME_WIDTH : xiGetParamInt( hmv, XI_PRM_WIDTH, &ival); return ival;
|
case CV_CAP_PROP_FRAME_WIDTH : xiGetParamInt( hmv, XI_PRM_WIDTH, &ival); return ival;
|
||||||
case CV_CAP_PROP_FRAME_HEIGHT : xiGetParamInt( hmv, XI_PRM_HEIGHT, &ival); return ival;
|
case CV_CAP_PROP_FRAME_HEIGHT : xiGetParamInt( hmv, XI_PRM_HEIGHT, &ival); return ival;
|
||||||
case CV_CAP_PROP_FPS : xiGetParamFloat( hmv, XI_PRM_FRAMERATE, &fval); return fval;
|
case CV_CAP_PROP_FPS : xiGetParamFloat( hmv, XI_PRM_FRAMERATE, &fval); return fval;
|
||||||
case CV_CAP_PROP_GAIN : xiGetParamFloat( hmv, XI_PRM_GAIN, &fval); return fval;
|
case CV_CAP_PROP_GAIN : xiGetParamFloat( hmv, XI_PRM_GAIN, &fval); return fval;
|
||||||
case CV_CAP_PROP_EXPOSURE : xiGetParamInt( hmv, XI_PRM_EXPOSURE, &ival); return ival;
|
case CV_CAP_PROP_EXPOSURE : xiGetParamInt( hmv, XI_PRM_EXPOSURE, &ival); return ival;
|
||||||
|
|
||||||
// XIMEA camera properties
|
// XIMEA camera properties
|
||||||
case CV_CAP_PROP_XI_DOWNSAMPLING : xiGetParamInt( hmv, XI_PRM_DOWNSAMPLING, &ival); return ival;
|
case CV_CAP_PROP_XI_DOWNSAMPLING : xiGetParamInt( hmv, XI_PRM_DOWNSAMPLING, &ival); return ival;
|
||||||
case CV_CAP_PROP_XI_DATA_FORMAT : xiGetParamInt( hmv, XI_PRM_IMAGE_DATA_FORMAT, &ival); return ival;
|
case CV_CAP_PROP_XI_DATA_FORMAT : xiGetParamInt( hmv, XI_PRM_IMAGE_DATA_FORMAT, &ival); return ival;
|
||||||
case CV_CAP_PROP_XI_OFFSET_X : xiGetParamInt( hmv, XI_PRM_OFFSET_X, &ival); return ival;
|
case CV_CAP_PROP_XI_OFFSET_X : xiGetParamInt( hmv, XI_PRM_OFFSET_X, &ival); return ival;
|
||||||
case CV_CAP_PROP_XI_OFFSET_Y : xiGetParamInt( hmv, XI_PRM_OFFSET_Y, &ival); return ival;
|
case CV_CAP_PROP_XI_OFFSET_Y : xiGetParamInt( hmv, XI_PRM_OFFSET_Y, &ival); return ival;
|
||||||
case CV_CAP_PROP_XI_TRG_SOURCE : xiGetParamInt( hmv, XI_PRM_TRG_SOURCE, &ival); return ival;
|
case CV_CAP_PROP_XI_TRG_SOURCE : xiGetParamInt( hmv, XI_PRM_TRG_SOURCE, &ival); return ival;
|
||||||
case CV_CAP_PROP_XI_GPI_SELECTOR : xiGetParamInt( hmv, XI_PRM_GPI_SELECTOR, &ival); return ival;
|
case CV_CAP_PROP_XI_GPI_SELECTOR : xiGetParamInt( hmv, XI_PRM_GPI_SELECTOR, &ival); return ival;
|
||||||
case CV_CAP_PROP_XI_GPI_MODE : xiGetParamInt( hmv, XI_PRM_GPI_MODE, &ival); return ival;
|
case CV_CAP_PROP_XI_GPI_MODE : xiGetParamInt( hmv, XI_PRM_GPI_MODE, &ival); return ival;
|
||||||
case CV_CAP_PROP_XI_GPI_LEVEL : xiGetParamInt( hmv, XI_PRM_GPI_LEVEL, &ival); return ival;
|
case CV_CAP_PROP_XI_GPI_LEVEL : xiGetParamInt( hmv, XI_PRM_GPI_LEVEL, &ival); return ival;
|
||||||
case CV_CAP_PROP_XI_GPO_SELECTOR : xiGetParamInt( hmv, XI_PRM_GPO_SELECTOR, &ival); return ival;
|
case CV_CAP_PROP_XI_GPO_SELECTOR : xiGetParamInt( hmv, XI_PRM_GPO_SELECTOR, &ival); return ival;
|
||||||
case CV_CAP_PROP_XI_GPO_MODE : xiGetParamInt( hmv, XI_PRM_GPO_MODE, &ival); return ival;
|
case CV_CAP_PROP_XI_GPO_MODE : xiGetParamInt( hmv, XI_PRM_GPO_MODE, &ival); return ival;
|
||||||
case CV_CAP_PROP_XI_LED_SELECTOR : xiGetParamInt( hmv, XI_PRM_LED_SELECTOR, &ival); return ival;
|
case CV_CAP_PROP_XI_LED_SELECTOR : xiGetParamInt( hmv, XI_PRM_LED_SELECTOR, &ival); return ival;
|
||||||
case CV_CAP_PROP_XI_LED_MODE : xiGetParamInt( hmv, XI_PRM_LED_MODE, &ival); return ival;
|
case CV_CAP_PROP_XI_LED_MODE : xiGetParamInt( hmv, XI_PRM_LED_MODE, &ival); return ival;
|
||||||
case CV_CAP_PROP_XI_AUTO_WB : xiGetParamInt( hmv, XI_PRM_AUTO_WB, &ival); return ival;
|
case CV_CAP_PROP_XI_AUTO_WB : xiGetParamInt( hmv, XI_PRM_AUTO_WB, &ival); return ival;
|
||||||
case CV_CAP_PROP_XI_AEAG : xiGetParamInt( hmv, XI_PRM_AEAG, &ival); return ival;
|
case CV_CAP_PROP_XI_AEAG : xiGetParamInt( hmv, XI_PRM_AEAG, &ival); return ival;
|
||||||
case CV_CAP_PROP_XI_EXP_PRIORITY : xiGetParamFloat( hmv, XI_PRM_EXP_PRIORITY, &fval); return fval;
|
case CV_CAP_PROP_XI_EXP_PRIORITY : xiGetParamFloat( hmv, XI_PRM_EXP_PRIORITY, &fval); return fval;
|
||||||
case CV_CAP_PROP_XI_AE_MAX_LIMIT : xiGetParamInt( hmv, XI_PRM_EXP_PRIORITY, &ival); return ival;
|
case CV_CAP_PROP_XI_AE_MAX_LIMIT : xiGetParamInt( hmv, XI_PRM_EXP_PRIORITY, &ival); return ival;
|
||||||
case CV_CAP_PROP_XI_AG_MAX_LIMIT : xiGetParamFloat( hmv, XI_PRM_AG_MAX_LIMIT, &fval); return fval;
|
case CV_CAP_PROP_XI_AG_MAX_LIMIT : xiGetParamFloat( hmv, XI_PRM_AG_MAX_LIMIT, &fval); return fval;
|
||||||
case CV_CAP_PROP_XI_AEAG_LEVEL : xiGetParamInt( hmv, XI_PRM_AEAG_LEVEL, &ival); return ival;
|
case CV_CAP_PROP_XI_AEAG_LEVEL : xiGetParamInt( hmv, XI_PRM_AEAG_LEVEL, &ival); return ival;
|
||||||
case CV_CAP_PROP_XI_TIMEOUT : return timeout;
|
case CV_CAP_PROP_XI_TIMEOUT : return timeout;
|
||||||
}
|
|
||||||
return 0;
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************************/
|
/**********************************************************************************/
|
||||||
|
|
||||||
bool CvCaptureCAM_XIMEA::setProperty( int property_id, double value )
|
bool CvCaptureCAM_XIMEA::setProperty( int property_id, double value )
|
||||||
{
|
{
|
||||||
int ival = (int) value;
|
int ival = (int) value;
|
||||||
float fval = (float) value;
|
float fval = (float) value;
|
||||||
|
|
||||||
int mvret = XI_OK;
|
int mvret = XI_OK;
|
||||||
|
|
||||||
switch(property_id)
|
switch(property_id)
|
||||||
{
|
{
|
||||||
// OCV parameters
|
// OCV parameters
|
||||||
case CV_CAP_PROP_FRAME_WIDTH : mvret = xiSetParamInt( hmv, XI_PRM_WIDTH, ival); break;
|
case CV_CAP_PROP_FRAME_WIDTH : mvret = xiSetParamInt( hmv, XI_PRM_WIDTH, ival);
|
||||||
case CV_CAP_PROP_FRAME_HEIGHT : mvret = xiSetParamInt( hmv, XI_PRM_HEIGHT, ival); break;
|
if(mvret == XI_OK) width = ival;
|
||||||
|
break;
|
||||||
|
case CV_CAP_PROP_FRAME_HEIGHT : mvret = xiSetParamInt( hmv, XI_PRM_HEIGHT, ival);
|
||||||
|
if(mvret == XI_OK) height = ival;
|
||||||
|
break;
|
||||||
case CV_CAP_PROP_FPS : mvret = xiSetParamFloat( hmv, XI_PRM_FRAMERATE, fval); break;
|
case CV_CAP_PROP_FPS : mvret = xiSetParamFloat( hmv, XI_PRM_FRAMERATE, fval); break;
|
||||||
case CV_CAP_PROP_GAIN : mvret = xiSetParamFloat( hmv, XI_PRM_GAIN, fval); break;
|
case CV_CAP_PROP_GAIN : mvret = xiSetParamFloat( hmv, XI_PRM_GAIN, fval); break;
|
||||||
case CV_CAP_PROP_EXPOSURE : mvret = xiSetParamInt( hmv, XI_PRM_EXPOSURE, ival); break;
|
case CV_CAP_PROP_EXPOSURE : mvret = xiSetParamInt( hmv, XI_PRM_EXPOSURE, ival); break;
|
||||||
// XIMEA camera properties
|
// XIMEA camera properties
|
||||||
case CV_CAP_PROP_XI_DOWNSAMPLING : mvret = xiSetParamInt( hmv, XI_PRM_DOWNSAMPLING, ival); break;
|
case CV_CAP_PROP_XI_DOWNSAMPLING : mvret = xiSetParamInt( hmv, XI_PRM_DOWNSAMPLING, ival); break;
|
||||||
case CV_CAP_PROP_XI_DATA_FORMAT : mvret = xiSetParamInt( hmv, XI_PRM_IMAGE_DATA_FORMAT, ival); break;
|
case CV_CAP_PROP_XI_DATA_FORMAT : mvret = xiSetParamInt( hmv, XI_PRM_IMAGE_DATA_FORMAT, ival);
|
||||||
case CV_CAP_PROP_XI_OFFSET_X : mvret = xiSetParamInt( hmv, XI_PRM_OFFSET_X, ival); break;
|
if(mvret == XI_OK) format = ival;
|
||||||
case CV_CAP_PROP_XI_OFFSET_Y : mvret = xiSetParamInt( hmv, XI_PRM_OFFSET_Y, ival); break;
|
break;
|
||||||
case CV_CAP_PROP_XI_TRG_SOURCE : mvret = xiSetParamInt( hmv, XI_PRM_TRG_SOURCE, ival); break;
|
case CV_CAP_PROP_XI_OFFSET_X : mvret = xiSetParamInt( hmv, XI_PRM_OFFSET_X, ival); break;
|
||||||
case CV_CAP_PROP_XI_GPI_SELECTOR : mvret = xiSetParamInt( hmv, XI_PRM_GPI_SELECTOR, ival); break;
|
case CV_CAP_PROP_XI_OFFSET_Y : mvret = xiSetParamInt( hmv, XI_PRM_OFFSET_Y, ival); break;
|
||||||
case CV_CAP_PROP_XI_TRG_SOFTWARE : mvret = xiSetParamInt( hmv, XI_PRM_TRG_SOURCE, 1); break;
|
case CV_CAP_PROP_XI_TRG_SOURCE : mvret = xiSetParamInt( hmv, XI_PRM_TRG_SOURCE, ival); break;
|
||||||
case CV_CAP_PROP_XI_GPI_MODE : mvret = xiSetParamInt( hmv, XI_PRM_GPI_MODE, ival); break;
|
case CV_CAP_PROP_XI_GPI_SELECTOR : mvret = xiSetParamInt( hmv, XI_PRM_GPI_SELECTOR, ival); break;
|
||||||
case CV_CAP_PROP_XI_GPI_LEVEL : mvret = xiSetParamInt( hmv, XI_PRM_GPI_LEVEL, ival); break;
|
case CV_CAP_PROP_XI_TRG_SOFTWARE : mvret = xiSetParamInt( hmv, XI_PRM_TRG_SOURCE, 1); break;
|
||||||
case CV_CAP_PROP_XI_GPO_SELECTOR : mvret = xiSetParamInt( hmv, XI_PRM_GPO_SELECTOR, ival); break;
|
case CV_CAP_PROP_XI_GPI_MODE : mvret = xiSetParamInt( hmv, XI_PRM_GPI_MODE, ival); break;
|
||||||
case CV_CAP_PROP_XI_GPO_MODE : mvret = xiSetParamInt( hmv, XI_PRM_GPO_MODE, ival); break;
|
case CV_CAP_PROP_XI_GPI_LEVEL : mvret = xiSetParamInt( hmv, XI_PRM_GPI_LEVEL, ival); break;
|
||||||
case CV_CAP_PROP_XI_LED_SELECTOR : mvret = xiSetParamInt( hmv, XI_PRM_LED_SELECTOR, ival); break;
|
case CV_CAP_PROP_XI_GPO_SELECTOR : mvret = xiSetParamInt( hmv, XI_PRM_GPO_SELECTOR, ival); break;
|
||||||
case CV_CAP_PROP_XI_LED_MODE : mvret = xiSetParamInt( hmv, XI_PRM_LED_MODE, ival); break;
|
case CV_CAP_PROP_XI_GPO_MODE : mvret = xiSetParamInt( hmv, XI_PRM_GPO_MODE, ival); break;
|
||||||
case CV_CAP_PROP_XI_AUTO_WB : mvret = xiSetParamInt( hmv, XI_PRM_AUTO_WB, ival); break;
|
case CV_CAP_PROP_XI_LED_SELECTOR : mvret = xiSetParamInt( hmv, XI_PRM_LED_SELECTOR, ival); break;
|
||||||
case CV_CAP_PROP_XI_MANUAL_WB : mvret = xiSetParamInt( hmv, XI_PRM_LED_MODE, ival); break;
|
case CV_CAP_PROP_XI_LED_MODE : mvret = xiSetParamInt( hmv, XI_PRM_LED_MODE, ival); break;
|
||||||
case CV_CAP_PROP_XI_AEAG : mvret = xiSetParamInt( hmv, XI_PRM_AEAG, ival); break;
|
case CV_CAP_PROP_XI_AUTO_WB : mvret = xiSetParamInt( hmv, XI_PRM_AUTO_WB, ival); break;
|
||||||
case CV_CAP_PROP_XI_EXP_PRIORITY : mvret = xiSetParamFloat( hmv, XI_PRM_EXP_PRIORITY, fval); break;
|
case CV_CAP_PROP_XI_MANUAL_WB : mvret = xiSetParamInt( hmv, XI_PRM_LED_MODE, ival); break;
|
||||||
case CV_CAP_PROP_XI_AE_MAX_LIMIT : mvret = xiSetParamInt( hmv, XI_PRM_EXP_PRIORITY, ival); break;
|
case CV_CAP_PROP_XI_AEAG : mvret = xiSetParamInt( hmv, XI_PRM_AEAG, ival); break;
|
||||||
case CV_CAP_PROP_XI_AG_MAX_LIMIT : mvret = xiSetParamFloat( hmv, XI_PRM_AG_MAX_LIMIT, fval); break;
|
case CV_CAP_PROP_XI_EXP_PRIORITY : mvret = xiSetParamFloat( hmv, XI_PRM_EXP_PRIORITY, fval); break;
|
||||||
case CV_CAP_PROP_XI_AEAG_LEVEL : mvret = xiSetParamInt( hmv, XI_PRM_AEAG_LEVEL, ival); break;
|
case CV_CAP_PROP_XI_AE_MAX_LIMIT : mvret = xiSetParamInt( hmv, XI_PRM_EXP_PRIORITY, ival); break;
|
||||||
case CV_CAP_PROP_XI_TIMEOUT : timeout = ival; break;
|
case CV_CAP_PROP_XI_AG_MAX_LIMIT : mvret = xiSetParamFloat( hmv, XI_PRM_AG_MAX_LIMIT, fval); break;
|
||||||
}
|
case CV_CAP_PROP_XI_AEAG_LEVEL : mvret = xiSetParamInt( hmv, XI_PRM_AEAG_LEVEL, ival); break;
|
||||||
|
case CV_CAP_PROP_XI_TIMEOUT : timeout = ival; break;
|
||||||
|
}
|
||||||
|
|
||||||
if(mvret != XI_OK)
|
if(mvret != XI_OK)
|
||||||
{
|
{
|
||||||
errMsg("Set parameter error", mvret);
|
errMsg("Set parameter error", mvret);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************************/
|
/**********************************************************************************/
|
||||||
|
|
||||||
void CvCaptureCAM_XIMEA::errMsg(char* msg, int errNum)
|
void CvCaptureCAM_XIMEA::errMsg(const char* msg, int errNum)
|
||||||
{
|
{
|
||||||
char buf[512];
|
#if defined WIN32 || defined _WIN32
|
||||||
sprintf( buf, "%s : %d\n", msg, errNum);
|
char buf[512];
|
||||||
OutputDebugString(buf);
|
sprintf( buf, "%s : %d\n", msg, errNum);
|
||||||
|
OutputDebugString(buf);
|
||||||
|
#else
|
||||||
|
fprintf(stderr, "%s : %d\n", msg, errNum);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************************/
|
/**********************************************************************************/
|
@ -59,7 +59,7 @@ public:
|
|||||||
ts->printf(cvtest::TS::LOG, "finish reading big image\n");
|
ts->printf(cvtest::TS::LOG, "finish reading big image\n");
|
||||||
if (img.empty()) ts->set_failed_test_info(cvtest::TS::FAIL_INVALID_TEST_DATA);
|
if (img.empty()) ts->set_failed_test_info(cvtest::TS::FAIL_INVALID_TEST_DATA);
|
||||||
ts->printf(cvtest::TS::LOG, "start writing big image\n");
|
ts->printf(cvtest::TS::LOG, "start writing big image\n");
|
||||||
imwrite(string(ts->get_data_path()) + "readwrite/write.png", img);
|
imwrite(cv::tempfile(".png"), img);
|
||||||
ts->printf(cvtest::TS::LOG, "finish writing big image\n");
|
ts->printf(cvtest::TS::LOG, "finish writing big image\n");
|
||||||
}
|
}
|
||||||
catch(...)
|
catch(...)
|
||||||
@ -72,10 +72,14 @@ public:
|
|||||||
|
|
||||||
string ext_from_int(int ext)
|
string ext_from_int(int ext)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_PNG
|
||||||
if (ext == 0) return ".png";
|
if (ext == 0) return ".png";
|
||||||
|
#endif
|
||||||
if (ext == 1) return ".bmp";
|
if (ext == 1) return ".bmp";
|
||||||
if (ext == 2) return ".pgm";
|
if (ext == 2) return ".pgm";
|
||||||
|
#ifdef HAVE_TIFF
|
||||||
if (ext == 3) return ".tiff";
|
if (ext == 3) return ".tiff";
|
||||||
|
#endif
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,16 +96,21 @@ public:
|
|||||||
for (int k = 1; k <= 5; ++k)
|
for (int k = 1; k <= 5; ++k)
|
||||||
{
|
{
|
||||||
for (int ext = 0; ext < 4; ++ext) // 0 - png, 1 - bmp, 2 - pgm, 3 - tiff
|
for (int ext = 0; ext < 4; ++ext) // 0 - png, 1 - bmp, 2 - pgm, 3 - tiff
|
||||||
|
{
|
||||||
|
if(ext_from_int(ext).empty())
|
||||||
|
continue;
|
||||||
for (int num_channels = 1; num_channels <= 3; num_channels+=2)
|
for (int num_channels = 1; num_channels <= 3; num_channels+=2)
|
||||||
{
|
{
|
||||||
ts->printf(ts->LOG, "image type depth:%d channels:%d ext: %s\n", CV_8U, num_channels, ext_from_int(ext).c_str());
|
ts->printf(ts->LOG, "image type depth:%d channels:%d ext: %s\n", CV_8U, num_channels, ext_from_int(ext).c_str());
|
||||||
Mat img(img_r * k, img_c * k, CV_MAKETYPE(CV_8U, num_channels), Scalar::all(0));
|
Mat img(img_r * k, img_c * k, CV_MAKETYPE(CV_8U, num_channels), Scalar::all(0));
|
||||||
circle(img, Point2i((img_c * k) / 2, (img_r * k) / 2), cv::min((img_r * k), (img_c * k)) / 4 , Scalar::all(255));
|
circle(img, Point2i((img_c * k) / 2, (img_r * k) / 2), cv::min((img_r * k), (img_c * k)) / 4 , Scalar::all(255));
|
||||||
ts->printf(ts->LOG, "writing image : %s\n", string(string(ts->get_data_path()) + "readwrite/test" + ext_from_int(ext)).c_str());
|
|
||||||
imwrite(string(ts->get_data_path()) + "readwrite/test" + ext_from_int(ext), img);
|
|
||||||
ts->printf(ts->LOG, "reading test image : %s\n", string(string(ts->get_data_path()) + "readwrite/test" + ext_from_int(ext)).c_str());
|
|
||||||
|
|
||||||
Mat img_test = imread(string(ts->get_data_path()) + "readwrite/test" + ext_from_int(ext), CV_LOAD_IMAGE_UNCHANGED);
|
string img_path = cv::tempfile(ext_from_int(ext).c_str());
|
||||||
|
ts->printf(ts->LOG, "writing image : %s\n", img_path.c_str());
|
||||||
|
imwrite(img_path, img);
|
||||||
|
|
||||||
|
ts->printf(ts->LOG, "reading test image : %s\n", img_path.c_str());
|
||||||
|
Mat img_test = imread(img_path, CV_LOAD_IMAGE_UNCHANGED);
|
||||||
|
|
||||||
if (img_test.empty()) ts->set_failed_test_info(ts->FAIL_MISMATCH);
|
if (img_test.empty()) ts->set_failed_test_info(ts->FAIL_MISMATCH);
|
||||||
|
|
||||||
@ -115,14 +124,17 @@ public:
|
|||||||
ts->set_failed_test_info(ts->FAIL_MISMATCH);
|
ts->set_failed_test_info(ts->FAIL_MISMATCH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_JPEG
|
||||||
for (int num_channels = 1; num_channels <= 3; num_channels+=2)
|
for (int num_channels = 1; num_channels <= 3; num_channels+=2)
|
||||||
{
|
{
|
||||||
// jpeg
|
// jpeg
|
||||||
ts->printf(ts->LOG, "image type depth:%d channels:%d ext: %s\n", CV_8U, num_channels, ".jpg");
|
ts->printf(ts->LOG, "image type depth:%d channels:%d ext: %s\n", CV_8U, num_channels, ".jpg");
|
||||||
Mat img(img_r * k, img_c * k, CV_MAKETYPE(CV_8U, num_channels), Scalar::all(0));
|
Mat img(img_r * k, img_c * k, CV_MAKETYPE(CV_8U, num_channels), Scalar::all(0));
|
||||||
circle(img, Point2i((img_c * k) / 2, (img_r * k) / 2), cv::min((img_r * k), (img_c * k)) / 4 , Scalar::all(255));
|
circle(img, Point2i((img_c * k) / 2, (img_r * k) / 2), cv::min((img_r * k), (img_c * k)) / 4 , Scalar::all(255));
|
||||||
string filename = string(ts->get_data_path() + "readwrite/test_" + char(k + 48) + "_c" + char(num_channels + 48) + "_.jpg");
|
|
||||||
|
string filename = cv::tempfile(".jpg");
|
||||||
imwrite(filename, img);
|
imwrite(filename, img);
|
||||||
img = imread(filename, CV_LOAD_IMAGE_UNCHANGED);
|
img = imread(filename, CV_LOAD_IMAGE_UNCHANGED);
|
||||||
|
|
||||||
@ -142,14 +154,17 @@ public:
|
|||||||
ts->set_failed_test_info(ts->FAIL_MISMATCH);
|
ts->set_failed_test_info(ts->FAIL_MISMATCH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_TIFF
|
||||||
for (int num_channels = 1; num_channels <= 3; num_channels+=2)
|
for (int num_channels = 1; num_channels <= 3; num_channels+=2)
|
||||||
{
|
{
|
||||||
// tiff
|
// tiff
|
||||||
ts->printf(ts->LOG, "image type depth:%d channels:%d ext: %s\n", CV_16U, num_channels, ".tiff");
|
ts->printf(ts->LOG, "image type depth:%d channels:%d ext: %s\n", CV_16U, num_channels, ".tiff");
|
||||||
Mat img(img_r * k, img_c * k, CV_MAKETYPE(CV_16U, num_channels), Scalar::all(0));
|
Mat img(img_r * k, img_c * k, CV_MAKETYPE(CV_16U, num_channels), Scalar::all(0));
|
||||||
circle(img, Point2i((img_c * k) / 2, (img_r * k) / 2), cv::min((img_r * k), (img_c * k)) / 4 , Scalar::all(255));
|
circle(img, Point2i((img_c * k) / 2, (img_r * k) / 2), cv::min((img_r * k), (img_c * k)) / 4 , Scalar::all(255));
|
||||||
string filename = string(ts->get_data_path() + "readwrite/test.tiff");
|
|
||||||
|
string filename = cv::tempfile(".tiff");
|
||||||
imwrite(filename, img);
|
imwrite(filename, img);
|
||||||
ts->printf(ts->LOG, "reading test image : %s\n", filename.c_str());
|
ts->printf(ts->LOG, "reading test image : %s\n", filename.c_str());
|
||||||
Mat img_test = imread(filename, CV_LOAD_IMAGE_UNCHANGED);
|
Mat img_test = imread(filename, CV_LOAD_IMAGE_UNCHANGED);
|
||||||
@ -171,6 +186,7 @@ public:
|
|||||||
ts->set_failed_test_info(ts->FAIL_MISMATCH);
|
ts->set_failed_test_info(ts->FAIL_MISMATCH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch(const cv::Exception & e)
|
catch(const cv::Exception & e)
|
||||||
@ -205,9 +221,7 @@ public:
|
|||||||
TEST(Highgui_Image, write_big) { CV_GrfmtWriteBigImageTest test; test.safe_run(); }
|
TEST(Highgui_Image, write_big) { CV_GrfmtWriteBigImageTest test; test.safe_run(); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HAVE_PNG) && defined(HAVE_TIFF) && defined(HAVE_JPEG)
|
|
||||||
TEST(Highgui_Image, write_imageseq) { CV_GrfmtWriteSequenceImageTest test; test.safe_run(); }
|
TEST(Highgui_Image, write_imageseq) { CV_GrfmtWriteSequenceImageTest test; test.safe_run(); }
|
||||||
#endif
|
|
||||||
|
|
||||||
TEST(Highgui_Image, read_bmp_rle8) { CV_GrfmtReadBMPRLE8Test test; test.safe_run(); }
|
TEST(Highgui_Image, read_bmp_rle8) { CV_GrfmtReadBMPRLE8Test test; test.safe_run(); }
|
||||||
|
|
||||||
|
@ -155,7 +155,7 @@ void CV_HighGuiTest::ImageTest(const string& dir)
|
|||||||
for(size_t i = 0; i < ext_num; ++i)
|
for(size_t i = 0; i < ext_num; ++i)
|
||||||
{
|
{
|
||||||
string ext = exts[i];
|
string ext = exts[i];
|
||||||
string full_name = "img." + ext;
|
string full_name = cv::tempfile(ext.c_str());
|
||||||
ts->printf(ts->LOG, " full_name : %s\n", full_name.c_str());
|
ts->printf(ts->LOG, " full_name : %s\n", full_name.c_str());
|
||||||
|
|
||||||
imwrite(full_name, image);
|
imwrite(full_name, image);
|
||||||
@ -225,7 +225,7 @@ void CV_HighGuiTest::ImageTest(const string& dir)
|
|||||||
void CV_HighGuiTest::VideoTest(const string& dir, const cvtest::VideoFormat& fmt)
|
void CV_HighGuiTest::VideoTest(const string& dir, const cvtest::VideoFormat& fmt)
|
||||||
{
|
{
|
||||||
string src_file = dir + "../cv/shared/video_for_test.avi";
|
string src_file = dir + "../cv/shared/video_for_test.avi";
|
||||||
string tmp_name = format("video_%s.%s", cvtest::fourccToString(fmt.fourcc).c_str(), fmt.ext.c_str());
|
string tmp_name = cv::tempfile((cvtest::fourccToString(fmt.fourcc) + "." + fmt.ext).c_str());
|
||||||
|
|
||||||
ts->printf(ts->LOG, "reading video : %s and converting it to %s\n", src_file.c_str(), tmp_name.c_str());
|
ts->printf(ts->LOG, "reading video : %s and converting it to %s\n", src_file.c_str(), tmp_name.c_str());
|
||||||
|
|
||||||
@ -291,8 +291,8 @@ void CV_HighGuiTest::VideoTest(const string& dir, const cvtest::VideoFormat& fmt
|
|||||||
if (psnr < thresDbell)
|
if (psnr < thresDbell)
|
||||||
{
|
{
|
||||||
printf("Too low psnr = %gdb\n", psnr);
|
printf("Too low psnr = %gdb\n", psnr);
|
||||||
imwrite("img.png", img);
|
// imwrite("img.png", img);
|
||||||
imwrite("img1.png", img1);
|
// imwrite("img1.png", img1);
|
||||||
ts->set_failed_test_info(ts->FAIL_MISMATCH);
|
ts->set_failed_test_info(ts->FAIL_MISMATCH);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -323,7 +323,7 @@ void CV_HighGuiTest::SpecificImageTest(const string& dir)
|
|||||||
|
|
||||||
stringstream s_digit; s_digit << i;
|
stringstream s_digit; s_digit << i;
|
||||||
|
|
||||||
string full_name = "img_"+s_digit.str()+".bmp";
|
string full_name = cv::tempfile((s_digit.str() + ".bmp").c_str());
|
||||||
ts->printf(ts->LOG, " full_name : %s\n", full_name.c_str());
|
ts->printf(ts->LOG, " full_name : %s\n", full_name.c_str());
|
||||||
|
|
||||||
imwrite(full_name, image);
|
imwrite(full_name, image);
|
||||||
@ -395,7 +395,7 @@ void CV_HighGuiTest::SpecificVideoTest(const string& dir, const cvtest::VideoFor
|
|||||||
int fourcc = fmt.fourcc;
|
int fourcc = fmt.fourcc;
|
||||||
|
|
||||||
string fourcc_str = cvtest::fourccToString(fourcc);
|
string fourcc_str = cvtest::fourccToString(fourcc);
|
||||||
const string video_file = "video_" + fourcc_str + "." + ext;
|
const string video_file = cv::tempfile((fourcc_str + "." + ext).c_str());
|
||||||
|
|
||||||
Size frame_size(968 & -2, 757 & -2);
|
Size frame_size(968 & -2, 757 & -2);
|
||||||
VideoWriter writer(video_file, fourcc, 25, frame_size, true);
|
VideoWriter writer(video_file, fourcc, 25, frame_size, true);
|
||||||
|
@ -65,13 +65,11 @@ public:
|
|||||||
|
|
||||||
string getFilename(const cvtest::VideoFormat& fmt)
|
string getFilename(const cvtest::VideoFormat& fmt)
|
||||||
{
|
{
|
||||||
return format("test_video_%s.%s", cvtest::fourccToString(fmt.fourcc).c_str(), fmt.ext.c_str());
|
return cv::tempfile((cvtest::fourccToString(fmt.fourcc) + "." + fmt.ext).c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CreateTestVideo(const cvtest::VideoFormat& fmt, int framecount)
|
bool CreateTestVideo(const cvtest::VideoFormat& fmt, int framecount, string filename)
|
||||||
{
|
{
|
||||||
string filename = getFilename(fmt);
|
|
||||||
|
|
||||||
VideoWriter writer(filename, fmt.fourcc, 25, framesize, true);
|
VideoWriter writer(filename, fmt.fourcc, 25, framesize, true);
|
||||||
if( !writer.isOpened() )
|
if( !writer.isOpened() )
|
||||||
return false;
|
return false;
|
||||||
@ -96,7 +94,7 @@ public:
|
|||||||
string filename = getFilename(fmt);
|
string filename = getFilename(fmt);
|
||||||
ts->printf(ts->LOG, "\nFile: %s\n", filename.c_str());
|
ts->printf(ts->LOG, "\nFile: %s\n", filename.c_str());
|
||||||
|
|
||||||
if( !CreateTestVideo(fmt, n_frames) )
|
if( !CreateTestVideo(fmt, n_frames, filename) )
|
||||||
{
|
{
|
||||||
ts->printf(ts->LOG, "\nError: cannot create video file");
|
ts->printf(ts->LOG, "\nError: cannot create video file");
|
||||||
ts->set_failed_test_info(ts->FAIL_INVALID_OUTPUT);
|
ts->set_failed_test_info(ts->FAIL_INVALID_OUTPUT);
|
||||||
@ -145,8 +143,8 @@ public:
|
|||||||
idx1, idx);
|
idx1, idx);
|
||||||
ts->printf(ts->LOG, "Saving both frames ...\n");
|
ts->printf(ts->LOG, "Saving both frames ...\n");
|
||||||
ts->set_failed_test_info(ts->FAIL_INVALID_OUTPUT);
|
ts->set_failed_test_info(ts->FAIL_INVALID_OUTPUT);
|
||||||
imwrite("opencv_test_highgui_postest_actual.png", img);
|
// imwrite("opencv_test_highgui_postest_actual.png", img);
|
||||||
imwrite("opencv_test_highgui_postest_expected.png", img0);
|
// imwrite("opencv_test_highgui_postest_expected.png", img0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -164,8 +162,8 @@ public:
|
|||||||
ts->printf(ts->LOG, "The frame read after positioning to %d is incorrect (PSNR=%g)\n", idx, err);
|
ts->printf(ts->LOG, "The frame read after positioning to %d is incorrect (PSNR=%g)\n", idx, err);
|
||||||
ts->printf(ts->LOG, "Saving both frames ...\n");
|
ts->printf(ts->LOG, "Saving both frames ...\n");
|
||||||
ts->set_failed_test_info(ts->FAIL_INVALID_OUTPUT);
|
ts->set_failed_test_info(ts->FAIL_INVALID_OUTPUT);
|
||||||
imwrite("opencv_test_highgui_postest_actual.png", img);
|
// imwrite("opencv_test_highgui_postest_actual.png", img);
|
||||||
imwrite("opencv_test_highgui_postest_expected.png", img0);
|
// imwrite("opencv_test_highgui_postest_expected.png", img0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
#Wed Jun 29 04:36:40 MSD 2011
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.5
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.5
|
@ -922,7 +922,7 @@ extern "C" {
|
|||||||
|
|
||||||
self.save(output_path+"/"+module+".txt", report.getvalue())
|
self.save(output_path+"/"+module+".txt", report.getvalue())
|
||||||
|
|
||||||
print "Done %i of %i funcs." % (len(self.ported_func_list), len(self.ported_func_list)+ len(self.skipped_func_list))
|
#print "Done %i of %i funcs." % (len(self.ported_func_list), len(self.ported_func_list)+ len(self.skipped_func_list))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1402,7 +1402,7 @@ if __name__ == "__main__":
|
|||||||
import hdr_parser
|
import hdr_parser
|
||||||
module = sys.argv[2]
|
module = sys.argv[2]
|
||||||
srcfiles = sys.argv[3:]
|
srcfiles = sys.argv[3:]
|
||||||
print "Generating module '" + module + "' from headers:\n\t" + "\n\t".join(srcfiles)
|
#print "Generating module '" + module + "' from headers:\n\t" + "\n\t".join(srcfiles)
|
||||||
generator = JavaWrapperGenerator()
|
generator = JavaWrapperGenerator()
|
||||||
generator.gen(srcfiles, module, dstdir)
|
generator.gen(srcfiles, module, dstdir)
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
ocv_define_module(legacy opencv_calib3d opencv_highgui opencv_video opencv_ml)
|
ocv_define_module(legacy opencv_calib3d opencv_video opencv_ml OPTIONAL opencv_highgui)
|
||||||
|
@ -17,16 +17,16 @@
|
|||||||
* Redistribution and use in source and binary forms, with or
|
* Redistribution and use in source and binary forms, with or
|
||||||
* without modification, are permitted provided that the following
|
* without modification, are permitted provided that the following
|
||||||
* conditions are met:
|
* conditions are met:
|
||||||
* Redistributions of source code must retain the above
|
* Redistributions of source code must retain the above
|
||||||
* copyright notice, this list of conditions and the following
|
* copyright notice, this list of conditions and the following
|
||||||
* disclaimer.
|
* disclaimer.
|
||||||
* Redistributions in binary form must reproduce the above
|
* Redistributions in binary form must reproduce the above
|
||||||
* copyright notice, this list of conditions and the following
|
* copyright notice, this list of conditions and the following
|
||||||
* disclaimer in the documentation and/or other materials
|
* disclaimer in the documentation and/or other materials
|
||||||
* provided with the distribution.
|
* provided with the distribution.
|
||||||
* The name of Contributor may not be used to endorse or
|
* The name of Contributor may not be used to endorse or
|
||||||
* promote products derived from this software without
|
* promote products derived from this software without
|
||||||
* specific prior written permission.
|
* specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
@ -89,7 +89,7 @@ cvExtractSURF( const CvArr* _img, const CvArr* _mask,
|
|||||||
*_keypoints = cvCreateSeq(0, sizeof(CvSeq), sizeof(CvSURFPoint), storage);
|
*_keypoints = cvCreateSeq(0, sizeof(CvSeq), sizeof(CvSURFPoint), storage);
|
||||||
|
|
||||||
if( _descriptors )
|
if( _descriptors )
|
||||||
*_descriptors = cvCreateSeq(0, sizeof(CvSeq), descr.cols*descr.elemSize(), storage);
|
*_descriptors = cvCreateSeq(0, sizeof(CvSeq), surf->descriptorSize() * CV_ELEM_SIZE(surf->descriptorType()), storage);
|
||||||
|
|
||||||
for( size_t i = 0; i < kpt.size(); i++ )
|
for( size_t i = 0; i < kpt.size(); i++ )
|
||||||
{
|
{
|
||||||
|
@ -46,7 +46,10 @@
|
|||||||
// */
|
// */
|
||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
#include "opencv2/highgui/highgui_c.h"
|
#include "opencv2/opencv_modules.hpp"
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
|
# include "opencv2/highgui/highgui_c.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/////////////////////////////// CvImage implementation //////////////////////////////////
|
/////////////////////////////// CvImage implementation //////////////////////////////////
|
||||||
|
|
||||||
@ -112,8 +115,10 @@ bool CvImage::load( const char* filename, const char* imgname, int color )
|
|||||||
img = temp_img;
|
img = temp_img;
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
else
|
else
|
||||||
img = cvLoadImage( filename, color );
|
img = cvLoadImage( filename, color );
|
||||||
|
#endif
|
||||||
|
|
||||||
attach( img );
|
attach( img );
|
||||||
return img != 0;
|
return img != 0;
|
||||||
@ -161,8 +166,12 @@ void CvImage::save( const char* filename, const char* imgname, const int* params
|
|||||||
return;
|
return;
|
||||||
if( icvIsXmlOrYaml( filename ) )
|
if( icvIsXmlOrYaml( filename ) )
|
||||||
cvSave( filename, image, imgname );
|
cvSave( filename, image, imgname );
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
else
|
else
|
||||||
cvSaveImage( filename, image, params );
|
cvSaveImage( filename, image, params );
|
||||||
|
#else
|
||||||
|
(void)params;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -175,8 +184,12 @@ void CvImage::write( CvFileStorage* fs, const char* imgname )
|
|||||||
|
|
||||||
void CvImage::show( const char* window_name )
|
void CvImage::show( const char* window_name )
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
if( image )
|
if( image )
|
||||||
cvShowImage( window_name, image );
|
cvShowImage( window_name, image );
|
||||||
|
#else
|
||||||
|
(void)window_name;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -238,8 +251,10 @@ bool CvMatrix::load( const char* filename, const char* matname, int color )
|
|||||||
m = temp_mat;
|
m = temp_mat;
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
else
|
else
|
||||||
m = cvLoadImageM( filename, color );
|
m = cvLoadImageM( filename, color );
|
||||||
|
#endif
|
||||||
|
|
||||||
set( m, false );
|
set( m, false );
|
||||||
return m != 0;
|
return m != 0;
|
||||||
@ -287,8 +302,12 @@ void CvMatrix::save( const char* filename, const char* matname, const int* param
|
|||||||
return;
|
return;
|
||||||
if( icvIsXmlOrYaml( filename ) )
|
if( icvIsXmlOrYaml( filename ) )
|
||||||
cvSave( filename, matrix, matname );
|
cvSave( filename, matrix, matname );
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
else
|
else
|
||||||
cvSaveImage( filename, matrix, params );
|
cvSaveImage( filename, matrix, params );
|
||||||
|
#else
|
||||||
|
(void)params;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -301,8 +320,12 @@ void CvMatrix::write( CvFileStorage* fs, const char* matname )
|
|||||||
|
|
||||||
void CvMatrix::show( const char* window_name )
|
void CvMatrix::show( const char* window_name )
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
if( matrix )
|
if( matrix )
|
||||||
cvShowImage( window_name, matrix );
|
cvShowImage( window_name, matrix );
|
||||||
|
#else
|
||||||
|
(void)window_name;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,7 +8,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
#include "opencv2/highgui/highgui.hpp"
|
#include "opencv2/opencv_modules.hpp"
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
|
# include "opencv2/highgui/highgui.hpp"
|
||||||
|
#endif
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
namespace cv{
|
namespace cv{
|
||||||
@ -665,7 +668,11 @@ namespace cv{
|
|||||||
cvMinMaxLoc(m_samples[i], 0, &maxval);
|
cvMinMaxLoc(m_samples[i], 0, &maxval);
|
||||||
cvConvertScale(m_samples[i], patch, 255/maxval);
|
cvConvertScale(m_samples[i], patch, 255/maxval);
|
||||||
|
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
cvSaveImage(buf, patch);
|
cvSaveImage(buf, patch);
|
||||||
|
#else
|
||||||
|
CV_Error(CV_StsNotImplemented, "OpenCV has been compiled without image I/O support");
|
||||||
|
#endif
|
||||||
|
|
||||||
cvReleaseImage(&patch);
|
cvReleaseImage(&patch);
|
||||||
}
|
}
|
||||||
@ -1794,7 +1801,12 @@ namespace cv{
|
|||||||
sprintf(filename, "%s/%s", path, imagename);
|
sprintf(filename, "%s/%s", path, imagename);
|
||||||
|
|
||||||
//printf("Reading image %s...", filename);
|
//printf("Reading image %s...", filename);
|
||||||
IplImage* img = cvLoadImage(filename, CV_LOAD_IMAGE_GRAYSCALE);
|
IplImage* img = 0;
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
|
img = cvLoadImage(filename, CV_LOAD_IMAGE_GRAYSCALE);
|
||||||
|
#else
|
||||||
|
CV_Error(CV_StsNotImplemented, "OpenCV has been compiled without image I/O support");
|
||||||
|
#endif
|
||||||
//printf("done\n");
|
//printf("done\n");
|
||||||
|
|
||||||
extractPatches (img, patches, patch_size);
|
extractPatches (img, patches, patch_size);
|
||||||
|
@ -398,7 +398,7 @@ protected:
|
|||||||
|
|
||||||
// Write out
|
// Write out
|
||||||
|
|
||||||
string filename = tempfile() + ".xml";
|
string filename = cv::tempfile(".xml");
|
||||||
{
|
{
|
||||||
FileStorage fs = FileStorage(filename, FileStorage::WRITE);
|
FileStorage fs = FileStorage(filename, FileStorage::WRITE);
|
||||||
try
|
try
|
||||||
|
@ -527,7 +527,7 @@ protected:
|
|||||||
firstResult.at<int>(i) = static_cast<int>(em.predict(samples.row(i))[1]);
|
firstResult.at<int>(i) = static_cast<int>(em.predict(samples.row(i))[1]);
|
||||||
|
|
||||||
// Write out
|
// Write out
|
||||||
string filename = tempfile() + ".xml";
|
string filename = cv::tempfile(".xml");
|
||||||
{
|
{
|
||||||
FileStorage fs = FileStorage(filename, FileStorage::WRITE);
|
FileStorage fs = FileStorage(filename, FileStorage::WRITE);
|
||||||
try
|
try
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
set(the_description "Object Detection")
|
set(the_description "Object Detection")
|
||||||
ocv_define_module(objdetect OPTIONAL opencv_highgui)
|
ocv_define_module(objdetect opencv_core opencv_imgproc OPTIONAL opencv_highgui)
|
||||||
|
@ -86,9 +86,6 @@ void CV_InpaintTest::run( int )
|
|||||||
inpaint( test, mask1ch, res1, 5, CV_INPAINT_NS );
|
inpaint( test, mask1ch, res1, 5, CV_INPAINT_NS );
|
||||||
inpaint( test, mask1ch, res2, 5, CV_INPAINT_TELEA );
|
inpaint( test, mask1ch, res2, 5, CV_INPAINT_TELEA );
|
||||||
|
|
||||||
imwrite("d:/exp1.png", res1);
|
|
||||||
imwrite("d:/exp2.png", res2);
|
|
||||||
|
|
||||||
Mat diff1, diff2;
|
Mat diff1, diff2;
|
||||||
absdiff( orig, res1, diff1 );
|
absdiff( orig, res1, diff1 );
|
||||||
absdiff( orig, res2, diff2 );
|
absdiff( orig, res2, diff2 );
|
||||||
|
@ -37,8 +37,6 @@ for l in open("%s/api" % sys.argv[1]):
|
|||||||
# Validation: check that any optional arguments are last
|
# Validation: check that any optional arguments are last
|
||||||
had_error = False
|
had_error = False
|
||||||
for (f, args, ty, flags) in api:
|
for (f, args, ty, flags) in api:
|
||||||
if f == 'PolarToCart':
|
|
||||||
print f, [(a.init != None) for a in args]
|
|
||||||
has_init = [(a.init != None) for a in args if not 'O' in a.flags]
|
has_init = [(a.init != None) for a in args if not 'O' in a.flags]
|
||||||
if True in has_init and not all(has_init[has_init.index(True):]):
|
if True in has_init and not all(has_init[has_init.index(True):]):
|
||||||
print 'Error in definition for "%s", optional arguments must be last' % f
|
print 'Error in definition for "%s", optional arguments must be last' % f
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -250,7 +250,7 @@ class RunInfo(object):
|
|||||||
self.adb = "adb"
|
self.adb = "adb"
|
||||||
if options.adb_serial:
|
if options.adb_serial:
|
||||||
self.adb = [self.adb, "-s", options.adb_serial]
|
self.adb = [self.adb, "-s", options.adb_serial]
|
||||||
else:
|
else:
|
||||||
self.adb = [self.adb]
|
self.adb = [self.adb]
|
||||||
try:
|
try:
|
||||||
output = Popen(self.adb + ["shell", "ls"], stdout=PIPE, stderr=PIPE).communicate()
|
output = Popen(self.adb + ["shell", "ls"], stdout=PIPE, stderr=PIPE).communicate()
|
||||||
@ -653,10 +653,11 @@ class RunInfo(object):
|
|||||||
elif self.targetos == "android":
|
elif self.targetos == "android":
|
||||||
hostlogpath = ""
|
hostlogpath = ""
|
||||||
usercolor = [a for a in args if a.startswith("--gtest_color=")]
|
usercolor = [a for a in args if a.startswith("--gtest_color=")]
|
||||||
if len(userlog) == 0 and _stdout.isatty() and hostos != "nt":
|
if len(usercolor) == 0 and _stdout.isatty() and hostos != "nt":
|
||||||
args.append("--gtest_color=yes")
|
args.append("--gtest_color=yes")
|
||||||
try:
|
try:
|
||||||
andoidcwd = "/data/bin/" + getpass.getuser().replace(" ","") + "_" + self.options.mode +"/"
|
tempdir = "/data/local/tmp/"
|
||||||
|
andoidcwd = tempdir + getpass.getuser().replace(" ","") + "_" + self.options.mode +"/"
|
||||||
exename = os.path.basename(exe)
|
exename = os.path.basename(exe)
|
||||||
androidexe = andoidcwd + exename
|
androidexe = andoidcwd + exename
|
||||||
#upload
|
#upload
|
||||||
@ -692,6 +693,9 @@ class RunInfo(object):
|
|||||||
return
|
return
|
||||||
#rm log
|
#rm log
|
||||||
Popen(self.adb + ["shell", "rm " + andoidcwd + logfile], stdout=_stdout, stderr=_stderr).wait()
|
Popen(self.adb + ["shell", "rm " + andoidcwd + logfile], stdout=_stdout, stderr=_stderr).wait()
|
||||||
|
|
||||||
|
# clean temporary files
|
||||||
|
Popen(self.adb + ["shell", "rm " + tempdir + "__opencv_temp.*"], stdout=_stdout, stderr=_stderr).wait()
|
||||||
except OSError:
|
except OSError:
|
||||||
pass
|
pass
|
||||||
if os.path.isfile(hostlogpath):
|
if os.path.isfile(hostlogpath):
|
||||||
@ -709,6 +713,17 @@ class RunInfo(object):
|
|||||||
except OSError:
|
except OSError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# clean temporary files
|
||||||
|
temp_path = os.environ.get('OPENCV_TEMP_PATH')
|
||||||
|
if not temp_path:
|
||||||
|
if hostos == "nt":
|
||||||
|
temp_path = tempfile.gettempdir()
|
||||||
|
else:
|
||||||
|
temp_path = "/tmp"
|
||||||
|
|
||||||
|
for filename in glob.glob(os.path.join(temp_path, "__opencv_temp.*")) :
|
||||||
|
os.remove( filename )
|
||||||
|
|
||||||
logpath = os.path.join(workingDir, logfile)
|
logpath = os.path.join(workingDir, logfile)
|
||||||
if os.path.isfile(logpath):
|
if os.path.isfile(logpath):
|
||||||
return logpath
|
return logpath
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
# pragma GCC diagnostic ignored "-Wmissing-declarations"
|
# pragma GCC diagnostic ignored "-Wmissing-declarations"
|
||||||
|
# pragma GCC diagnostic ignored "-Wmissing-field-initializers"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// The following lines pull in the real gtest *.cc files.
|
// The following lines pull in the real gtest *.cc files.
|
||||||
@ -300,7 +301,7 @@ class GTEST_API_ SingleFailureChecker {
|
|||||||
(substr));\
|
(substr));\
|
||||||
{\
|
{\
|
||||||
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
|
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
|
||||||
::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\
|
::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \
|
||||||
>est_failures);\
|
>est_failures);\
|
||||||
if (::testing::internal::AlwaysTrue()) { statement; }\
|
if (::testing::internal::AlwaysTrue()) { statement; }\
|
||||||
}\
|
}\
|
||||||
@ -313,6 +314,7 @@ class GTEST_API_ SingleFailureChecker {
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#include <wctype.h>
|
#include <wctype.h>
|
||||||
|
|
||||||
@ -514,6 +516,12 @@ GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
|
|||||||
// Formats the given time in milliseconds as seconds.
|
// Formats the given time in milliseconds as seconds.
|
||||||
GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
|
GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
|
||||||
|
|
||||||
|
// Converts the given time in milliseconds to a date string in the ISO 8601
|
||||||
|
// format, without the timezone information. N.B.: due to the use the
|
||||||
|
// non-reentrant localtime() function, this function is not thread safe. Do
|
||||||
|
// not use it in any code that can be called from multiple threads.
|
||||||
|
GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms);
|
||||||
|
|
||||||
// Parses a string for an Int32 flag, in the form of "--flag=value".
|
// Parses a string for an Int32 flag, in the form of "--flag=value".
|
||||||
//
|
//
|
||||||
// On success, stores the value of the flag in *value, and returns
|
// On success, stores the value of the flag in *value, and returns
|
||||||
@ -592,6 +600,7 @@ class GTestFlagSaver {
|
|||||||
GTEST_FLAG(stream_result_to) = stream_result_to_;
|
GTEST_FLAG(stream_result_to) = stream_result_to_;
|
||||||
GTEST_FLAG(throw_on_failure) = throw_on_failure_;
|
GTEST_FLAG(throw_on_failure) = throw_on_failure_;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Fields for saving the original values of flags.
|
// Fields for saving the original values of flags.
|
||||||
bool also_run_disabled_tests_;
|
bool also_run_disabled_tests_;
|
||||||
@ -834,8 +843,11 @@ class OsStackTraceGetterInterface {
|
|||||||
class OsStackTraceGetter : public OsStackTraceGetterInterface {
|
class OsStackTraceGetter : public OsStackTraceGetterInterface {
|
||||||
public:
|
public:
|
||||||
OsStackTraceGetter() : caller_frame_(NULL) {}
|
OsStackTraceGetter() : caller_frame_(NULL) {}
|
||||||
virtual String CurrentStackTrace(int max_depth, int skip_count);
|
|
||||||
virtual void UponLeavingGTest();
|
virtual String CurrentStackTrace(int max_depth, int skip_count)
|
||||||
|
GTEST_LOCK_EXCLUDED_(mutex_);
|
||||||
|
|
||||||
|
virtual void UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_);
|
||||||
|
|
||||||
// This string is inserted in place of stack frames that are part of
|
// This string is inserted in place of stack frames that are part of
|
||||||
// Google Test's implementation.
|
// Google Test's implementation.
|
||||||
@ -950,6 +962,10 @@ class GTEST_API_ UnitTestImpl {
|
|||||||
// Gets the number of tests that should run.
|
// Gets the number of tests that should run.
|
||||||
int test_to_run_count() const;
|
int test_to_run_count() const;
|
||||||
|
|
||||||
|
// Gets the time of the test program start, in ms from the start of the
|
||||||
|
// UNIX epoch.
|
||||||
|
TimeInMillis start_timestamp() const { return start_timestamp_; }
|
||||||
|
|
||||||
// Gets the elapsed time, in milliseconds.
|
// Gets the elapsed time, in milliseconds.
|
||||||
TimeInMillis elapsed_time() const { return elapsed_time_; }
|
TimeInMillis elapsed_time() const { return elapsed_time_; }
|
||||||
|
|
||||||
@ -1008,7 +1024,7 @@ class GTEST_API_ UnitTestImpl {
|
|||||||
// For example, if Foo() calls Bar(), which in turn calls
|
// For example, if Foo() calls Bar(), which in turn calls
|
||||||
// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
|
// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
|
||||||
// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
|
// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
|
||||||
String CurrentOsStackTraceExceptTop(int skip_count);
|
String CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;
|
||||||
|
|
||||||
// Finds and returns a TestCase with the given name. If one doesn't
|
// Finds and returns a TestCase with the given name. If one doesn't
|
||||||
// exist, creates one and returns it.
|
// exist, creates one and returns it.
|
||||||
@ -1282,6 +1298,10 @@ class GTEST_API_ UnitTestImpl {
|
|||||||
// Our random number generator.
|
// Our random number generator.
|
||||||
internal::Random random_;
|
internal::Random random_;
|
||||||
|
|
||||||
|
// The time of the test program start, in ms from the start of the
|
||||||
|
// UNIX epoch.
|
||||||
|
TimeInMillis start_timestamp_;
|
||||||
|
|
||||||
// How long the test took to run, in milliseconds.
|
// How long the test took to run, in milliseconds.
|
||||||
TimeInMillis elapsed_time_;
|
TimeInMillis elapsed_time_;
|
||||||
|
|
||||||
@ -1613,7 +1633,7 @@ UInt32 Random::Generate(UInt32 range) {
|
|||||||
// Test. g_init_gtest_count is set to the number of times
|
// Test. g_init_gtest_count is set to the number of times
|
||||||
// InitGoogleTest() has been called. We don't protect this variable
|
// InitGoogleTest() has been called. We don't protect this variable
|
||||||
// under a mutex as it is only accessed in the main thread.
|
// under a mutex as it is only accessed in the main thread.
|
||||||
int g_init_gtest_count = 0;
|
GTEST_API_ int g_init_gtest_count = 0;
|
||||||
static bool GTestIsInitialized() { return g_init_gtest_count != 0; }
|
static bool GTestIsInitialized() { return g_init_gtest_count != 0; }
|
||||||
|
|
||||||
// Iterates over a vector of TestCases, keeping a running sum of the
|
// Iterates over a vector of TestCases, keeping a running sum of the
|
||||||
@ -1668,7 +1688,7 @@ void AssertHelper::operator=(const Message& message) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Mutex for linked pointers.
|
// Mutex for linked pointers.
|
||||||
GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
|
GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
|
||||||
|
|
||||||
// Application pathname gotten in InitGoogleTest.
|
// Application pathname gotten in InitGoogleTest.
|
||||||
String g_executable_path;
|
String g_executable_path;
|
||||||
@ -2125,17 +2145,6 @@ TimeInMillis GetTimeInMillis() {
|
|||||||
|
|
||||||
// class String
|
// class String
|
||||||
|
|
||||||
// Returns the input enclosed in double quotes if it's not NULL;
|
|
||||||
// otherwise returns "(null)". For example, "\"Hello\"" is returned
|
|
||||||
// for input "Hello".
|
|
||||||
//
|
|
||||||
// This is useful for printing a C string in the syntax of a literal.
|
|
||||||
//
|
|
||||||
// Known issue: escape sequences are not handled yet.
|
|
||||||
String String::ShowCStringQuoted(const char* c_str) {
|
|
||||||
return c_str ? String::Format("\"%s\"", c_str) : String("(null)");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copies at most length characters from str into a newly-allocated
|
// Copies at most length characters from str into a newly-allocated
|
||||||
// piece of memory of size length+1. The memory is allocated with new[].
|
// piece of memory of size length+1. The memory is allocated with new[].
|
||||||
// A terminating null byte is written to the memory, and a pointer to it
|
// A terminating null byte is written to the memory, and a pointer to it
|
||||||
@ -2476,8 +2485,8 @@ AssertionResult CmpHelperSTREQ(const char* expected_expression,
|
|||||||
|
|
||||||
return EqFailure(expected_expression,
|
return EqFailure(expected_expression,
|
||||||
actual_expression,
|
actual_expression,
|
||||||
String::ShowCStringQuoted(expected),
|
PrintToString(expected),
|
||||||
String::ShowCStringQuoted(actual),
|
PrintToString(actual),
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2492,8 +2501,8 @@ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
|
|||||||
|
|
||||||
return EqFailure(expected_expression,
|
return EqFailure(expected_expression,
|
||||||
actual_expression,
|
actual_expression,
|
||||||
String::ShowCStringQuoted(expected),
|
PrintToString(expected),
|
||||||
String::ShowCStringQuoted(actual),
|
PrintToString(actual),
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2841,15 +2850,6 @@ String String::ShowWideCString(const wchar_t * wide_c_str) {
|
|||||||
return String(internal::WideStringToUtf8(wide_c_str, -1).c_str());
|
return String(internal::WideStringToUtf8(wide_c_str, -1).c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Similar to ShowWideCString(), except that this function encloses
|
|
||||||
// the converted string in double quotes.
|
|
||||||
String String::ShowWideCStringQuoted(const wchar_t* wide_c_str) {
|
|
||||||
if (wide_c_str == NULL) return String("(null)");
|
|
||||||
|
|
||||||
return String::Format("L\"%s\"",
|
|
||||||
String::ShowWideCString(wide_c_str).c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compares two wide C strings. Returns true iff they have the same
|
// Compares two wide C strings. Returns true iff they have the same
|
||||||
// content.
|
// content.
|
||||||
//
|
//
|
||||||
@ -2875,8 +2875,8 @@ AssertionResult CmpHelperSTREQ(const char* expected_expression,
|
|||||||
|
|
||||||
return EqFailure(expected_expression,
|
return EqFailure(expected_expression,
|
||||||
actual_expression,
|
actual_expression,
|
||||||
String::ShowWideCStringQuoted(expected),
|
PrintToString(expected),
|
||||||
String::ShowWideCStringQuoted(actual),
|
PrintToString(actual),
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2891,8 +2891,8 @@ AssertionResult CmpHelperSTRNE(const char* s1_expression,
|
|||||||
|
|
||||||
return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
|
return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
|
||||||
<< s2_expression << "), actual: "
|
<< s2_expression << "), actual: "
|
||||||
<< String::ShowWideCStringQuoted(s1)
|
<< PrintToString(s1)
|
||||||
<< " vs " << String::ShowWideCStringQuoted(s2);
|
<< " vs " << PrintToString(s2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compares two C strings, ignoring case. Returns true iff they have
|
// Compares two C strings, ignoring case. Returns true iff they have
|
||||||
@ -4015,8 +4015,6 @@ class PrettyUnitTestResultPrinter : public TestEventListener {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
static void PrintFailedTests(const UnitTest& unit_test);
|
static void PrintFailedTests(const UnitTest& unit_test);
|
||||||
|
|
||||||
internal::String test_case_name_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Fired before each iteration of tests starts.
|
// Fired before each iteration of tests starts.
|
||||||
@ -4063,11 +4061,10 @@ void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
|
void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
|
||||||
test_case_name_ = test_case.name();
|
|
||||||
const internal::String counts =
|
const internal::String counts =
|
||||||
FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
|
FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
|
||||||
ColoredPrintf(COLOR_GREEN, "[----------] ");
|
ColoredPrintf(COLOR_GREEN, "[----------] ");
|
||||||
printf("%s from %s", counts.c_str(), test_case_name_.c_str());
|
printf("%s from %s", counts.c_str(), test_case.name());
|
||||||
if (test_case.type_param() == NULL) {
|
if (test_case.type_param() == NULL) {
|
||||||
printf("\n");
|
printf("\n");
|
||||||
} else {
|
} else {
|
||||||
@ -4078,7 +4075,7 @@ void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
|
|||||||
|
|
||||||
void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
|
void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
|
||||||
ColoredPrintf(COLOR_GREEN, "[ RUN ] ");
|
ColoredPrintf(COLOR_GREEN, "[ RUN ] ");
|
||||||
PrintTestName(test_case_name_.c_str(), test_info.name());
|
PrintTestName(test_info.test_case_name(), test_info.name());
|
||||||
printf("\n");
|
printf("\n");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
@ -4101,7 +4098,7 @@ void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
|
|||||||
} else {
|
} else {
|
||||||
ColoredPrintf(COLOR_RED, "[ FAILED ] ");
|
ColoredPrintf(COLOR_RED, "[ FAILED ] ");
|
||||||
}
|
}
|
||||||
PrintTestName(test_case_name_.c_str(), test_info.name());
|
PrintTestName(test_info.test_case_name(), test_info.name());
|
||||||
if (test_info.result()->Failed())
|
if (test_info.result()->Failed())
|
||||||
PrintFullTestCommentIfPresent(test_info);
|
PrintFullTestCommentIfPresent(test_info);
|
||||||
|
|
||||||
@ -4117,12 +4114,11 @@ void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
|
|||||||
void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
|
void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
|
||||||
if (!GTEST_FLAG(print_time)) return;
|
if (!GTEST_FLAG(print_time)) return;
|
||||||
|
|
||||||
test_case_name_ = test_case.name();
|
|
||||||
const internal::String counts =
|
const internal::String counts =
|
||||||
FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
|
FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
|
||||||
ColoredPrintf(COLOR_GREEN, "[----------] ");
|
ColoredPrintf(COLOR_GREEN, "[----------] ");
|
||||||
printf("%s from %s (%s ms total)\n\n",
|
printf("%s from %s (%s ms total)\n\n",
|
||||||
counts.c_str(), test_case_name_.c_str(),
|
counts.c_str(), test_case.name(),
|
||||||
internal::StreamableToString(test_case.elapsed_time()).c_str());
|
internal::StreamableToString(test_case.elapsed_time()).c_str());
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
@ -4507,6 +4503,32 @@ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
|
|||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Converts the given epoch time in milliseconds to a date string in the ISO
|
||||||
|
// 8601 format, without the timezone information.
|
||||||
|
std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
|
||||||
|
// Using non-reentrant version as localtime_r is not portable.
|
||||||
|
time_t seconds = static_cast<time_t>(ms / 1000);
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# pragma warning(push) // Saves the current warning state.
|
||||||
|
# pragma warning(disable:4996) // Temporarily disables warning 4996
|
||||||
|
// (function or variable may be unsafe).
|
||||||
|
const struct tm* const time_struct = localtime(&seconds); // NOLINT
|
||||||
|
# pragma warning(pop) // Restores the warning state again.
|
||||||
|
#else
|
||||||
|
const struct tm* const time_struct = localtime(&seconds); // NOLINT
|
||||||
|
#endif
|
||||||
|
if (time_struct == NULL)
|
||||||
|
return ""; // Invalid ms value
|
||||||
|
|
||||||
|
return String::Format("%d-%02d-%02dT%02d:%02d:%02d", // YYYY-MM-DDThh:mm:ss
|
||||||
|
time_struct->tm_year + 1900,
|
||||||
|
time_struct->tm_mon + 1,
|
||||||
|
time_struct->tm_mday,
|
||||||
|
time_struct->tm_hour,
|
||||||
|
time_struct->tm_min,
|
||||||
|
time_struct->tm_sec);
|
||||||
|
}
|
||||||
|
|
||||||
// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
|
// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
|
||||||
void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
|
void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
|
||||||
const char* data) {
|
const char* data) {
|
||||||
@ -4556,16 +4578,17 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
|
|||||||
for (int i = 0; i < result.total_part_count(); ++i) {
|
for (int i = 0; i < result.total_part_count(); ++i) {
|
||||||
const TestPartResult& part = result.GetTestPartResult(i);
|
const TestPartResult& part = result.GetTestPartResult(i);
|
||||||
if (part.failed()) {
|
if (part.failed()) {
|
||||||
if (++failures == 1)
|
if (++failures == 1) {
|
||||||
*stream << ">\n";
|
*stream << ">\n";
|
||||||
*stream << " <failure message=\""
|
}
|
||||||
<< EscapeXmlAttribute(part.summary()).c_str()
|
|
||||||
<< "\" type=\"\">";
|
|
||||||
const string location = internal::FormatCompilerIndependentFileLocation(
|
const string location = internal::FormatCompilerIndependentFileLocation(
|
||||||
part.file_name(), part.line_number());
|
part.file_name(), part.line_number());
|
||||||
const string message = location + "\n" + part.message();
|
const string summary = location + "\n" + part.summary();
|
||||||
OutputXmlCDataSection(stream,
|
*stream << " <failure message=\""
|
||||||
RemoveInvalidXmlCharacters(message).c_str());
|
<< EscapeXmlAttribute(summary.c_str())
|
||||||
|
<< "\" type=\"\">";
|
||||||
|
const string detail = location + "\n" + part.message();
|
||||||
|
OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());
|
||||||
*stream << "</failure>\n";
|
*stream << "</failure>\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4603,10 +4626,11 @@ void XmlUnitTestResultPrinter::PrintXmlUnitTest(FILE* out,
|
|||||||
fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
|
fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
|
||||||
fprintf(out,
|
fprintf(out,
|
||||||
"<testsuites tests=\"%d\" failures=\"%d\" disabled=\"%d\" "
|
"<testsuites tests=\"%d\" failures=\"%d\" disabled=\"%d\" "
|
||||||
"errors=\"0\" time=\"%s\" ",
|
"errors=\"0\" timestamp=\"%s\" time=\"%s\" ",
|
||||||
unit_test.total_test_count(),
|
unit_test.total_test_count(),
|
||||||
unit_test.failed_test_count(),
|
unit_test.failed_test_count(),
|
||||||
unit_test.disabled_test_count(),
|
unit_test.disabled_test_count(),
|
||||||
|
FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()).c_str(),
|
||||||
FormatTimeInMillisAsSeconds(unit_test.elapsed_time()).c_str());
|
FormatTimeInMillisAsSeconds(unit_test.elapsed_time()).c_str());
|
||||||
if (GTEST_FLAG(shuffle)) {
|
if (GTEST_FLAG(shuffle)) {
|
||||||
fprintf(out, "random_seed=\"%d\" ", unit_test.random_seed());
|
fprintf(out, "random_seed=\"%d\" ", unit_test.random_seed());
|
||||||
@ -4812,8 +4836,8 @@ void StreamingListener::MakeConnection() {
|
|||||||
|
|
||||||
// Pushes the given source file location and message onto a per-thread
|
// Pushes the given source file location and message onto a per-thread
|
||||||
// trace stack maintained by Google Test.
|
// trace stack maintained by Google Test.
|
||||||
// L < UnitTest::mutex_
|
ScopedTrace::ScopedTrace(const char* file, int line, const Message& message)
|
||||||
ScopedTrace::ScopedTrace(const char* file, int line, const Message& message) {
|
GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
|
||||||
TraceInfo trace;
|
TraceInfo trace;
|
||||||
trace.file = file;
|
trace.file = file;
|
||||||
trace.line = line;
|
trace.line = line;
|
||||||
@ -4823,8 +4847,8 @@ ScopedTrace::ScopedTrace(const char* file, int line, const Message& message) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Pops the info pushed by the c'tor.
|
// Pops the info pushed by the c'tor.
|
||||||
// L < UnitTest::mutex_
|
ScopedTrace::~ScopedTrace()
|
||||||
ScopedTrace::~ScopedTrace() {
|
GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
|
||||||
UnitTest::GetInstance()->PopGTestTrace();
|
UnitTest::GetInstance()->PopGTestTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4838,14 +4862,14 @@ ScopedTrace::~ScopedTrace() {
|
|||||||
// skip_count - the number of top frames to be skipped; doesn't count
|
// skip_count - the number of top frames to be skipped; doesn't count
|
||||||
// against max_depth.
|
// against max_depth.
|
||||||
//
|
//
|
||||||
// L < mutex_
|
String OsStackTraceGetter::CurrentStackTrace(int /* max_depth */,
|
||||||
// We use "L < mutex_" to denote that the function may acquire mutex_.
|
int /* skip_count */)
|
||||||
String OsStackTraceGetter::CurrentStackTrace(int, int) {
|
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||||
return String("");
|
return String("");
|
||||||
}
|
}
|
||||||
|
|
||||||
// L < mutex_
|
void OsStackTraceGetter::UponLeavingGTest()
|
||||||
void OsStackTraceGetter::UponLeavingGTest() {
|
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* const
|
const char* const
|
||||||
@ -4999,6 +5023,12 @@ int UnitTest::total_test_count() const { return impl()->total_test_count(); }
|
|||||||
// Gets the number of tests that should run.
|
// Gets the number of tests that should run.
|
||||||
int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
|
int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
|
||||||
|
|
||||||
|
// Gets the time of the test program start, in ms from the start of the
|
||||||
|
// UNIX epoch.
|
||||||
|
internal::TimeInMillis UnitTest::start_timestamp() const {
|
||||||
|
return impl()->start_timestamp();
|
||||||
|
}
|
||||||
|
|
||||||
// Gets the elapsed time, in milliseconds.
|
// Gets the elapsed time, in milliseconds.
|
||||||
internal::TimeInMillis UnitTest::elapsed_time() const {
|
internal::TimeInMillis UnitTest::elapsed_time() const {
|
||||||
return impl()->elapsed_time();
|
return impl()->elapsed_time();
|
||||||
@ -5052,12 +5082,13 @@ Environment* UnitTest::AddEnvironment(Environment* env) {
|
|||||||
// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
|
// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
|
||||||
// this to report their results. The user code should use the
|
// this to report their results. The user code should use the
|
||||||
// assertion macros instead of calling this directly.
|
// assertion macros instead of calling this directly.
|
||||||
// L < mutex_
|
void UnitTest::AddTestPartResult(
|
||||||
void UnitTest::AddTestPartResult(TestPartResult::Type result_type,
|
TestPartResult::Type result_type,
|
||||||
const char* file_name,
|
const char* file_name,
|
||||||
int line_number,
|
int line_number,
|
||||||
const internal::String& message,
|
const internal::String& message,
|
||||||
const internal::String& os_stack_trace) {
|
const internal::String& os_stack_trace)
|
||||||
|
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||||
Message msg;
|
Message msg;
|
||||||
msg << message;
|
msg << message;
|
||||||
|
|
||||||
@ -5141,7 +5172,6 @@ int UnitTest::Run() {
|
|||||||
// process. In either case the user does not want to see pop-up dialogs
|
// process. In either case the user does not want to see pop-up dialogs
|
||||||
// about crashes - they are expected.
|
// about crashes - they are expected.
|
||||||
if (impl()->catch_exceptions() || in_death_test_child_process) {
|
if (impl()->catch_exceptions() || in_death_test_child_process) {
|
||||||
|
|
||||||
# if !GTEST_OS_WINDOWS_MOBILE
|
# if !GTEST_OS_WINDOWS_MOBILE
|
||||||
// SetErrorMode doesn't exist on CE.
|
// SetErrorMode doesn't exist on CE.
|
||||||
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
|
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
|
||||||
@ -5172,7 +5202,6 @@ int UnitTest::Run() {
|
|||||||
0x0, // Clear the following flags:
|
0x0, // Clear the following flags:
|
||||||
_WRITE_ABORT_MSG | _CALL_REPORTFAULT); // pop-up window, core dump.
|
_WRITE_ABORT_MSG | _CALL_REPORTFAULT); // pop-up window, core dump.
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif // GTEST_HAS_SEH
|
#endif // GTEST_HAS_SEH
|
||||||
|
|
||||||
@ -5190,16 +5219,16 @@ const char* UnitTest::original_working_dir() const {
|
|||||||
|
|
||||||
// Returns the TestCase object for the test that's currently running,
|
// Returns the TestCase object for the test that's currently running,
|
||||||
// or NULL if no test is running.
|
// or NULL if no test is running.
|
||||||
// L < mutex_
|
const TestCase* UnitTest::current_test_case() const
|
||||||
const TestCase* UnitTest::current_test_case() const {
|
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||||
internal::MutexLock lock(&mutex_);
|
internal::MutexLock lock(&mutex_);
|
||||||
return impl_->current_test_case();
|
return impl_->current_test_case();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the TestInfo object for the test that's currently running,
|
// Returns the TestInfo object for the test that's currently running,
|
||||||
// or NULL if no test is running.
|
// or NULL if no test is running.
|
||||||
// L < mutex_
|
const TestInfo* UnitTest::current_test_info() const
|
||||||
const TestInfo* UnitTest::current_test_info() const {
|
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||||
internal::MutexLock lock(&mutex_);
|
internal::MutexLock lock(&mutex_);
|
||||||
return impl_->current_test_info();
|
return impl_->current_test_info();
|
||||||
}
|
}
|
||||||
@ -5210,9 +5239,9 @@ int UnitTest::random_seed() const { return impl_->random_seed(); }
|
|||||||
#if GTEST_HAS_PARAM_TEST
|
#if GTEST_HAS_PARAM_TEST
|
||||||
// Returns ParameterizedTestCaseRegistry object used to keep track of
|
// Returns ParameterizedTestCaseRegistry object used to keep track of
|
||||||
// value-parameterized tests and instantiate and register them.
|
// value-parameterized tests and instantiate and register them.
|
||||||
// L < mutex_
|
|
||||||
internal::ParameterizedTestCaseRegistry&
|
internal::ParameterizedTestCaseRegistry&
|
||||||
UnitTest::parameterized_test_registry() {
|
UnitTest::parameterized_test_registry()
|
||||||
|
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||||
return impl_->parameterized_test_registry();
|
return impl_->parameterized_test_registry();
|
||||||
}
|
}
|
||||||
#endif // GTEST_HAS_PARAM_TEST
|
#endif // GTEST_HAS_PARAM_TEST
|
||||||
@ -5229,15 +5258,15 @@ UnitTest::~UnitTest() {
|
|||||||
|
|
||||||
// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
|
// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
|
||||||
// Google Test trace stack.
|
// Google Test trace stack.
|
||||||
// L < mutex_
|
void UnitTest::PushGTestTrace(const internal::TraceInfo& trace)
|
||||||
void UnitTest::PushGTestTrace(const internal::TraceInfo& trace) {
|
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||||
internal::MutexLock lock(&mutex_);
|
internal::MutexLock lock(&mutex_);
|
||||||
impl_->gtest_trace_stack().push_back(trace);
|
impl_->gtest_trace_stack().push_back(trace);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pops a trace from the per-thread Google Test trace stack.
|
// Pops a trace from the per-thread Google Test trace stack.
|
||||||
// L < mutex_
|
void UnitTest::PopGTestTrace()
|
||||||
void UnitTest::PopGTestTrace() {
|
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||||
internal::MutexLock lock(&mutex_);
|
internal::MutexLock lock(&mutex_);
|
||||||
impl_->gtest_trace_stack().pop_back();
|
impl_->gtest_trace_stack().pop_back();
|
||||||
}
|
}
|
||||||
@ -5273,6 +5302,7 @@ UnitTestImpl::UnitTestImpl(UnitTest* parent)
|
|||||||
post_flag_parse_init_performed_(false),
|
post_flag_parse_init_performed_(false),
|
||||||
random_seed_(0), // Will be overridden by the flag before first use.
|
random_seed_(0), // Will be overridden by the flag before first use.
|
||||||
random_(0), // Will be reseeded before first use.
|
random_(0), // Will be reseeded before first use.
|
||||||
|
start_timestamp_(0),
|
||||||
elapsed_time_(0),
|
elapsed_time_(0),
|
||||||
#if GTEST_HAS_DEATH_TEST
|
#if GTEST_HAS_DEATH_TEST
|
||||||
internal_run_death_test_flag_(NULL),
|
internal_run_death_test_flag_(NULL),
|
||||||
@ -5504,6 +5534,7 @@ bool UnitTestImpl::RunAllTests() {
|
|||||||
|
|
||||||
TestEventListener* repeater = listeners()->repeater();
|
TestEventListener* repeater = listeners()->repeater();
|
||||||
|
|
||||||
|
start_timestamp_ = GetTimeInMillis();
|
||||||
repeater->OnTestProgramStart(*parent_);
|
repeater->OnTestProgramStart(*parent_);
|
||||||
|
|
||||||
// How many times to repeat the tests? We don't want to repeat them
|
// How many times to repeat the tests? We don't want to repeat them
|
||||||
@ -5865,7 +5896,7 @@ bool SkipPrefix(const char* prefix, const char** pstr) {
|
|||||||
// part can be omitted.
|
// part can be omitted.
|
||||||
//
|
//
|
||||||
// Returns the value of the flag, or NULL if the parsing failed.
|
// Returns the value of the flag, or NULL if the parsing failed.
|
||||||
static const char* ParseFlagValue(const char* str,
|
const char* ParseFlagValue(const char* str,
|
||||||
const char* flag,
|
const char* flag,
|
||||||
bool def_optional) {
|
bool def_optional) {
|
||||||
// str and flag must not be NULL.
|
// str and flag must not be NULL.
|
||||||
@ -6240,13 +6271,18 @@ void InitGoogleTest(int* argc, wchar_t** argv) {
|
|||||||
|
|
||||||
#if GTEST_HAS_DEATH_TEST
|
#if GTEST_HAS_DEATH_TEST
|
||||||
|
|
||||||
# if GTEST_OS_MAC && !GTEST_OS_MAC_IOS
|
# if GTEST_OS_MAC
|
||||||
# include <crt_externs.h>
|
# include <crt_externs.h>
|
||||||
# endif // GTEST_OS_MAC
|
# endif // GTEST_OS_MAC
|
||||||
|
|
||||||
# include <errno.h>
|
# include <errno.h>
|
||||||
# include <fcntl.h>
|
# include <fcntl.h>
|
||||||
# include <limits.h>
|
# include <limits.h>
|
||||||
|
|
||||||
|
# if GTEST_OS_LINUX
|
||||||
|
# include <signal.h>
|
||||||
|
# endif // GTEST_OS_LINUX
|
||||||
|
|
||||||
# include <stdarg.h>
|
# include <stdarg.h>
|
||||||
|
|
||||||
# if GTEST_OS_WINDOWS
|
# if GTEST_OS_WINDOWS
|
||||||
@ -6256,6 +6292,10 @@ void InitGoogleTest(int* argc, wchar_t** argv) {
|
|||||||
# include <sys/wait.h>
|
# include <sys/wait.h>
|
||||||
# endif // GTEST_OS_WINDOWS
|
# endif // GTEST_OS_WINDOWS
|
||||||
|
|
||||||
|
# if GTEST_OS_QNX
|
||||||
|
# include <spawn.h>
|
||||||
|
# endif // GTEST_OS_QNX
|
||||||
|
|
||||||
#endif // GTEST_HAS_DEATH_TEST
|
#endif // GTEST_HAS_DEATH_TEST
|
||||||
|
|
||||||
|
|
||||||
@ -6301,13 +6341,42 @@ GTEST_DEFINE_string_(
|
|||||||
"Indicates the file, line number, temporal index of "
|
"Indicates the file, line number, temporal index of "
|
||||||
"the single death test to run, and a file descriptor to "
|
"the single death test to run, and a file descriptor to "
|
||||||
"which a success code may be sent, all separated by "
|
"which a success code may be sent, all separated by "
|
||||||
"colons. This flag is specified if and only if the current "
|
"the '|' characters. This flag is specified if and only if the current "
|
||||||
"process is a sub-process launched for running a thread-safe "
|
"process is a sub-process launched for running a thread-safe "
|
||||||
"death test. FOR INTERNAL USE ONLY.");
|
"death test. FOR INTERNAL USE ONLY.");
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
|
||||||
#if GTEST_HAS_DEATH_TEST
|
#if GTEST_HAS_DEATH_TEST
|
||||||
|
|
||||||
|
namespace internal {
|
||||||
|
|
||||||
|
// Valid only for fast death tests. Indicates the code is running in the
|
||||||
|
// child process of a fast style death test.
|
||||||
|
static bool g_in_fast_death_test_child = false;
|
||||||
|
|
||||||
|
// Returns a Boolean value indicating whether the caller is currently
|
||||||
|
// executing in the context of the death test child process. Tools such as
|
||||||
|
// Valgrind heap checkers may need this to modify their behavior in death
|
||||||
|
// tests. IMPORTANT: This is an internal utility. Using it may break the
|
||||||
|
// implementation of death tests. User code MUST NOT use it.
|
||||||
|
bool InDeathTestChild() {
|
||||||
|
# if GTEST_OS_WINDOWS
|
||||||
|
|
||||||
|
// On Windows, death tests are thread-safe regardless of the value of the
|
||||||
|
// death_test_style flag.
|
||||||
|
return !GTEST_FLAG(internal_run_death_test).empty();
|
||||||
|
|
||||||
|
# else
|
||||||
|
|
||||||
|
if (GTEST_FLAG(death_test_style) == "threadsafe")
|
||||||
|
return !GTEST_FLAG(internal_run_death_test).empty();
|
||||||
|
else
|
||||||
|
return g_in_fast_death_test_child;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace internal
|
||||||
|
|
||||||
// ExitedWithCode constructor.
|
// ExitedWithCode constructor.
|
||||||
ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
|
ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
|
||||||
}
|
}
|
||||||
@ -7017,6 +7086,7 @@ DeathTest::TestRole NoExecDeathTest::AssumeRole() {
|
|||||||
// Event forwarding to the listeners of event listener API mush be shut
|
// Event forwarding to the listeners of event listener API mush be shut
|
||||||
// down in death test subprocesses.
|
// down in death test subprocesses.
|
||||||
GetUnitTestImpl()->listeners()->SuppressEventForwarding();
|
GetUnitTestImpl()->listeners()->SuppressEventForwarding();
|
||||||
|
g_in_fast_death_test_child = true;
|
||||||
return EXECUTE_TEST;
|
return EXECUTE_TEST;
|
||||||
} else {
|
} else {
|
||||||
GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
|
GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
|
||||||
@ -7036,6 +7106,11 @@ class ExecDeathTest : public ForkingDeathTest {
|
|||||||
ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
|
ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
|
||||||
virtual TestRole AssumeRole();
|
virtual TestRole AssumeRole();
|
||||||
private:
|
private:
|
||||||
|
static ::std::vector<testing::internal::string>
|
||||||
|
GetArgvsForDeathTestChildProcess() {
|
||||||
|
::std::vector<testing::internal::string> args = GetInjectableArgvs();
|
||||||
|
return args;
|
||||||
|
}
|
||||||
// The name of the file in which the death test is located.
|
// The name of the file in which the death test is located.
|
||||||
const char* const file_;
|
const char* const file_;
|
||||||
// The line number on which the death test is located.
|
// The line number on which the death test is located.
|
||||||
@ -7070,6 +7145,7 @@ class Arguments {
|
|||||||
char* const* Argv() {
|
char* const* Argv() {
|
||||||
return &args_[0];
|
return &args_[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<char*> args_;
|
std::vector<char*> args_;
|
||||||
};
|
};
|
||||||
@ -7081,7 +7157,7 @@ struct ExecDeathTestArgs {
|
|||||||
int close_fd; // File descriptor to close; the read end of a pipe
|
int close_fd; // File descriptor to close; the read end of a pipe
|
||||||
};
|
};
|
||||||
|
|
||||||
# if GTEST_OS_MAC && !GTEST_OS_MAC_IOS
|
# if GTEST_OS_MAC
|
||||||
inline char** GetEnviron() {
|
inline char** GetEnviron() {
|
||||||
// When Google Test is built as a framework on MacOS X, the environ variable
|
// When Google Test is built as a framework on MacOS X, the environ variable
|
||||||
// is unavailable. Apple's documentation (man environ) recommends using
|
// is unavailable. Apple's documentation (man environ) recommends using
|
||||||
@ -7095,6 +7171,7 @@ extern "C" char** environ;
|
|||||||
inline char** GetEnviron() { return environ; }
|
inline char** GetEnviron() { return environ; }
|
||||||
# endif // GTEST_OS_MAC
|
# endif // GTEST_OS_MAC
|
||||||
|
|
||||||
|
# if !GTEST_OS_QNX
|
||||||
// The main function for a threadsafe-style death test child process.
|
// The main function for a threadsafe-style death test child process.
|
||||||
// This function is called in a clone()-ed process and thus must avoid
|
// This function is called in a clone()-ed process and thus must avoid
|
||||||
// any potentially unsafe operations like malloc or libc functions.
|
// any potentially unsafe operations like malloc or libc functions.
|
||||||
@ -7127,6 +7204,7 @@ static int ExecDeathTestChildMain(void* child_arg) {
|
|||||||
GetLastErrnoDescription().c_str()));
|
GetLastErrnoDescription().c_str()));
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
# endif // !GTEST_OS_QNX
|
||||||
|
|
||||||
// Two utility routines that together determine the direction the stack
|
// Two utility routines that together determine the direction the stack
|
||||||
// grows.
|
// grows.
|
||||||
@ -7137,25 +7215,76 @@ static int ExecDeathTestChildMain(void* child_arg) {
|
|||||||
// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
|
// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
|
||||||
// StackLowerThanAddress into StackGrowsDown, which then doesn't give
|
// StackLowerThanAddress into StackGrowsDown, which then doesn't give
|
||||||
// correct answer.
|
// correct answer.
|
||||||
bool StackLowerThanAddress(const void* ptr) GTEST_NO_INLINE_;
|
void StackLowerThanAddress(const void* ptr, bool* result) GTEST_NO_INLINE_;
|
||||||
bool StackLowerThanAddress(const void* ptr) {
|
void StackLowerThanAddress(const void* ptr, bool* result) {
|
||||||
int dummy;
|
int dummy;
|
||||||
return &dummy < ptr;
|
*result = (&dummy < ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool StackGrowsDown() {
|
static bool StackGrowsDown() {
|
||||||
int dummy;
|
int dummy;
|
||||||
return StackLowerThanAddress(&dummy);
|
bool result;
|
||||||
|
StackLowerThanAddress(&dummy, &result);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// A threadsafe implementation of fork(2) for threadsafe-style death tests
|
// Spawns a child process with the same executable as the current process in
|
||||||
// that uses clone(2). It dies with an error message if anything goes
|
// a thread-safe manner and instructs it to run the death test. The
|
||||||
// wrong.
|
// implementation uses fork(2) + exec. On systems where clone(2) is
|
||||||
static pid_t ExecDeathTestFork(char* const* argv, int close_fd) {
|
// available, it is used instead, being slightly more thread-safe. On QNX,
|
||||||
|
// fork supports only single-threaded environments, so this function uses
|
||||||
|
// spawn(2) there instead. The function dies with an error message if
|
||||||
|
// anything goes wrong.
|
||||||
|
static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
|
||||||
ExecDeathTestArgs args = { argv, close_fd };
|
ExecDeathTestArgs args = { argv, close_fd };
|
||||||
pid_t child_pid = -1;
|
pid_t child_pid = -1;
|
||||||
|
|
||||||
# if GTEST_HAS_CLONE
|
# if GTEST_OS_QNX
|
||||||
|
// Obtains the current directory and sets it to be closed in the child
|
||||||
|
// process.
|
||||||
|
const int cwd_fd = open(".", O_RDONLY);
|
||||||
|
GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
|
||||||
|
GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
|
||||||
|
// We need to execute the test program in the same environment where
|
||||||
|
// it was originally invoked. Therefore we change to the original
|
||||||
|
// working directory first.
|
||||||
|
const char* const original_dir =
|
||||||
|
UnitTest::GetInstance()->original_working_dir();
|
||||||
|
// We can safely call chdir() as it's a direct system call.
|
||||||
|
if (chdir(original_dir) != 0) {
|
||||||
|
DeathTestAbort(String::Format("chdir(\"%s\") failed: %s",
|
||||||
|
original_dir,
|
||||||
|
GetLastErrnoDescription().c_str()));
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fd_flags;
|
||||||
|
// Set close_fd to be closed after spawn.
|
||||||
|
GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
|
||||||
|
GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,
|
||||||
|
fd_flags | FD_CLOEXEC));
|
||||||
|
struct inheritance inherit = {0};
|
||||||
|
// spawn is a system call.
|
||||||
|
child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());
|
||||||
|
// Restores the current working directory.
|
||||||
|
GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
|
||||||
|
GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
|
||||||
|
|
||||||
|
# else // GTEST_OS_QNX
|
||||||
|
# if GTEST_OS_LINUX
|
||||||
|
// When a SIGPROF signal is received while fork() or clone() are executing,
|
||||||
|
// the process may hang. To avoid this, we ignore SIGPROF here and re-enable
|
||||||
|
// it after the call to fork()/clone() is complete.
|
||||||
|
struct sigaction saved_sigprof_action;
|
||||||
|
struct sigaction ignore_sigprof_action;
|
||||||
|
memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));
|
||||||
|
sigemptyset(&ignore_sigprof_action.sa_mask);
|
||||||
|
ignore_sigprof_action.sa_handler = SIG_IGN;
|
||||||
|
GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(
|
||||||
|
SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
|
||||||
|
# endif // GTEST_OS_LINUX
|
||||||
|
|
||||||
|
# if GTEST_HAS_CLONE
|
||||||
const bool use_fork = GTEST_FLAG(death_test_use_fork);
|
const bool use_fork = GTEST_FLAG(death_test_use_fork);
|
||||||
|
|
||||||
if (!use_fork) {
|
if (!use_fork) {
|
||||||
@ -7172,14 +7301,19 @@ static pid_t ExecDeathTestFork(char* const* argv, int close_fd) {
|
|||||||
|
|
||||||
GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
|
GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
|
||||||
}
|
}
|
||||||
# else
|
# else
|
||||||
const bool use_fork = true;
|
const bool use_fork = true;
|
||||||
# endif // GTEST_HAS_CLONE
|
# endif // GTEST_HAS_CLONE
|
||||||
|
|
||||||
if (use_fork && (child_pid = fork()) == 0) {
|
if (use_fork && (child_pid = fork()) == 0) {
|
||||||
ExecDeathTestChildMain(&args);
|
ExecDeathTestChildMain(&args);
|
||||||
_exit(0);
|
_exit(0);
|
||||||
}
|
}
|
||||||
|
# endif // GTEST_OS_QNX
|
||||||
|
# if GTEST_OS_LINUX
|
||||||
|
GTEST_DEATH_TEST_CHECK_SYSCALL_(
|
||||||
|
sigaction(SIGPROF, &saved_sigprof_action, NULL));
|
||||||
|
# endif // GTEST_OS_LINUX
|
||||||
|
|
||||||
GTEST_DEATH_TEST_CHECK_(child_pid != -1);
|
GTEST_DEATH_TEST_CHECK_(child_pid != -1);
|
||||||
return child_pid;
|
return child_pid;
|
||||||
@ -7216,7 +7350,7 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {
|
|||||||
GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag,
|
GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag,
|
||||||
file_, line_, death_test_index, pipe_fd[1]);
|
file_, line_, death_test_index, pipe_fd[1]);
|
||||||
Arguments args;
|
Arguments args;
|
||||||
args.AddArguments(GetArgvs());
|
args.AddArguments(GetArgvsForDeathTestChildProcess());
|
||||||
args.AddArgument(filter_flag.c_str());
|
args.AddArgument(filter_flag.c_str());
|
||||||
args.AddArgument(internal_flag.c_str());
|
args.AddArgument(internal_flag.c_str());
|
||||||
|
|
||||||
@ -7227,7 +7361,7 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {
|
|||||||
// is necessary.
|
// is necessary.
|
||||||
FlushInfoLog();
|
FlushInfoLog();
|
||||||
|
|
||||||
const pid_t child_pid = ExecDeathTestFork(args.Argv(), pipe_fd[0]);
|
const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
|
||||||
GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
|
GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
|
||||||
set_child_pid(child_pid);
|
set_child_pid(child_pid);
|
||||||
set_read_fd(pipe_fd[0]);
|
set_read_fd(pipe_fd[0]);
|
||||||
@ -7862,6 +7996,11 @@ void FilePath::Normalize() {
|
|||||||
# include <mach/vm_map.h>
|
# include <mach/vm_map.h>
|
||||||
#endif // GTEST_OS_MAC
|
#endif // GTEST_OS_MAC
|
||||||
|
|
||||||
|
#if GTEST_OS_QNX
|
||||||
|
# include <devctl.h>
|
||||||
|
# include <sys/procfs.h>
|
||||||
|
#endif // GTEST_OS_QNX
|
||||||
|
|
||||||
|
|
||||||
// Indicates that this translation unit is part of Google Test's
|
// Indicates that this translation unit is part of Google Test's
|
||||||
// implementation. It must come before gtest-internal-inl.h is
|
// implementation. It must come before gtest-internal-inl.h is
|
||||||
@ -7904,6 +8043,26 @@ size_t GetThreadCount() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#elif GTEST_OS_QNX
|
||||||
|
|
||||||
|
// Returns the number of threads running in the process, or 0 to indicate that
|
||||||
|
// we cannot detect it.
|
||||||
|
size_t GetThreadCount() {
|
||||||
|
const int fd = open("/proc/self/as", O_RDONLY);
|
||||||
|
if (fd < 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
procfs_info process_info;
|
||||||
|
const int status =
|
||||||
|
devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL);
|
||||||
|
close(fd);
|
||||||
|
if (status == EOK) {
|
||||||
|
return static_cast<size_t>(process_info.num_threads);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
size_t GetThreadCount() {
|
size_t GetThreadCount() {
|
||||||
@ -8295,7 +8454,6 @@ class CapturedStream {
|
|||||||
public:
|
public:
|
||||||
// The ctor redirects the stream to a temporary file.
|
// The ctor redirects the stream to a temporary file.
|
||||||
CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
|
CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
|
||||||
|
|
||||||
# if GTEST_OS_WINDOWS
|
# if GTEST_OS_WINDOWS
|
||||||
char temp_dir_path[MAX_PATH + 1] = { '\0' }; // NOLINT
|
char temp_dir_path[MAX_PATH + 1] = { '\0' }; // NOLINT
|
||||||
char temp_file_path[MAX_PATH + 1] = { '\0' }; // NOLINT
|
char temp_file_path[MAX_PATH + 1] = { '\0' }; // NOLINT
|
||||||
@ -8312,10 +8470,15 @@ class CapturedStream {
|
|||||||
<< temp_file_path;
|
<< temp_file_path;
|
||||||
filename_ = temp_file_path;
|
filename_ = temp_file_path;
|
||||||
# else
|
# else
|
||||||
// There's no guarantee that a test has write access to the
|
// There's no guarantee that a test has write access to the current
|
||||||
// current directory, so we create the temporary file in the /tmp
|
// directory, so we create the temporary file in the /tmp directory instead.
|
||||||
// directory instead.
|
// We use /tmp on most systems, and /mnt/sdcard on Android. That's because
|
||||||
|
// Android doesn't have /tmp.
|
||||||
|
# if GTEST_OS_LINUX_ANDROID
|
||||||
|
char name_template[] = "/mnt/sdcard/gtest_captured_stream.XXXXXX";
|
||||||
|
# else
|
||||||
char name_template[] = "/tmp/captured_stream.XXXXXX";
|
char name_template[] = "/tmp/captured_stream.XXXXXX";
|
||||||
|
# endif // GTEST_OS_LINUX_ANDROID
|
||||||
const int captured_fd = mkstemp(name_template);
|
const int captured_fd = mkstemp(name_template);
|
||||||
filename_ = name_template;
|
filename_ = name_template;
|
||||||
# endif // GTEST_OS_WINDOWS
|
# endif // GTEST_OS_WINDOWS
|
||||||
@ -8434,11 +8597,23 @@ String GetCapturedStderr() { return GetCapturedStream(&g_captured_stderr); }
|
|||||||
#if GTEST_HAS_DEATH_TEST
|
#if GTEST_HAS_DEATH_TEST
|
||||||
|
|
||||||
// A copy of all command line arguments. Set by InitGoogleTest().
|
// A copy of all command line arguments. Set by InitGoogleTest().
|
||||||
::std::vector<String> g_argvs;
|
::std::vector<testing::internal::string> g_argvs;
|
||||||
|
|
||||||
// Returns the command line as a vector of strings.
|
static const ::std::vector<testing::internal::string>* g_injected_test_argvs =
|
||||||
const ::std::vector<String>& GetArgvs() { return g_argvs; }
|
NULL; // Owned.
|
||||||
|
|
||||||
|
void SetInjectableArgvs(const ::std::vector<testing::internal::string>* argvs) {
|
||||||
|
if (g_injected_test_argvs != argvs)
|
||||||
|
delete g_injected_test_argvs;
|
||||||
|
g_injected_test_argvs = argvs;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ::std::vector<testing::internal::string>& GetInjectableArgvs() {
|
||||||
|
if (g_injected_test_argvs != NULL) {
|
||||||
|
return *g_injected_test_argvs;
|
||||||
|
}
|
||||||
|
return g_argvs;
|
||||||
|
}
|
||||||
#endif // GTEST_HAS_DEATH_TEST
|
#endif // GTEST_HAS_DEATH_TEST
|
||||||
|
|
||||||
#if GTEST_OS_WINDOWS_MOBILE
|
#if GTEST_OS_WINDOWS_MOBILE
|
||||||
@ -8605,14 +8780,6 @@ namespace {
|
|||||||
|
|
||||||
using ::std::ostream;
|
using ::std::ostream;
|
||||||
|
|
||||||
#if GTEST_OS_WINDOWS_MOBILE // Windows CE does not define _snprintf_s.
|
|
||||||
# define snprintf _snprintf
|
|
||||||
#elif defined(_MSC_VER) && _MSC_VER >= 1400 // VC 8.0 and later deprecate snprintf and _snprintf.
|
|
||||||
# define snprintf _snprintf_s
|
|
||||||
#elif defined(_MSC_VER) && _MSC_VER
|
|
||||||
# define snprintf _snprintf
|
|
||||||
#endif // GTEST_OS_WINDOWS_MOBILE
|
|
||||||
|
|
||||||
// Prints a segment of bytes in the given object.
|
// Prints a segment of bytes in the given object.
|
||||||
void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
|
void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
|
||||||
size_t count, ostream* os) {
|
size_t count, ostream* os) {
|
||||||
@ -8627,7 +8794,7 @@ void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
|
|||||||
else
|
else
|
||||||
*os << '-';
|
*os << '-';
|
||||||
}
|
}
|
||||||
snprintf(text, sizeof(text), "%02X", obj_bytes[j]);
|
GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]);
|
||||||
*os << text;
|
*os << text;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -8741,9 +8908,9 @@ static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
|
|||||||
return kSpecialEscape;
|
return kSpecialEscape;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prints a char c as if it's part of a string literal, escaping it when
|
// Prints a wchar_t c as if it's part of a string literal, escaping it when
|
||||||
// necessary; returns how c was formatted.
|
// necessary; returns how c was formatted.
|
||||||
static CharFormat PrintAsWideStringLiteralTo(wchar_t c, ostream* os) {
|
static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case L'\'':
|
case L'\'':
|
||||||
*os << "'";
|
*os << "'";
|
||||||
@ -8758,8 +8925,9 @@ static CharFormat PrintAsWideStringLiteralTo(wchar_t c, ostream* os) {
|
|||||||
|
|
||||||
// Prints a char c as if it's part of a string literal, escaping it when
|
// Prints a char c as if it's part of a string literal, escaping it when
|
||||||
// necessary; returns how c was formatted.
|
// necessary; returns how c was formatted.
|
||||||
static CharFormat PrintAsNarrowStringLiteralTo(char c, ostream* os) {
|
static CharFormat PrintAsStringLiteralTo(char c, ostream* os) {
|
||||||
return PrintAsWideStringLiteralTo(static_cast<unsigned char>(c), os);
|
return PrintAsStringLiteralTo(
|
||||||
|
static_cast<wchar_t>(static_cast<unsigned char>(c)), os);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prints a wide or narrow character c and its code. '\0' is printed
|
// Prints a wide or narrow character c and its code. '\0' is printed
|
||||||
@ -8805,48 +8973,63 @@ void PrintTo(wchar_t wc, ostream* os) {
|
|||||||
PrintCharAndCodeTo<wchar_t>(wc, os);
|
PrintCharAndCodeTo<wchar_t>(wc, os);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prints the given array of characters to the ostream.
|
// Prints the given array of characters to the ostream. CharType must be either
|
||||||
// The array starts at *begin, the length is len, it may include '\0' characters
|
// char or wchar_t.
|
||||||
// and may not be null-terminated.
|
// The array starts at begin, the length is len, it may include '\0' characters
|
||||||
static void PrintCharsAsStringTo(const char* begin, size_t len, ostream* os) {
|
// and may not be NUL-terminated.
|
||||||
*os << "\"";
|
template <typename CharType>
|
||||||
|
static void PrintCharsAsStringTo(
|
||||||
|
const CharType* begin, size_t len, ostream* os) {
|
||||||
|
const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\"";
|
||||||
|
*os << kQuoteBegin;
|
||||||
bool is_previous_hex = false;
|
bool is_previous_hex = false;
|
||||||
for (size_t index = 0; index < len; ++index) {
|
for (size_t index = 0; index < len; ++index) {
|
||||||
const char cur = begin[index];
|
const CharType cur = begin[index];
|
||||||
if (is_previous_hex && IsXDigit(cur)) {
|
if (is_previous_hex && IsXDigit(cur)) {
|
||||||
// Previous character is of '\x..' form and this character can be
|
// Previous character is of '\x..' form and this character can be
|
||||||
// interpreted as another hexadecimal digit in its number. Break string to
|
// interpreted as another hexadecimal digit in its number. Break string to
|
||||||
// disambiguate.
|
// disambiguate.
|
||||||
*os << "\" \"";
|
*os << "\" " << kQuoteBegin;
|
||||||
}
|
}
|
||||||
is_previous_hex = PrintAsNarrowStringLiteralTo(cur, os) == kHexEscape;
|
is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape;
|
||||||
}
|
}
|
||||||
*os << "\"";
|
*os << "\"";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Prints a (const) char/wchar_t array of 'len' elements, starting at address
|
||||||
|
// 'begin'. CharType must be either char or wchar_t.
|
||||||
|
template <typename CharType>
|
||||||
|
static void UniversalPrintCharArray(
|
||||||
|
const CharType* begin, size_t len, ostream* os) {
|
||||||
|
// The code
|
||||||
|
// const char kFoo[] = "foo";
|
||||||
|
// generates an array of 4, not 3, elements, with the last one being '\0'.
|
||||||
|
//
|
||||||
|
// Therefore when printing a char array, we don't print the last element if
|
||||||
|
// it's '\0', such that the output matches the string literal as it's
|
||||||
|
// written in the source code.
|
||||||
|
if (len > 0 && begin[len - 1] == '\0') {
|
||||||
|
PrintCharsAsStringTo(begin, len - 1, os);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If, however, the last element in the array is not '\0', e.g.
|
||||||
|
// const char kFoo[] = { 'f', 'o', 'o' };
|
||||||
|
// we must print the entire array. We also print a message to indicate
|
||||||
|
// that the array is not NUL-terminated.
|
||||||
|
PrintCharsAsStringTo(begin, len, os);
|
||||||
|
*os << " (no terminating NUL)";
|
||||||
|
}
|
||||||
|
|
||||||
// Prints a (const) char array of 'len' elements, starting at address 'begin'.
|
// Prints a (const) char array of 'len' elements, starting at address 'begin'.
|
||||||
void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
|
void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
|
||||||
PrintCharsAsStringTo(begin, len, os);
|
UniversalPrintCharArray(begin, len, os);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prints the given array of wide characters to the ostream.
|
// Prints a (const) wchar_t array of 'len' elements, starting at address
|
||||||
// The array starts at *begin, the length is len, it may include L'\0'
|
// 'begin'.
|
||||||
// characters and may not be null-terminated.
|
void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) {
|
||||||
static void PrintWideCharsAsStringTo(const wchar_t* begin, size_t len,
|
UniversalPrintCharArray(begin, len, os);
|
||||||
ostream* os) {
|
|
||||||
*os << "L\"";
|
|
||||||
bool is_previous_hex = false;
|
|
||||||
for (size_t index = 0; index < len; ++index) {
|
|
||||||
const wchar_t cur = begin[index];
|
|
||||||
if (is_previous_hex && isascii(cur) && IsXDigit(static_cast<char>(cur))) {
|
|
||||||
// Previous character is of '\x..' form and this character can be
|
|
||||||
// interpreted as another hexadecimal digit in its number. Break string to
|
|
||||||
// disambiguate.
|
|
||||||
*os << "\" L\"";
|
|
||||||
}
|
|
||||||
is_previous_hex = PrintAsWideStringLiteralTo(cur, os) == kHexEscape;
|
|
||||||
}
|
|
||||||
*os << "\"";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prints the given C string to the ostream.
|
// Prints the given C string to the ostream.
|
||||||
@ -8872,7 +9055,7 @@ void PrintTo(const wchar_t* s, ostream* os) {
|
|||||||
*os << "NULL";
|
*os << "NULL";
|
||||||
} else {
|
} else {
|
||||||
*os << ImplicitCast_<const void*>(s) << " pointing to ";
|
*os << ImplicitCast_<const void*>(s) << " pointing to ";
|
||||||
PrintWideCharsAsStringTo(s, wcslen(s), os);
|
PrintCharsAsStringTo(s, wcslen(s), os);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // wchar_t is native
|
#endif // wchar_t is native
|
||||||
@ -8891,13 +9074,13 @@ void PrintStringTo(const ::std::string& s, ostream* os) {
|
|||||||
// Prints a ::wstring object.
|
// Prints a ::wstring object.
|
||||||
#if GTEST_HAS_GLOBAL_WSTRING
|
#if GTEST_HAS_GLOBAL_WSTRING
|
||||||
void PrintWideStringTo(const ::wstring& s, ostream* os) {
|
void PrintWideStringTo(const ::wstring& s, ostream* os) {
|
||||||
PrintWideCharsAsStringTo(s.data(), s.size(), os);
|
PrintCharsAsStringTo(s.data(), s.size(), os);
|
||||||
}
|
}
|
||||||
#endif // GTEST_HAS_GLOBAL_WSTRING
|
#endif // GTEST_HAS_GLOBAL_WSTRING
|
||||||
|
|
||||||
#if GTEST_HAS_STD_WSTRING
|
#if GTEST_HAS_STD_WSTRING
|
||||||
void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
|
void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
|
||||||
PrintWideCharsAsStringTo(s.data(), s.size(), os);
|
PrintCharsAsStringTo(s.data(), s.size(), os);
|
||||||
}
|
}
|
||||||
#endif // GTEST_HAS_STD_WSTRING
|
#endif // GTEST_HAS_STD_WSTRING
|
||||||
|
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
set(the_description "Video stabilization")
|
set(the_description "Video stabilization")
|
||||||
ocv_define_module(videostab opencv_imgproc opencv_features2d opencv_video opencv_highgui opencv_photo OPTIONAL opencv_gpu)
|
ocv_define_module(videostab opencv_imgproc opencv_features2d opencv_video opencv_photo opencv_calib3d OPTIONAL opencv_gpu opencv_highgui)
|
||||||
|
|
||||||
|
@ -43,6 +43,11 @@
|
|||||||
#include "precomp.hpp"
|
#include "precomp.hpp"
|
||||||
#include "opencv2/videostab/frame_source.hpp"
|
#include "opencv2/videostab/frame_source.hpp"
|
||||||
|
|
||||||
|
#include "opencv2/opencv_modules.hpp"
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
|
# include "opencv2/highgui/highgui.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
namespace cv
|
namespace cv
|
||||||
@ -50,25 +55,74 @@ namespace cv
|
|||||||
namespace videostab
|
namespace videostab
|
||||||
{
|
{
|
||||||
|
|
||||||
|
struct VideoFileSource::VideoReader
|
||||||
|
{
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
|
mutable VideoCapture vc;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
VideoFileSource::VideoFileSource(const string &path, bool volatileFrame)
|
VideoFileSource::VideoFileSource(const string &path, bool volatileFrame)
|
||||||
: path_(path), volatileFrame_(volatileFrame) { reset(); }
|
: path_(path), volatileFrame_(volatileFrame), reader_(VideoReader()) { reset(); }
|
||||||
|
|
||||||
|
|
||||||
void VideoFileSource::reset()
|
void VideoFileSource::reset()
|
||||||
{
|
{
|
||||||
reader_.release();
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
reader_.open(path_);
|
reader_.vc.release();
|
||||||
if (!reader_.isOpened())
|
reader_.vc.open(path_);
|
||||||
|
if (!reader_.vc.isOpened())
|
||||||
throw runtime_error("can't open file: " + path_);
|
throw runtime_error("can't open file: " + path_);
|
||||||
|
#else
|
||||||
|
CV_Error(CV_StsNotImplemented, "OpenCV has been compiled without video I/O support");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Mat VideoFileSource::nextFrame()
|
Mat VideoFileSource::nextFrame()
|
||||||
{
|
{
|
||||||
Mat frame;
|
Mat frame;
|
||||||
reader_ >> frame;
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
|
reader_.vc >> frame;
|
||||||
|
#endif
|
||||||
return volatileFrame_ ? frame : frame.clone();
|
return volatileFrame_ ? frame : frame.clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int VideoFileSource::width()
|
||||||
|
{
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
|
return static_cast<int>(reader_.vc.get(CV_CAP_PROP_FRAME_WIDTH));
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
int VideoFileSource::height()
|
||||||
|
{
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
|
return static_cast<int>(reader_.vc.get(CV_CAP_PROP_FRAME_HEIGHT));
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
int VideoFileSource::count()
|
||||||
|
{
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
|
return static_cast<int>(reader_.vc.get(CV_CAP_PROP_FRAME_COUNT));
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
double VideoFileSource::fps()
|
||||||
|
{
|
||||||
|
#ifdef HAVE_OPENCV_HIGHGUI
|
||||||
|
return reader_.vc.get(CV_CAP_PROP_FPS);
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace videostab
|
} // namespace videostab
|
||||||
} // namespace cv
|
} // namespace cv
|
||||||
|
@ -50,7 +50,6 @@
|
|||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "opencv2/core/core.hpp"
|
#include "opencv2/core/core.hpp"
|
||||||
#include "opencv2/highgui/highgui.hpp"
|
|
||||||
#include "opencv2/imgproc/imgproc.hpp"
|
#include "opencv2/imgproc/imgproc.hpp"
|
||||||
#include "opencv2/video/video.hpp"
|
#include "opencv2/video/video.hpp"
|
||||||
#include "opencv2/features2d/features2d.hpp"
|
#include "opencv2/features2d/features2d.hpp"
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
#Wed Jun 29 04:36:40 MSD 2011
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.5
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.5
|
@ -1,3 +1,12 @@
|
|||||||
|
'''
|
||||||
|
This program illustrates the use of findContours and drawContours.
|
||||||
|
The original image is put up along with the image of drawn contours.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
contours.py
|
||||||
|
A trackbar is put up which controls the contour level from -3 to 3
|
||||||
|
'''
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import cv2
|
import cv2
|
||||||
|
|
||||||
@ -30,6 +39,8 @@ def make_image():
|
|||||||
return img
|
return img
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
print __doc__
|
||||||
|
|
||||||
img = make_image()
|
img = make_image()
|
||||||
h, w = img.shape[:2]
|
h, w = img.shape[:2]
|
||||||
|
|
||||||
|
@ -1,8 +1,21 @@
|
|||||||
|
'''
|
||||||
|
This sample demonstrates Canny edge detection.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
edge.py [<video source>]
|
||||||
|
|
||||||
|
Trackbars control edge thresholds.
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
import cv2
|
import cv2
|
||||||
import video
|
import video
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
print __doc__
|
||||||
|
|
||||||
try: fn = sys.argv[1]
|
try: fn = sys.argv[1]
|
||||||
except: fn = 0
|
except: fn = 0
|
||||||
|
|
||||||
|
@ -1,3 +1,28 @@
|
|||||||
|
'''
|
||||||
|
The sample demonstrates how to train Random Trees classifier
|
||||||
|
(or Boosting classifier, or MLP, or Knearest, or Support Vector Machines) using the provided dataset.
|
||||||
|
|
||||||
|
We use the sample database letter-recognition.data
|
||||||
|
from UCI Repository, here is the link:
|
||||||
|
|
||||||
|
Newman, D.J. & Hettich, S. & Blake, C.L. & Merz, C.J. (1998).
|
||||||
|
UCI Repository of machine learning databases
|
||||||
|
[http://www.ics.uci.edu/~mlearn/MLRepository.html].
|
||||||
|
Irvine, CA: University of California, Department of Information and Computer Science.
|
||||||
|
|
||||||
|
The dataset consists of 20000 feature vectors along with the
|
||||||
|
responses - capital latin letters A..Z.
|
||||||
|
The first 10000 samples are used for training
|
||||||
|
and the remaining 10000 - to test the classifier.
|
||||||
|
======================================================
|
||||||
|
USAGE:
|
||||||
|
letter_recog.py [--model <model>]
|
||||||
|
[--data <data fn>]
|
||||||
|
[--load <model fn>] [--save <model fn>]
|
||||||
|
|
||||||
|
Models: RTrees, KNearest, Boost, SVM, MLP
|
||||||
|
'''
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import cv2
|
import cv2
|
||||||
|
|
||||||
@ -77,7 +102,6 @@ class Boost(LetterStatModel):
|
|||||||
|
|
||||||
|
|
||||||
class SVM(LetterStatModel):
|
class SVM(LetterStatModel):
|
||||||
train_ratio = 0.1
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.model = cv2.SVM()
|
self.model = cv2.SVM()
|
||||||
|
|
||||||
@ -118,12 +142,11 @@ if __name__ == '__main__':
|
|||||||
import getopt
|
import getopt
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
print __doc__
|
||||||
|
|
||||||
models = [RTrees, KNearest, Boost, SVM, MLP] # NBayes
|
models = [RTrees, KNearest, Boost, SVM, MLP] # NBayes
|
||||||
models = dict( [(cls.__name__.lower(), cls) for cls in models] )
|
models = dict( [(cls.__name__.lower(), cls) for cls in models] )
|
||||||
|
|
||||||
print 'USAGE: letter_recog.py [--model <model>] [--data <data fn>] [--load <model fn>] [--save <model fn>]'
|
|
||||||
print 'Models: ', ', '.join(models)
|
|
||||||
print
|
|
||||||
|
|
||||||
args, dummy = getopt.getopt(sys.argv[1:], '', ['model=', 'data=', 'load=', 'save='])
|
args, dummy = getopt.getopt(sys.argv[1:], '', ['model=', 'data=', 'load=', 'save='])
|
||||||
args = dict(args)
|
args = dict(args)
|
||||||
|
Loading…
Reference in New Issue
Block a user