diff --git a/modules/hdf/CMakeLists.txt b/modules/hdf/CMakeLists.txt index 9bba8b48a..9dccc4eb0 100644 --- a/modules/hdf/CMakeLists.txt +++ b/modules/hdf/CMakeLists.txt @@ -1,6 +1,24 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}) -find_package(HDF5) +if(WIN32) + # windows cmake internal lookups are broken for now + # will lookup for headers and shared libs given HDF_DIR env + find_path(HDF5_INCLUDE_DIRS hdf5.h HINTS "$ENV{HDF5_DIR}\\..\\include") + find_library(HDF5_C_LIBRARY NAMES hdf5 HINTS "$ENV{HDF5_DIR}\\..\\lib") + if(HDF5_INCLUDE_DIRS AND HDF5_C_LIBRARY) + set(HDF5_FOUND "YES") + set(HDF5_LIBRARIES ${HDF5_C_LIBRARY}) + mark_as_advanced(HDF5_LIBRARIES) + mark_as_advanced(HDF5_C_LIBRARY) + mark_as_advanced(HDF5_INCLUDE_DIRS) + add_definitions(-DH5_BUILT_AS_DYNAMIC_LIB -D_HDF5USEDLL_) + else() + set(HDF5_FOUND "NO") + endif() +else() + find_package(HDF5) +endif() + if(HDF5_FOUND) set(HAVE_HDF5 1) message(STATUS "HDF5: YES") @@ -9,13 +27,13 @@ else() message(STATUS "HDF5: NO") endif() -if(${HDF5_FOUND}) +if(HDF5_FOUND) include_directories(${HDF5_INCLUDE_DIRS}) endif() set(the_description "Hierarchical Data Format I/O") ocv_define_module(hdf opencv_core WRAP python) -if(${HDF5_FOUND}) +if(HDF5_FOUND) target_link_libraries(opencv_hdf ${HDF5_LIBRARIES}) endif() diff --git a/modules/hdf/src/hdf5.cpp b/modules/hdf/src/hdf5.cpp index 1ebdf7f6d..136b66994 100644 --- a/modules/hdf/src/hdf5.cpp +++ b/modules/hdf/src/hdf5.cpp @@ -329,7 +329,7 @@ vector HDF5Impl::dsgetsize( String dslabel, int dims_flag ) const int n_dims = H5Sget_simple_extent_ndims( fspace ); // dims storage - hsize_t dims[n_dims]; + hsize_t *dims = new hsize_t[n_dims]; // output storage vector SizeVect(0); @@ -367,6 +367,8 @@ vector HDF5Impl::dsgetsize( String dslabel, int dims_flag ) const H5Dclose( dsdata ); H5Sclose( fspace ); + delete dims; + return SizeVect; } @@ -386,7 +388,7 @@ int HDF5Impl::dsgettype( String dslabel ) const // fetch channs hsize_t ardims[1]; H5Tget_array_dims( dstype, ardims ); - channs = ardims[0]; + channs = (int)ardims[0]; // fetch depth hid_t tsuper = H5Tget_super( dstype ); h5type = H5Tget_native_type( tsuper, H5T_DIR_ASCEND ); @@ -481,9 +483,9 @@ void HDF5Impl::dscreate( const int n_dims, const int* sizes, const int type, int channs = CV_MAT_CN( type ); - hsize_t chunks[n_dims]; - hsize_t dsdims[n_dims]; - hsize_t maxdim[n_dims]; + hsize_t *chunks = new hsize_t[n_dims]; + hsize_t *dsdims = new hsize_t[n_dims]; + hsize_t *maxdim = new hsize_t[n_dims]; // dimension space for ( int d = 0; d < n_dims; d++ ) @@ -529,7 +531,7 @@ void HDF5Impl::dscreate( const int n_dims, const int* sizes, const int type, // expand channs if ( channs > 1 ) { - hsize_t adims[1] = { channs }; + hsize_t adims[1] = { (hsize_t)channs }; dstype = H5Tarray_create( dstype, 1, adims ); } @@ -540,6 +542,10 @@ void HDF5Impl::dscreate( const int n_dims, const int* sizes, const int type, if ( channs > 1 ) H5Tclose( dstype ); + delete chunks; + delete dsdims; + delete maxdim; + H5Pclose( dsdcpl ); H5Sclose( dspace ); } @@ -554,7 +560,7 @@ void HDF5Impl::dsread( OutputArray Array, String dslabel ) const void HDF5Impl::dsread( OutputArray Array, String dslabel, const int* dims_offset ) const { - dsread( Array, dslabel, dims_offset ); + dsread( Array, dslabel, dims_offset, NULL ); } // overload @@ -585,7 +591,7 @@ void HDF5Impl::dsread( OutputArray Array, String dslabel, // fetch channs hsize_t ardims[1]; H5Tget_array_dims( dstype, ardims ); - channs = ardims[0]; + channs = (int) ardims[0]; // fetch depth hid_t tsuper = H5Tget_super( dstype ); h5type = H5Tget_native_type( tsuper, H5T_DIR_ASCEND ); @@ -602,7 +608,7 @@ void HDF5Impl::dsread( OutputArray Array, String dslabel, int n_dims = H5Sget_simple_extent_ndims( fspace ); // fetch dims - hsize_t dsdims[n_dims]; + hsize_t *dsdims = new hsize_t[n_dims]; H5Sget_simple_extent_dims( fspace, dsdims, NULL ); // set amount by custom offset @@ -620,8 +626,8 @@ void HDF5Impl::dsread( OutputArray Array, String dslabel, } // get memory write window - int mxdims[n_dims]; - hsize_t foffset[n_dims]; + int *mxdims = new int[n_dims]; + hsize_t *foffset = new hsize_t[n_dims]; for ( int d = 0; d < n_dims; d++ ) { foffset[d] = 0; @@ -653,6 +659,10 @@ void HDF5Impl::dsread( OutputArray Array, String dslabel, Mat matrix = Array.getMat(); H5Dread( dsdata, dstype, dspace, fspace, H5P_DEFAULT, matrix.data ); + delete dsdims; + delete mxdims; + delete foffset; + H5Tclose( dstype ); H5Sclose( dspace ); H5Sclose( fspace ); @@ -692,9 +702,9 @@ void HDF5Impl::dswrite( InputArray Array, String dslabel, int n_dims = matrix.dims; int channs = matrix.channels(); - int dsizes[n_dims]; - hsize_t dsdims[n_dims]; - hsize_t offset[n_dims]; + int *dsizes = new int[n_dims]; + hsize_t *dsdims = new hsize_t[n_dims]; + hsize_t *offset = new hsize_t[n_dims]; // replicate Mat dimensions for ( int d = 0; d < n_dims; d++ ) { @@ -738,7 +748,7 @@ void HDF5Impl::dswrite( InputArray Array, String dslabel, // expand channs if ( matrix.channels() > 1 ) { - hsize_t adims[1] = { channs }; + hsize_t adims[1] = { (hsize_t)channs }; dstype = H5Tarray_create( dstype, 1, adims ); } @@ -749,6 +759,10 @@ void HDF5Impl::dswrite( InputArray Array, String dslabel, if ( matrix.channels() > 1 ) H5Tclose( dstype ); + delete dsizes; + delete dsdims; + delete offset; + H5Sclose( dspace ); H5Sclose( fspace ); H5Dclose( dsdata ); @@ -793,8 +807,8 @@ void HDF5Impl::dsinsert( InputArray Array, String dslabel, int n_dims = matrix.dims; int channs = matrix.channels(); - hsize_t dsdims[n_dims]; - hsize_t offset[n_dims]; + hsize_t *dsdims = new hsize_t[n_dims]; + hsize_t *offset = new hsize_t[n_dims]; // replicate Mat dimensions for ( int d = 0; d < n_dims; d++ ) { @@ -828,14 +842,14 @@ void HDF5Impl::dsinsert( InputArray Array, String dslabel, // get actual file space and dims hid_t fspace = H5Dget_space( dsdata ); int f_dims = H5Sget_simple_extent_ndims( fspace ); - hsize_t fsdims[f_dims]; + hsize_t *fsdims = new hsize_t[f_dims]; H5Sget_simple_extent_dims( fspace, fsdims, NULL ); H5Sclose( fspace ); CV_Assert( f_dims == n_dims ); // compute new extents - hsize_t nwdims[n_dims]; + hsize_t *nwdims = new hsize_t[n_dims]; for ( int d = 0; d < n_dims; d++ ) { // init @@ -869,7 +883,7 @@ void HDF5Impl::dsinsert( InputArray Array, String dslabel, // expand channs if ( matrix.channels() > 1 ) { - hsize_t adims[1] = { channs }; + hsize_t adims[1] = { (hsize_t)channs }; dstype = H5Tarray_create( dstype, 1, adims ); } @@ -880,6 +894,11 @@ void HDF5Impl::dsinsert( InputArray Array, String dslabel, if ( matrix.channels() > 1 ) H5Tclose( dstype ); + delete dsdims; + delete offset; + delete fsdims; + delete nwdims; + H5Sclose( dspace ); H5Sclose( fspace ); H5Dclose( dsdata ); @@ -976,16 +995,18 @@ void HDF5Impl::kpwrite( const vector keypoints, String kplabel, { CV_Assert( keypoints.size() > 0 ); + int dskdims[1]; hsize_t dsddims[1]; hsize_t doffset[1]; // replicate vector dimension doffset[0] = 0; dsddims[0] = keypoints.size(); + dskdims[0] = (int)keypoints.size(); // pre-create dataset if needed if ( hlexists( kplabel ) == false ) - kpcreate( dsddims[0], kplabel ); + kpcreate( dskdims[0], kplabel ); // set custom amount of data if ( counts != H5_NONE ) @@ -1058,7 +1079,7 @@ void HDF5Impl::kpinsert( const vector keypoints, String kplabel, // get actual file space and dims hid_t fspace = H5Dget_space( dsdata ); int f_dims = H5Sget_simple_extent_ndims( fspace ); - hsize_t fsdims[f_dims]; + hsize_t *fsdims = new hsize_t[f_dims]; H5Sget_simple_extent_dims( fspace, fsdims, NULL ); H5Sclose( fspace ); @@ -1101,6 +1122,8 @@ void HDF5Impl::kpinsert( const vector keypoints, String kplabel, // write into dataset H5Dwrite( dsdata, mmtype, dspace, fspace, H5P_DEFAULT, &keypoints[0] ); + delete fsdims; + H5Tclose( mmtype ); H5Sclose( dspace ); H5Sclose( fspace );