mirror of https://github.com/opencv/opencv.git
Merge pull request #3156 from sergregory:CreateSamplesMod
commit
d7737528d1
8 changed files with 618 additions and 96 deletions
@ -0,0 +1,227 @@ |
||||
#include "cvsamplesoutput.h" |
||||
|
||||
#include <cstdio> |
||||
|
||||
#include "_cvcommon.h" |
||||
#include "highgui.h" |
||||
|
||||
/* print statistic info */ |
||||
#define CV_VERBOSE 1 |
||||
|
||||
IOutput::IOutput() |
||||
: currentIdx(0) |
||||
{} |
||||
|
||||
void IOutput::findFilePathPart(char **partOfPath, char *fullPath) |
||||
{ |
||||
*partOfPath = strrchr( fullPath, '\\' ); |
||||
if( *partOfPath == NULL ) |
||||
{ |
||||
*partOfPath = strrchr( fullPath, '/' ); |
||||
} |
||||
if( *partOfPath == NULL ) |
||||
{ |
||||
*partOfPath = fullPath; |
||||
} |
||||
else |
||||
{ |
||||
*partOfPath += 1; |
||||
} |
||||
} |
||||
|
||||
IOutput* IOutput::createOutput(const char *filename, |
||||
IOutput::OutputType type) |
||||
{ |
||||
IOutput* output = 0; |
||||
switch (type) { |
||||
case IOutput::PNG_DATASET: |
||||
output = new PngDatasetOutput(); |
||||
break; |
||||
case IOutput::JPG_DATASET: |
||||
output = new JpgDatasetOutput(); |
||||
break; |
||||
default: |
||||
#if CV_VERBOSE |
||||
fprintf( stderr, "Invalid output type, valid types are: PNG_TRAINING_SET, JPG_TEST_SET"); |
||||
#endif /* CV_VERBOSE */ |
||||
return 0; |
||||
} |
||||
|
||||
if ( output->init( filename ) ) |
||||
return output; |
||||
else |
||||
return 0; |
||||
} |
||||
|
||||
bool PngDatasetOutput::init( const char* annotationsListFileName ) |
||||
{ |
||||
IOutput::init( annotationsListFileName ); |
||||
|
||||
if(imgFileName == imgFullPath) |
||||
{ |
||||
#if CV_VERBOSE |
||||
fprintf( stderr, "Invalid path to annotations file: %s\n" |
||||
"It should contain a parent directory name\n", imgFullPath ); |
||||
#endif /* CV_VERBOSE */ |
||||
return false; |
||||
} |
||||
|
||||
|
||||
const char* annotationsdirname = "/annotations/"; |
||||
const char* positivesdirname = "/pos/"; |
||||
|
||||
imgFileName[-1] = '\0'; //erase slash at the end of the path
|
||||
imgFileName -= 1; |
||||
|
||||
//copy path to dataset top-level dir
|
||||
strcpy(annotationFullPath, imgFullPath); |
||||
//find the name of annotation starting from the top-level dataset dir
|
||||
findFilePathPart(&annotationRelativePath, annotationFullPath); |
||||
if( !strcmp( annotationRelativePath, ".." ) || !strcmp( annotationRelativePath, "." ) ) |
||||
{ |
||||
#if CV_VERBOSE |
||||
fprintf( stderr, "Invalid path to annotations file: %s\n" |
||||
"It should contain a parent directory name\n", annotationsListFileName ); |
||||
#endif /* CV_VERBOSE */ |
||||
return false; |
||||
} |
||||
//find the name of output image starting from the top-level dataset dir
|
||||
findFilePathPart(&imgRelativePath, imgFullPath); |
||||
annotationFileName = annotationFullPath + strlen(annotationFullPath); |
||||
|
||||
sprintf(annotationFileName, "%s", annotationsdirname); |
||||
annotationFileName += strlen(annotationFileName); |
||||
sprintf(imgFileName, "%s", positivesdirname); |
||||
imgFileName += strlen(imgFileName); |
||||
|
||||
if( !icvMkDir( annotationFullPath ) ) |
||||
{ |
||||
#if CV_VERBOSE |
||||
fprintf( stderr, "Unable to create directory hierarchy: %s\n", annotationFullPath ); |
||||
#endif /* CV_VERBOSE */ |
||||
return false; |
||||
} |
||||
if( !icvMkDir( imgFullPath ) ) |
||||
{ |
||||
#if CV_VERBOSE |
||||
fprintf( stderr, "Unable to create directory hierarchy: %s\n", imgFullPath ); |
||||
#endif /* CV_VERBOSE */ |
||||
return false; |
||||
} |
||||
|
||||
return true; |
||||
} |
||||
|
||||
bool PngDatasetOutput::write( const CvMat& img, |
||||
const CvRect& boundingBox ) |
||||
{ |
||||
CvRect bbox = addBoundingboxBorder(boundingBox); |
||||
|
||||
sprintf( imgFileName, |
||||
"%04d_%04d_%04d_%04d_%04d", |
||||
++currentIdx, |
||||
bbox.x, |
||||
bbox.y, |
||||
bbox.width, |
||||
bbox.height ); |
||||
|
||||
sprintf( annotationFileName, "%s.txt", imgFileName ); |
||||
fprintf( annotationsList, "%s\n", annotationRelativePath ); |
||||
|
||||
FILE* annotationFile = fopen( annotationFullPath, "w" ); |
||||
if(annotationFile == 0) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
sprintf( imgFileName + strlen(imgFileName), ".%s", extension ); |
||||
|
||||
|
||||
|
||||
fprintf( annotationFile, |
||||
"Image filename : \"%s\"\n" |
||||
"Bounding box for object 1 \"PASperson\" (Xmin, Ymin) - (Xmax, Ymax) : (%d, %d) - (%d, %d)", |
||||
imgRelativePath, |
||||
bbox.x, |
||||
bbox.y, |
||||
bbox.x + bbox.width, |
||||
bbox.y + bbox.height ); |
||||
fclose( annotationFile ); |
||||
|
||||
cvSaveImage( imgFullPath, &img); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
CvRect PngDatasetOutput::addBoundingboxBorder(const CvRect& bbox) const |
||||
{ |
||||
CvRect boundingBox = bbox; |
||||
int border = 5; |
||||
|
||||
boundingBox.x -= border; |
||||
boundingBox.y -= border; |
||||
boundingBox.width += 2*border; |
||||
boundingBox.height += 2*border; |
||||
|
||||
return boundingBox; |
||||
} |
||||
|
||||
IOutput::~IOutput() |
||||
{ |
||||
if(annotationsList) |
||||
{ |
||||
fclose(annotationsList); |
||||
} |
||||
} |
||||
|
||||
bool IOutput::init(const char *filename) |
||||
{ |
||||
assert( filename != NULL ); |
||||
|
||||
if( !icvMkDir( filename ) ) |
||||
{ |
||||
|
||||
#if CV_VERBOSE |
||||
fprintf( stderr, "Unable to create directory hierarchy: %s\n", filename ); |
||||
#endif /* CV_VERBOSE */ |
||||
|
||||
return false; |
||||
} |
||||
|
||||
annotationsList = fopen( filename, "w" ); |
||||
if( annotationsList == NULL ) |
||||
{ |
||||
#if CV_VERBOSE |
||||
fprintf( stderr, "Unable to create info file: %s\n", filename ); |
||||
#endif /* CV_VERBOSE */ |
||||
return false; |
||||
} |
||||
strcpy( imgFullPath, filename ); |
||||
|
||||
findFilePathPart( &imgFileName, imgFullPath ); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
bool JpgDatasetOutput::write( const CvMat& img, |
||||
const CvRect& boundingBox ) |
||||
{ |
||||
sprintf( imgFileName, "%04d_%04d_%04d_%04d_%04d.jpg", |
||||
++currentIdx, |
||||
boundingBox.x, |
||||
boundingBox.y, |
||||
boundingBox.width, |
||||
boundingBox.height ); |
||||
|
||||
fprintf( annotationsList, "%s %d %d %d %d %d\n", |
||||
imgFileName, |
||||
1, |
||||
boundingBox.x, |
||||
boundingBox.y, |
||||
boundingBox.width, |
||||
boundingBox.height ); |
||||
|
||||
cvSaveImage( imgFullPath, &img); |
||||
|
||||
return true; |
||||
} |
@ -0,0 +1,46 @@ |
||||
#ifndef CVSAMPLESOUTPUT_H |
||||
#define CVSAMPLESOUTPUT_H |
||||
|
||||
#include "ioutput.h" |
||||
|
||||
class PngDatasetOutput: public IOutput |
||||
{ |
||||
friend IOutput* IOutput::createOutput(const char *filename, OutputType type); |
||||
public: |
||||
virtual bool write( const CvMat& img, |
||||
const CvRect& boundingBox); |
||||
|
||||
virtual ~PngDatasetOutput(){} |
||||
private: |
||||
PngDatasetOutput() |
||||
: extension("png") |
||||
, destImgWidth(640) |
||||
, destImgHeight(480) |
||||
{} |
||||
|
||||
virtual bool init(const char* annotationsListFileName ); |
||||
|
||||
CvRect addBoundingboxBorder(const CvRect& bbox) const; |
||||
private: |
||||
|
||||
char annotationFullPath[PATH_MAX]; |
||||
char* annotationFileName; |
||||
char* annotationRelativePath; |
||||
char* imgRelativePath; |
||||
const char* extension; |
||||
|
||||
int destImgWidth; |
||||
int destImgHeight ; |
||||
}; |
||||
|
||||
class JpgDatasetOutput: public IOutput |
||||
{ |
||||
friend IOutput* IOutput::createOutput(const char *filename, OutputType type); |
||||
public: |
||||
virtual bool write( const CvMat& img, |
||||
const CvRect& boundingBox ); |
||||
virtual ~JpgDatasetOutput(){} |
||||
private: |
||||
JpgDatasetOutput(){} |
||||
}; |
||||
#endif // CVSAMPLESOUTPUT_H
|
@ -0,0 +1,34 @@ |
||||
#ifndef IOUTPUT_H |
||||
#define IOUTPUT_H |
||||
|
||||
#include <cstdio> |
||||
|
||||
#include "_cvcommon.h" |
||||
|
||||
struct CvMat; |
||||
struct CvRect; |
||||
|
||||
class IOutput |
||||
{ |
||||
public: |
||||
enum OutputType {PNG_DATASET, JPG_DATASET}; |
||||
public: |
||||
virtual bool write( const CvMat& img, |
||||
const CvRect& boundingBox ) =0; |
||||
|
||||
virtual ~IOutput(); |
||||
|
||||
static IOutput* createOutput( const char *filename, OutputType type ); |
||||
protected: |
||||
IOutput(); |
||||
/* finds the beginning of the last token in the path */ |
||||
void findFilePathPart( char **partOfPath, char *fullPath ); |
||||
virtual bool init( const char* filename ); |
||||
protected: |
||||
int currentIdx; |
||||
char imgFullPath[PATH_MAX]; |
||||
char* imgFileName; |
||||
FILE* annotationsList; |
||||
}; |
||||
|
||||
#endif // IOUTPUT_H
|
Loading…
Reference in new issue