Commit b906ad31 authored by Andrey Kamaev's avatar Andrey Kamaev

Test system included into Android build

parent 1a02877a
...@@ -511,6 +511,7 @@ if(WITH_JASPER AND NOT JASPER_FOUND) ...@@ -511,6 +511,7 @@ if(WITH_JASPER AND NOT JASPER_FOUND)
endif() endif()
if (ANDROID) if (ANDROID)
#android camera support
set(NativeCamera_DIR "${CMAKE_SOURCE_DIR}/android/native-camera/build") set(NativeCamera_DIR "${CMAKE_SOURCE_DIR}/android/native-camera/build")
FIND_PACKAGE(NativeCamera QUIET) FIND_PACKAGE(NativeCamera QUIET)
if(NativeCamera_FOUND) if(NativeCamera_FOUND)
...@@ -1099,15 +1100,15 @@ endif() ...@@ -1099,15 +1100,15 @@ endif()
set(CMAKE_INCLUDE_DIRS_CONFIGCMAKE "\"${OPENCV_CONFIG_FILE_INCLUDE_DIR}\" \"${CMAKE_CURRENT_SOURCE_DIR}/include\" \"${CMAKE_CURRENT_SOURCE_DIR}/include/opencv\"") set(CMAKE_INCLUDE_DIRS_CONFIGCMAKE "\"${OPENCV_CONFIG_FILE_INCLUDE_DIR}\" \"${CMAKE_CURRENT_SOURCE_DIR}/include\" \"${CMAKE_CURRENT_SOURCE_DIR}/include/opencv\"")
set(CMAKE_BASE_INCLUDE_DIRS_CONFIGCMAKE "\"${CMAKE_CURRENT_SOURCE_DIR}\"") set(CMAKE_BASE_INCLUDE_DIRS_CONFIGCMAKE "\"${CMAKE_CURRENT_SOURCE_DIR}\"")
set(CMAKE_LIB_DIRS_CONFIGCMAKE "${LIBRARY_OUTPUT_PATH}") set(CMAKE_LIB_DIRS_CONFIGCMAKE "${LIBRARY_OUTPUT_PATH}")
if (ANDROID) if (ANDROID)
if (NOT BUILD_SHARED_LIBS) if (NOT BUILD_SHARED_LIBS)
set(CMAKE_LIB_DIRS_CONFIGCMAKE ${CMAKE_LIB_DIRS_CONFIGCMAKE} "${CMAKE_BINARY_DIR}/lib") set(CMAKE_LIB_DIRS_CONFIGCMAKE ${CMAKE_LIB_DIRS_CONFIGCMAKE} "${CMAKE_BINARY_DIR}/lib")
endif() endif()
if( HAVE_ANDROID_NATIVE_CAMERA ) if( HAVE_ANDROID_NATIVE_CAMERA )
set(CMAKE_LIB_DIRS_CONFIGCMAKE ${CMAKE_LIB_DIRS_CONFIGCMAKE} ${NativeCamera_LIB_DIR}) set(CMAKE_LIB_DIRS_CONFIGCMAKE ${CMAKE_LIB_DIRS_CONFIGCMAKE} ${NativeCamera_LIB_DIR})
endif() endif()
endif() endif()
......
...@@ -82,7 +82,7 @@ macro(define_opencv_module name) ...@@ -82,7 +82,7 @@ macro(define_opencv_module name)
DESTINATION include/opencv2/${name} DESTINATION include/opencv2/${name}
COMPONENT main) COMPONENT main)
if(BUILD_TESTS AND NOT ANDROID AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test) if(BUILD_TESTS AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test)
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include" include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include"
"${CMAKE_CURRENT_SOURCE_DIR}/test" "${CMAKE_CURRENT_SOURCE_DIR}/test"
"${CMAKE_CURRENT_BINARY_DIR}") "${CMAKE_CURRENT_BINARY_DIR}")
......
...@@ -25,7 +25,7 @@ set(BUILD_SHARED_LIBS OFF CACHE BOOL "" ) ...@@ -25,7 +25,7 @@ set(BUILD_SHARED_LIBS OFF CACHE BOOL "" )
set(OPENCV_BUILD_3RDPARTY_LIBS ON CACHE BOOL "" ) set(OPENCV_BUILD_3RDPARTY_LIBS ON CACHE BOOL "" )
#Build tests #Build tests
set(BUILD_TESTS OFF CACHE BOOL "" ) #set(BUILD_TESTS OFF CACHE BOOL "" )
#Choose the type of build, options are: None Debug Release RelWithDebInfo #Choose the type of build, options are: None Debug Release RelWithDebInfo
# MinSizeRel. # MinSizeRel.
......
if (ANDROID)
ADD_DEFINITIONS(-DGTEST_HAS_STD_WSTRING=0)
endif()
add_subdirectory(calib3d) add_subdirectory(calib3d)
add_subdirectory(core) add_subdirectory(core)
add_subdirectory(features2d) add_subdirectory(features2d)
...@@ -9,9 +13,7 @@ if(MSVC OR MINGW) ...@@ -9,9 +13,7 @@ if(MSVC OR MINGW)
endif() endif()
endif() endif()
if(NOT ANDROID)
add_subdirectory(ts) add_subdirectory(ts)
endif()
add_subdirectory(highgui) add_subdirectory(highgui)
add_subdirectory(imgproc) add_subdirectory(imgproc)
add_subdirectory(legacy) add_subdirectory(legacy)
......
...@@ -103,7 +103,7 @@ CV_EXPORTS string fromUtf16(const WString& str); ...@@ -103,7 +103,7 @@ CV_EXPORTS string fromUtf16(const WString& str);
CV_EXPORTS WString toUtf16(const string& str); CV_EXPORTS WString toUtf16(const string& str);
CV_EXPORTS string format( const char* fmt, ... ); CV_EXPORTS string format( const char* fmt, ... );
CV_EXPORTS string tempfile( const char* suffix CV_DEFAULT(0));
// matrix decomposition types // matrix decomposition types
enum { DECOMP_LU=0, DECOMP_SVD=1, DECOMP_EIG=2, DECOMP_CHOLESKY=3, DECOMP_QR=4, DECOMP_NORMAL=16 }; enum { DECOMP_LU=0, DECOMP_SVD=1, DECOMP_EIG=2, DECOMP_CHOLESKY=3, DECOMP_QR=4, DECOMP_NORMAL=16 };
......
...@@ -349,6 +349,23 @@ string format( const char* fmt, ... ) ...@@ -349,6 +349,23 @@ string format( const char* fmt, ... )
return string(buf); return string(buf);
} }
string tempfile( const char* suffix )
{
char buf[L_tmpnam];
char* name = 0;
#if ANDROID
strcpy(buf, "/sdcard/__opencv_temp_XXXXXX");
name = mktemp(buf);
#else
name = tmpnam(buf);
#endif
if (*name == '\\')
++name;
if (suffix != 0)
return string(buf) + suffix;
return buf;
}
static CvErrorCallback customErrorCallback = 0; static CvErrorCallback customErrorCallback = 0;
static void* customErrorCallbackData = 0; static void* customErrorCallbackData = 0;
static bool breakOnError = false; static bool breakOnError = false;
......
...@@ -102,13 +102,9 @@ protected: ...@@ -102,13 +102,9 @@ protected:
cvClearMemStorage(storage); cvClearMemStorage(storage);
char buf[L_tmpnam+16]; string filename = tempfile(idx % 2 ? ".yml" : ".xml");
char* filename = tmpnam(buf);
strcat(filename, idx % 2 ? ".yml" : ".xml");
if(filename[0] == '\\')
filename++;
FileStorage fs(filename, FileStorage::WRITE); FileStorage fs(filename.c_str(), FileStorage::WRITE);
int test_int = (int)cvtest::randInt(rng); int test_int = (int)cvtest::randInt(rng);
double test_real = (cvtest::randInt(rng)%2?1:-1)*exp(cvtest::randReal(rng)*18-9); double test_real = (cvtest::randInt(rng)%2?1:-1)*exp(cvtest::randReal(rng)*18-9);
...@@ -185,9 +181,9 @@ protected: ...@@ -185,9 +181,9 @@ protected:
fs.release(); fs.release();
if(!fs.open(filename, FileStorage::READ)) if(!fs.open(filename.c_str(), FileStorage::READ))
{ {
ts->printf( cvtest::TS::LOG, "filename %s can not be read\n", filename ); ts->printf( cvtest::TS::LOG, "filename %s can not be read\n", filename.c_str() );
ts->set_failed_test_info( cvtest::TS::FAIL_MISSING_TEST_DATA ); ts->set_failed_test_info( cvtest::TS::FAIL_MISSING_TEST_DATA );
return; return;
} }
...@@ -374,7 +370,7 @@ protected: ...@@ -374,7 +370,7 @@ protected:
} }
fs.release(); fs.release();
remove(filename); remove(filename.c_str());
} }
} }
}; };
......
...@@ -502,13 +502,11 @@ void CV_FlannSavedIndexTest::createModel(const cv::Mat &data) ...@@ -502,13 +502,11 @@ void CV_FlannSavedIndexTest::createModel(const cv::Mat &data)
//case 2: createIndex( data, AutotunedIndexParams() ); break; // possible linear index ! //case 2: createIndex( data, AutotunedIndexParams() ); break; // possible linear index !
default: assert(0); default: assert(0);
} }
char filename[50]; string filename = tempfile();
tmpnam( filename );
if(filename[0] == '\\') filename[0] = '_';
index->save( filename ); index->save( filename );
createIndex( data, SavedIndexParams(filename)); createIndex( data, SavedIndexParams(filename.c_str()));
remove( filename ); remove( filename.c_str() );
} }
TEST(Features2d_LSH, regression) { CV_LSHTest test; test.safe_run(); } TEST(Features2d_LSH, regression) { CV_LSHTest test; test.safe_run(); }
......
...@@ -153,7 +153,7 @@ install(FILES ${lib_hdrs} ...@@ -153,7 +153,7 @@ install(FILES ${lib_hdrs}
# Test files processing is in the separated directory to avoid 'Src' source # Test files processing is in the separated directory to avoid 'Src' source
# filter creation in Visual Studio # filter creation in Visual Studio
if(BUILD_TESTS AND NOT ANDROID AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test) if(BUILD_TESTS AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test)
set(the_test_target "opencv_test_${name}") set(the_test_target "opencv_test_${name}")
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include" include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include"
......
...@@ -183,16 +183,15 @@ CvCapture_OpenNI::CvCapture_OpenNI() ...@@ -183,16 +183,15 @@ CvCapture_OpenNI::CvCapture_OpenNI()
// Write configuration to the temporary file. // Write configuration to the temporary file.
// This is a hack, because there is a bug in RunXmlScript(). // This is a hack, because there is a bug in RunXmlScript().
// TODO: remove hack when bug in RunXmlScript() will be fixed. // TODO: remove hack when bug in RunXmlScript() will be fixed.
char xmlFilename[100]; string xmlFilename = tempfile();
tmpnam( xmlFilename ); std::ofstream outfile( xmlFilename.c_str() );
std::ofstream outfile( xmlFilename );
outfile.write( XMLConfig.c_str(), XMLConfig.length() ); outfile.write( XMLConfig.c_str(), XMLConfig.length() );
outfile.close(); outfile.close();
status = context.RunXmlScriptFromFile( xmlFilename ); status = context.RunXmlScriptFromFile( xmlFilename.c_str() );
// Remove temporary configuration file. // Remove temporary configuration file.
remove( xmlFilename ); remove( xmlFilename.c_str() );
#else #else
status = context.RunXmlScript( XMLConfig.c_str() ); status = context.RunXmlScript( XMLConfig.c_str() );
#endif #endif
......
...@@ -308,8 +308,8 @@ imdecode_( const Mat& buf, int flags, int hdrtype, Mat* mat=0 ) ...@@ -308,8 +308,8 @@ imdecode_( const Mat& buf, int flags, int hdrtype, Mat* mat=0 )
IplImage* image = 0; IplImage* image = 0;
CvMat *matrix = 0; CvMat *matrix = 0;
Mat temp, *data = &temp; Mat temp, *data = &temp;
char fnamebuf[L_tmpnam+1]; string filename = tempfile();
const char* filename = 0; bool removeTempFile = false;
ImageDecoder decoder = findDecoder(buf); ImageDecoder decoder = findDecoder(buf);
if( decoder.empty() ) if( decoder.empty() )
...@@ -317,12 +317,10 @@ imdecode_( const Mat& buf, int flags, int hdrtype, Mat* mat=0 ) ...@@ -317,12 +317,10 @@ imdecode_( const Mat& buf, int flags, int hdrtype, Mat* mat=0 )
if( !decoder->setSource(buf) ) if( !decoder->setSource(buf) )
{ {
filename = tmpnam(fnamebuf); FILE* f = fopen( filename.c_str(), "wb" );
if(filename[0] == '\\')
filename++;
FILE* f = fopen( filename, "wb" );
if( !f ) if( !f )
return 0; return 0;
removeTempFile = true;
size_t bufSize = buf.cols*buf.rows*buf.elemSize(); size_t bufSize = buf.cols*buf.rows*buf.elemSize();
fwrite( &buf.data[0], 1, bufSize, f ); fwrite( &buf.data[0], 1, bufSize, f );
fclose(f); fclose(f);
...@@ -331,8 +329,8 @@ imdecode_( const Mat& buf, int flags, int hdrtype, Mat* mat=0 ) ...@@ -331,8 +329,8 @@ imdecode_( const Mat& buf, int flags, int hdrtype, Mat* mat=0 )
if( !decoder->readHeader() ) if( !decoder->readHeader() )
{ {
if( filename ) if( removeTempFile )
remove(filename); remove(filename.c_str());
return 0; return 0;
} }
...@@ -373,8 +371,8 @@ imdecode_( const Mat& buf, int flags, int hdrtype, Mat* mat=0 ) ...@@ -373,8 +371,8 @@ imdecode_( const Mat& buf, int flags, int hdrtype, Mat* mat=0 )
} }
bool code = decoder->readData( *data ); bool code = decoder->readData( *data );
if( filename ) if( removeTempFile )
remove(filename); remove(filename.c_str());
if( !code ) if( !code )
{ {
...@@ -425,15 +423,12 @@ bool imencode( const string& ext, const Mat& image, ...@@ -425,15 +423,12 @@ bool imencode( const string& ext, const Mat& image,
} }
else else
{ {
char fnamebuf[L_tmpnam]; string filename = tempfile();
const char* filename = tmpnam(fnamebuf);
if(filename[0] == '\\')
filename++;
code = encoder->setDestination(filename); code = encoder->setDestination(filename);
CV_Assert( code ); CV_Assert( code );
code = encoder->write(image, params); code = encoder->write(image, params);
CV_Assert( code ); CV_Assert( code );
FILE* f = fopen( filename, "rb" ); FILE* f = fopen( filename.c_str(), "rb" );
CV_Assert(f != 0); CV_Assert(f != 0);
fseek( f, 0, SEEK_END ); fseek( f, 0, SEEK_END );
long pos = ftell(f); long pos = ftell(f);
...@@ -441,7 +436,7 @@ bool imencode( const string& ext, const Mat& image, ...@@ -441,7 +436,7 @@ bool imencode( const string& ext, const Mat& image,
fseek( f, 0, SEEK_SET ); fseek( f, 0, SEEK_SET );
buf.resize(fread( &buf[0], 1, buf.size(), f )); buf.resize(fread( &buf[0], 1, buf.size(), f ));
fclose(f); fclose(f);
remove(filename); remove(filename.c_str());
} }
return code; return code;
} }
......
...@@ -68,9 +68,7 @@ struct TempDirHolder ...@@ -68,9 +68,7 @@ struct TempDirHolder
string temp_folder; string temp_folder;
TempDirHolder() TempDirHolder()
{ {
char* p = tmpnam(0); temp_folder = tempfile();
if(p[0] == '\\') p++;
temp_folder = string(p);
exec_cmd("mkdir " + temp_folder); exec_cmd("mkdir " + temp_folder);
} }
~TempDirHolder() { exec_cmd("rm -rf " + temp_folder); } ~TempDirHolder() { exec_cmd("rm -rf " + temp_folder); }
......
...@@ -23,10 +23,8 @@ protected: ...@@ -23,10 +23,8 @@ protected:
int checkPredictError(int test_num); int checkPredictError(int test_num);
int checkLoadSave(); int checkLoadSave();
//string model_file_name1; string model_file_name1;
//string model_file_name2; string model_file_name2;
char model_file_name1[50];
char model_file_name2[50];
string* datasets; string* datasets;
string data_path; string data_path;
...@@ -162,19 +160,14 @@ int CV_GBTreesTest::TestSaveLoad() ...@@ -162,19 +160,14 @@ int CV_GBTreesTest::TestSaveLoad()
if (!gtb) if (!gtb)
return cvtest::TS::FAIL_GENERIC; return cvtest::TS::FAIL_GENERIC;
tmpnam(model_file_name1); model_file_name1 = cv::tempfile();
tmpnam(model_file_name2); model_file_name2 = cv::tempfile();
if(model_file_name1[0] == '\\') gtb->save(model_file_name1.c_str());
model_file_name1[0] = '_';
if(model_file_name2[0] == '\\')
model_file_name2[0] = '_';
gtb->save(model_file_name1);
gtb->calc_error(data, CV_TEST_ERROR, &test_resps1); gtb->calc_error(data, CV_TEST_ERROR, &test_resps1);
gtb->load(model_file_name1); gtb->load(model_file_name1.c_str());
gtb->calc_error(data, CV_TEST_ERROR, &test_resps2); gtb->calc_error(data, CV_TEST_ERROR, &test_resps2);
gtb->save(model_file_name2); gtb->save(model_file_name2.c_str());
return checkLoadSave(); return checkLoadSave();
...@@ -187,7 +180,7 @@ int CV_GBTreesTest::checkLoadSave() ...@@ -187,7 +180,7 @@ int CV_GBTreesTest::checkLoadSave()
int code = cvtest::TS::OK; int code = cvtest::TS::OK;
// 1. compare files // 1. compare files
ifstream f1( model_file_name1 ), f2( model_file_name2 ); ifstream f1( model_file_name1.c_str() ), f2( model_file_name2.c_str() );
string s1, s2; string s1, s2;
int lineIdx = 0; int lineIdx = 0;
CV_Assert( f1.is_open() && f2.is_open() ); CV_Assert( f1.is_open() && f2.is_open() );
...@@ -211,8 +204,8 @@ int CV_GBTreesTest::checkLoadSave() ...@@ -211,8 +204,8 @@ int CV_GBTreesTest::checkLoadSave()
f1.close(); f1.close();
f2.close(); f2.close();
// delete temporary files // delete temporary files
remove( model_file_name1 ); remove( model_file_name1.c_str() );
remove( model_file_name2 ); remove( model_file_name2.c_str() );
// 2. compare responses // 2. compare responses
CV_Assert( test_resps1.size() == test_resps2.size() ); CV_Assert( test_resps1.size() == test_resps2.size() );
......
...@@ -74,7 +74,7 @@ protected: ...@@ -74,7 +74,7 @@ protected:
virtual int validate_test_results( int testCaseIdx ); virtual int validate_test_results( int testCaseIdx );
std::vector<float> test_resps1, test_resps2; // predicted responses for test data std::vector<float> test_resps1, test_resps2; // predicted responses for test data
char fname1[50], fname2[50]; std::string fname1, fname2;
}; };
#endif #endif
...@@ -64,14 +64,12 @@ int CV_SLMLTest::run_test_case( int testCaseIdx ) ...@@ -64,14 +64,12 @@ int CV_SLMLTest::run_test_case( int testCaseIdx )
if( code == cvtest::TS::OK ) if( code == cvtest::TS::OK )
{ {
get_error( testCaseIdx, CV_TEST_ERROR, &test_resps1 ); get_error( testCaseIdx, CV_TEST_ERROR, &test_resps1 );
tmpnam(fname1); fname1 = tempfile();
if(fname1[0] == '\\') fname1[0] = '_'; save( fname1.c_str() );
save( fname1 ); load( fname1.c_str() );
load( fname1);
get_error( testCaseIdx, CV_TEST_ERROR, &test_resps2 ); get_error( testCaseIdx, CV_TEST_ERROR, &test_resps2 );
tmpnam(fname2); fname2 = tempfile();
if(fname2[0] == '\\') fname2[0] = '_'; save( fname2.c_str() );
save( fname2 );
} }
else else
ts->printf( cvtest::TS::LOG, "model can not be trained" ); ts->printf( cvtest::TS::LOG, "model can not be trained" );
...@@ -84,7 +82,7 @@ int CV_SLMLTest::validate_test_results( int testCaseIdx ) ...@@ -84,7 +82,7 @@ int CV_SLMLTest::validate_test_results( int testCaseIdx )
int code = cvtest::TS::OK; int code = cvtest::TS::OK;
// 1. compare files // 1. compare files
ifstream f1( fname1 ), f2( fname2 ); ifstream f1( fname1.c_str() ), f2( fname2.c_str() );
string s1, s2; string s1, s2;
int lineIdx = 0; int lineIdx = 0;
CV_Assert( f1.is_open() && f2.is_open() ); CV_Assert( f1.is_open() && f2.is_open() );
...@@ -108,8 +106,8 @@ int CV_SLMLTest::validate_test_results( int testCaseIdx ) ...@@ -108,8 +106,8 @@ int CV_SLMLTest::validate_test_results( int testCaseIdx )
f1.close(); f1.close();
f2.close(); f2.close();
// delete temporary files // delete temporary files
remove( fname1 ); remove( fname1.c_str() );
remove( fname2 ); remove( fname2.c_str() );
// 2. compare responses // 2. compare responses
CV_Assert( test_resps1.size() == test_resps2.size() ); CV_Assert( test_resps1.size() == test_resps2.size() );
......
#include "precomp.hpp" #include "precomp.hpp"
#if ANDROID
int wcscasecmp(const wchar_t* lhs, const wchar_t* rhs)
{
wint_t left, right;
do {
left = towlower(*lhs++);
right = towlower(*rhs++);
} while (left && left == right);
return left == right;
}
#endif
...@@ -6,3 +6,7 @@ ...@@ -6,3 +6,7 @@
#include "opencv2/ts/ts.hpp" #include "opencv2/ts/ts.hpp"
#include "opencv2/core/core_c.h" #include "opencv2/core/core_c.h"
#if ANDROID
int wcscasecmp(const wchar_t* lhs, const wchar_t* rhs);
#endif
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment