Skip to content

Commit

Permalink
Merge pull request opencv#10287 from sturkmen72:update_createsamples_cpp
Browse files Browse the repository at this point in the history
* update createsamples

adds command-line option -rngseed
replaces rand() -> theRNG()

* Update utility.cpp

* apps(createsamples): fix warpPerspective pixels access bug
sturkmen72 authored and alalek committed Dec 15, 2017
1 parent 7d4a67f commit c5ed507
Showing 2 changed files with 40 additions and 35 deletions.
22 changes: 14 additions & 8 deletions apps/createsamples/createsamples.cpp
Original file line number Diff line number Diff line change
@@ -45,16 +45,15 @@
* Create test/training samples
*/

#include "opencv2/core.hpp"
#include "utility.hpp"
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <ctime>

using namespace std;

#include "utility.hpp"

int main( int argc, char* argv[] )
{
int i = 0;
@@ -77,8 +76,7 @@ int main( int argc, char* argv[] )
int width = 24;
int height = 24;
double maxscale = -1.0;

srand((unsigned int)time(0));
int rngseed = 12345;

if( argc == 1 )
{
@@ -94,9 +92,10 @@ int main( int argc, char* argv[] )
" [-maxzangle <max_z_rotation_angle = %f>]\n"
" [-show [<scale = %f>]]\n"
" [-w <sample_width = %d>]\n [-h <sample_height = %d>]\n"
" [-maxscale <max sample scale = %f>]\n",
" [-maxscale <max sample scale = %f>]\n"
" [-rngseed <rng seed = %d>]\n",
argv[0], num, bgcolor, bgthreshold, maxintensitydev,
maxxangle, maxyangle, maxzangle, scale, width, height, maxscale );
maxxangle, maxyangle, maxzangle, scale, width, height, maxscale, rngseed );

return 0;
}
@@ -178,8 +177,14 @@ int main( int argc, char* argv[] )
{
maxscale = atof( argv[++i] );
}
else if (!strcmp(argv[i], "-rngseed"))
{
rngseed = atoi(argv[++i]);
}
}

cv::setRNGSeed( rngseed );

printf( "Info file name: %s\n", ((infoname == NULL) ? nullname : infoname ) );
printf( "Img file name: %s\n", ((imagename == NULL) ? nullname : imagename ) );
printf( "Vec file name: %s\n", ((vecname == NULL) ? nullname : vecname ) );
@@ -200,7 +205,8 @@ int main( int argc, char* argv[] )
}
printf( "Width: %d\n", width );
printf( "Height: %d\n", height );
printf( "Max Scale: %g\n", maxscale);
printf( "Max Scale: %g\n", maxscale );
printf( "RNG Seed: %d\n", rngseed );

/* determine action */
if( imagename && vecname )
53 changes: 26 additions & 27 deletions apps/createsamples/utility.cpp
Original file line number Diff line number Diff line change
@@ -374,23 +374,23 @@ static void cvWarpPerspective( Mat src, Mat dst, double quad[4][2] )
i00 = i10 = i01 = i11 = (int) fill_value;

/* linear interpolation using 2x2 neighborhood */
if( isrc_x >= 0 && isrc_x <= src.cols &&
isrc_y >= 0 && isrc_y <= src.rows )
if( isrc_x >= 0 && isrc_x < src.cols &&
isrc_y >= 0 && isrc_y < src.rows )
{
i00 = src.at<uchar>(isrc_y, isrc_x);
}
if( isrc_x >= -1 && isrc_x < src.cols &&
isrc_y >= 0 && isrc_y <= src.rows )
if( isrc_x >= -1 && isrc_x + 1 < src.cols &&
isrc_y >= 0 && isrc_y < src.rows )
{
i10 = src.at<uchar>(isrc_y, isrc_x + 1);
}
if( isrc_x >= 0 && isrc_x <= src.cols &&
isrc_y >= -1 && isrc_y < src.rows )
if( isrc_x >= 0 && isrc_x < src.cols &&
isrc_y >= -1 && isrc_y + 1 < src.rows )
{
i01 = src.at<uchar>(isrc_y + 1, isrc_x);
}
if( isrc_x >= -1 && isrc_x < src.cols &&
isrc_y >= -1 && isrc_y < src.rows )
if( isrc_x >= -1 && isrc_x + 1 < src.cols &&
isrc_y >= -1 && isrc_y + 1 < src.rows )
{
i11 = src.at<uchar>(isrc_y + 1, isrc_x + 1);
}
@@ -458,11 +458,10 @@ void icvRandomQuad( int width, int height, double quad[4][2],
Mat rotMat( 3, 3, CV_64FC1, &rotMatData[0] );
Mat vect( 3, 1, CV_64FC1, &vectData[0] );

rotVectData[0] = maxxangle * (2.0 * rand() / RAND_MAX - 1.0);
rotVectData[1] = ( maxyangle - fabs( rotVectData[0] ) )
* (2.0 * rand() / RAND_MAX - 1.0);
rotVectData[2] = maxzangle * (2.0 * rand() / RAND_MAX - 1.0);
d = (distfactor + distfactor2 * (2.0 * rand() / RAND_MAX - 1.0)) * width;
rotVectData[0] = theRNG().uniform( -maxxangle, maxxangle );
rotVectData[1] = ( maxyangle - fabs( rotVectData[0] ) ) * theRNG().uniform( -1.0, 1.0 );
rotVectData[2] = theRNG().uniform( -maxzangle, maxzangle );
d = ( distfactor + distfactor2 * theRNG().uniform( -1.0, 1.0 ) ) * width;

Rodrigues( rotVect, rotMat );

@@ -662,15 +661,15 @@ void icvPlaceDistortedSample( Mat background,
cr.height = (int) (MAX( quad[2][1], quad[3][1] ) + 0.5F ) - cr.y;
}

xshift = maxshiftf * rand() / RAND_MAX;
yshift = maxshiftf * rand() / RAND_MAX;
xshift = theRNG().uniform( 0., maxshiftf );
yshift = theRNG().uniform( 0., maxshiftf );

cr.x -= (int) ( xshift * cr.width );
cr.y -= (int) ( yshift * cr.height );
cr.width = (int) ((1.0 + maxshiftf) * cr.width );
cr.height = (int) ((1.0 + maxshiftf) * cr.height);

randscale = maxscalef * rand() / RAND_MAX;
randscale = theRNG().uniform( 0., maxscalef );
cr.x -= (int) ( 0.5 * randscale * cr.width );
cr.y -= (int) ( 0.5 * randscale * cr.height );
cr.width = (int) ((1.0 + randscale) * cr.width );
@@ -689,7 +688,7 @@ void icvPlaceDistortedSample( Mat background,
resize( data->img(roi), img, img.size(), 0, 0, INTER_LINEAR_EXACT);
resize( data->maskimg(roi), maskimg, maskimg.size(), 0, 0, INTER_LINEAR_EXACT);

forecolordev = (int) (maxintensitydev * (2.0 * rand() / RAND_MAX - 1.0));
forecolordev = theRNG().uniform( -maxintensitydev, maxintensitydev );

for( r = 0; r < img.rows; r++ )
{
@@ -829,7 +828,7 @@ void icvGetNextFromBackgroundData( CvBackgroundData* data,
{
round = data->round;

data->last = rand() % data->count;
data->last = theRNG().uniform( 0, RAND_MAX ) % data->count;

#ifdef CV_VERBOSE
printf( "Open background image: %s\n", data->filename[data->last] );
@@ -877,7 +876,7 @@ void icvGetNextFromBackgroundData( CvBackgroundData* data,
((float) data->winsize.height + reader->point.y) / ((float) reader->src.rows) );

resize( reader->src, reader->img,
Size((int)(reader->scale * reader->src.rows + 0.5F), (int)(reader->scale * reader->src.cols + 0.5F)), 0, 0, INTER_LINEAR_EXACT );
Size((int)(reader->scale * reader->src.cols + 0.5F), (int)(reader->scale * reader->src.rows + 0.5F)), 0, 0, INTER_LINEAR_EXACT);
}

/*
@@ -932,7 +931,7 @@ void icvGetBackgroundImage( CvBackgroundData* data,
if( reader->scale <= 1.0F )
{
resize(reader->src, reader->img,
Size((int)(reader->scale * reader->src.rows), (int)(reader->scale * reader->src.cols)), 0, 0, INTER_LINEAR_EXACT);
Size((int)(reader->scale * reader->src.cols), (int)(reader->scale * reader->src.rows)), 0, 0, INTER_LINEAR_EXACT);
}
else
{
@@ -1072,7 +1071,7 @@ void cvCreateTrainingSamples( const char* filename,

if( invert == CV_RANDOM_INVERT )
{
inverse = (rand() > (RAND_MAX/2));
inverse = theRNG().uniform( 0, 2 );
}
icvPlaceDistortedSample( sample, inverse, maxintensitydev,
maxxangle, maxyangle, maxzangle,
@@ -1182,16 +1181,16 @@ void cvCreateTestSamples( const char* infoname,

if( maxscale < 1.0F ) continue;

scale = ((float)maxscale - 1.0F) * rand() / RAND_MAX + 1.0F;
scale = theRNG().uniform( 1.0F, (float)maxscale );

width = (int) (scale * winwidth);
height = (int) (scale * winheight);
x = (int) ((0.1+0.8 * rand()/RAND_MAX) * (cvbgreader->src.cols - width));
y = (int) ((0.1+0.8 * rand()/RAND_MAX) * (cvbgreader->src.rows - height));
x = (int) ( theRNG().uniform( 0.1, 0.8 ) * (cvbgreader->src.cols - width));
y = (int) ( theRNG().uniform( 0.1, 0.8 ) * (cvbgreader->src.rows - height));

if( invert == CV_RANDOM_INVERT )
{
inverse = (rand() > (RAND_MAX/2));
inverse = theRNG().uniform( 0, 2 );
}
icvPlaceDistortedSample( cvbgreader->src(Rect(x, y, width, height)), inverse, maxintensitydev,
maxxangle, maxyangle, maxzangle,
@@ -1452,9 +1451,9 @@ void cvShowVecSamples( const char* filename, int winwidth, int winheight,
icvGetTraininDataFromVec( sample, file );
if( scale != 1.0 )
resize( sample, sample,
Size(MAX(1, cvCeil(scale * winheight)), MAX(1, cvCeil(scale * winwidth))), 0, 0, INTER_LINEAR_EXACT);
Size(MAX(1, cvCeil(scale * winwidth)), MAX(1, cvCeil(scale * winheight))), 0, 0, INTER_LINEAR_EXACT);
imshow( "Sample", sample );
if( (waitKey( 0 ) & 0xFF) == 27 ) break;
if( waitKey( 0 ) == 27 ) break;
}
}
fclose( file.input );

0 comments on commit c5ed507

Please sign in to comment.