removed DOT implementation
This commit is contained in:
@@ -576,120 +576,6 @@ protected:
|
|||||||
FernClassifier fernClassifier;
|
FernClassifier fernClassifier;
|
||||||
};
|
};
|
||||||
|
|
||||||
/****************************************************************************************\
|
|
||||||
* Dominant Orientation Templates *
|
|
||||||
\****************************************************************************************/
|
|
||||||
|
|
||||||
class CV_EXPORTS DOTDetector
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
struct CV_EXPORTS TrainParams
|
|
||||||
{
|
|
||||||
enum { BIN_COUNT = 7 };
|
|
||||||
static double BIN_RANGE() { return 180.0 / BIN_COUNT; }
|
|
||||||
|
|
||||||
TrainParams();
|
|
||||||
TrainParams( const Size& winSize, int regionSize=7, int minMagnitude=60,
|
|
||||||
int maxStrongestCount=7, int maxNonzeroBits=6,
|
|
||||||
float minRatio=0.85f );
|
|
||||||
|
|
||||||
void read( FileNode& fn );
|
|
||||||
void write( FileStorage& fs ) const;
|
|
||||||
|
|
||||||
void isConsistent() const;
|
|
||||||
|
|
||||||
Size winSize;
|
|
||||||
int regionSize;
|
|
||||||
|
|
||||||
int minMagnitude;
|
|
||||||
int maxStrongestCount;
|
|
||||||
int maxNonzeroBits;
|
|
||||||
|
|
||||||
float minRatio;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CV_EXPORTS DetectParams
|
|
||||||
{
|
|
||||||
DetectParams();
|
|
||||||
DetectParams( float minRatio, int minRegionSize, int maxRegionSize, int regionSizeStep,
|
|
||||||
bool isGroup, int groupThreshold=3, double groupEps=0.2f );
|
|
||||||
|
|
||||||
void isConsistent( float minTrainRatio=1.f ) const;
|
|
||||||
|
|
||||||
float minRatio;
|
|
||||||
|
|
||||||
int minRegionSize;
|
|
||||||
int maxRegionSize;
|
|
||||||
int regionSizeStep;
|
|
||||||
|
|
||||||
bool isGroup;
|
|
||||||
int groupThreshold;
|
|
||||||
double groupEps;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CV_EXPORTS DOTTemplate
|
|
||||||
{
|
|
||||||
struct CV_EXPORTS TrainData
|
|
||||||
{
|
|
||||||
TrainData();
|
|
||||||
TrainData( const Mat& maskedImage, const cv::Mat& strongestGradientsMask );
|
|
||||||
|
|
||||||
cv::Mat maskedImage;
|
|
||||||
cv::Mat strongestGradientsMask;
|
|
||||||
};
|
|
||||||
|
|
||||||
DOTTemplate();
|
|
||||||
DOTTemplate( const cv::Mat& quantizedImage, int objectClassID,
|
|
||||||
const cv::Mat& maskedImage=cv::Mat(), const cv::Mat& strongestGradientsMask=cv::Mat() );
|
|
||||||
|
|
||||||
void addObjectClassID( int objectClassID, const cv::Mat& maskedImage=cv::Mat(), const cv::Mat& strongestGradientsMask=cv::Mat() );
|
|
||||||
const TrainData* getTrainData( int objectClassID ) const;
|
|
||||||
|
|
||||||
static float computeTexturelessRatio( const cv::Mat& quantizedImage );
|
|
||||||
|
|
||||||
void read( FileNode& fn );
|
|
||||||
void write( FileStorage& fs ) const;
|
|
||||||
|
|
||||||
cv::Mat quantizedImage;
|
|
||||||
float texturelessRatio;
|
|
||||||
int area;
|
|
||||||
|
|
||||||
std::vector<int> objectClassIDs;
|
|
||||||
std::vector<TrainData> trainData;
|
|
||||||
};
|
|
||||||
|
|
||||||
DOTDetector();
|
|
||||||
DOTDetector( const std::string& filename ); // load from xml-file
|
|
||||||
|
|
||||||
virtual ~DOTDetector();
|
|
||||||
void clear();
|
|
||||||
|
|
||||||
void read( FileNode& fn );
|
|
||||||
void write( FileStorage& fs ) const;
|
|
||||||
|
|
||||||
void load( const std::string& filename );
|
|
||||||
void save( const std::string& filename ) const;
|
|
||||||
|
|
||||||
void train( const string& baseDirName, const TrainParams& trainParams=TrainParams(), bool isAddImageAndGradientMask=false );
|
|
||||||
void detectMultiScale( const Mat& image, vector<vector<Rect> >& rects, const DetectParams& detectParams=DetectParams(),
|
|
||||||
vector<vector<float> >* ratios=0, vector<vector<int> >* dotTemplateIndices=0 ) const;
|
|
||||||
|
|
||||||
const vector<DOTTemplate>& getDOTTemplates() const;
|
|
||||||
const vector<string>& getObjectClassNames() const;
|
|
||||||
|
|
||||||
static void groupRectanglesList( std::vector<std::vector<cv::Rect> >& rectList, int groupThreshold, double eps );
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void detectQuantized( const Mat& queryQuantizedImage, float minRatio,
|
|
||||||
vector<vector<Rect> >& rects,
|
|
||||||
vector<vector<float> >* ratios,
|
|
||||||
vector<vector<int> >* dotTemplateIndices ) const;
|
|
||||||
|
|
||||||
TrainParams trainParams;
|
|
||||||
|
|
||||||
std::vector<std::string> objectClassNames;
|
|
||||||
std::vector<DOTTemplate> dotTemplates;
|
|
||||||
};
|
|
||||||
struct CV_EXPORTS DataMatrixCode {
|
struct CV_EXPORTS DataMatrixCode {
|
||||||
char msg[4]; //TODO std::string
|
char msg[4]; //TODO std::string
|
||||||
Mat original;
|
Mat original;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,157 +0,0 @@
|
|||||||
#include "opencv2/imgproc/imgproc.hpp"
|
|
||||||
#include "opencv2/highgui/highgui.hpp"
|
|
||||||
#include "opencv2/objdetect/objdetect.hpp"
|
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
using namespace cv;
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
#define SHOW_ALL_RECTS_BY_ONE 0
|
|
||||||
|
|
||||||
static void fillColors( vector<Scalar>& colors )
|
|
||||||
{
|
|
||||||
cv::RNG rng = theRNG();
|
|
||||||
|
|
||||||
for( size_t ci = 0; ci < colors.size(); ci++ )
|
|
||||||
colors[ci] = Scalar( rng(256), rng(256), rng(256) );
|
|
||||||
}
|
|
||||||
|
|
||||||
static void readTestImageNames( const string& descrFilename, vector<string>& names )
|
|
||||||
{
|
|
||||||
names.clear();
|
|
||||||
|
|
||||||
ifstream file( descrFilename.c_str() );
|
|
||||||
if ( !file.is_open() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
while( !file.eof() )
|
|
||||||
{
|
|
||||||
string str; getline( file, str );
|
|
||||||
if( str.empty() ) break;
|
|
||||||
if( str[0] == '#' ) continue; // comment
|
|
||||||
names.push_back(str);
|
|
||||||
}
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
// find -name "image_*.png" | grep -v mask | sed 's/.\///' >> images.txt
|
|
||||||
|
|
||||||
int main( int argc, char **argv )
|
|
||||||
{
|
|
||||||
if( argc != 1 && argc != 3 )
|
|
||||||
{
|
|
||||||
cout << "Format: train_data test_data; " << endl << "or without arguments to use default data" << endl;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
string baseDirName, testDirName;
|
|
||||||
if( argc == 1 )
|
|
||||||
{
|
|
||||||
baseDirName = "../../opencv/samples/cpp/dot_data/train/";
|
|
||||||
testDirName = "../../opencv/samples/cpp/dot_data/test/";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
baseDirName = argv[1];
|
|
||||||
testDirName = argv[2];
|
|
||||||
baseDirName += (*(baseDirName.end()-1) == '/' ? "" : "/");
|
|
||||||
testDirName += (*(testDirName.end()-1) == '/' ? "" : "/");
|
|
||||||
}
|
|
||||||
|
|
||||||
DOTDetector::TrainParams trainParams;
|
|
||||||
trainParams.winSize = Size(84, 84);
|
|
||||||
trainParams.regionSize = 7;
|
|
||||||
trainParams.minMagnitude = 60; // we ignore pixels with magnitude less then minMagnitude
|
|
||||||
trainParams.maxStrongestCount = 7; // we find such count of strongest gradients for each region
|
|
||||||
trainParams.maxNonzeroBits = 6; // we filter very textured regions (that have more then maxUnzeroBits count of 1s (ones) in the template)
|
|
||||||
trainParams.minRatio = 0.85f;
|
|
||||||
|
|
||||||
// 1. Train detector
|
|
||||||
DOTDetector dotDetector;
|
|
||||||
dotDetector.train( baseDirName, trainParams, true );
|
|
||||||
|
|
||||||
// dotDetector.save( "../../dot.xml.gz" );
|
|
||||||
// dotDetector.load( "../../dot.xml.gz" );
|
|
||||||
|
|
||||||
const vector<string>& objectClassNames = dotDetector.getObjectClassNames();
|
|
||||||
const vector<DOTDetector::DOTTemplate>& dotTemplates = dotDetector.getDOTTemplates();
|
|
||||||
|
|
||||||
vector<Scalar> colors( objectClassNames.size() );
|
|
||||||
fillColors( colors );
|
|
||||||
cout << "Templates count " << dotTemplates.size() << endl;
|
|
||||||
|
|
||||||
vector<string> testFilenames;
|
|
||||||
readTestImageNames( testDirName + "images.txt", testFilenames );
|
|
||||||
if( testFilenames.empty() )
|
|
||||||
{
|
|
||||||
cout << "Can not read no one test images" << endl;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. Detect objects
|
|
||||||
DOTDetector::DetectParams detectParams;
|
|
||||||
detectParams.minRatio = 0.8f;
|
|
||||||
detectParams.minRegionSize = 5;
|
|
||||||
detectParams.maxRegionSize = 11;
|
|
||||||
|
|
||||||
#if SHOW_ALL_RECTS_BY_ONE
|
|
||||||
detectParams.isGroup = false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for( size_t imgIdx = 0; imgIdx < testFilenames.size(); imgIdx++ )
|
|
||||||
{
|
|
||||||
string curFilename = testDirName + testFilenames[imgIdx];
|
|
||||||
cout << curFilename << endl;
|
|
||||||
Mat queryImage = imread( curFilename, 0 );
|
|
||||||
|
|
||||||
if( queryImage.empty() )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
cout << "Detection start ..." << endl;
|
|
||||||
|
|
||||||
vector<vector<Rect> > rects;
|
|
||||||
#if SHOW_ALL_RECTS_BY_ONE
|
|
||||||
vector<vector<float> > ratios;
|
|
||||||
vector<vector<int> > dotTemlateIndices;
|
|
||||||
dotDetector.detectMultiScale( queryImage, rects, detectParams, &ratios, &dotTemlateIndices );
|
|
||||||
|
|
||||||
const vector<DOTDetector::DOTTemplate>& dotTemplates = dotDetector.getDOTTemplates();
|
|
||||||
#else
|
|
||||||
dotDetector.detectMultiScale( queryImage, rects, detectParams );
|
|
||||||
#endif
|
|
||||||
cout << "end" << endl;
|
|
||||||
|
|
||||||
Mat draw;
|
|
||||||
cvtColor( queryImage, draw, CV_GRAY2BGR );
|
|
||||||
|
|
||||||
const int textStep = 25;
|
|
||||||
for( size_t ci = 0; ci < objectClassNames.size(); ci++ )
|
|
||||||
{
|
|
||||||
putText( draw, objectClassNames[ci], Point(textStep, textStep*(1+ci)), 1, 2, colors[ci], 3 );
|
|
||||||
for( size_t ri = 0; ri < rects[ci].size(); ri++ )
|
|
||||||
{
|
|
||||||
rectangle( draw, rects[ci][ri], colors[ci], 3 );
|
|
||||||
|
|
||||||
#if SHOW_ALL_RECTS_BY_ONE
|
|
||||||
int dotTemplateIndex = dotTemlateIndices[ci][ri];
|
|
||||||
const DOTDetector::DOTTemplate::TrainData* trainData = dotTemplates[dotTemplateIndex].getTrainData(ci);
|
|
||||||
|
|
||||||
imshow( "maskedImage", trainData->maskedImage );
|
|
||||||
imshow( "strongestGradientsMask", trainData->strongestGradientsMask );
|
|
||||||
|
|
||||||
Mat scaledDraw;
|
|
||||||
cv::resize( draw, scaledDraw, Size(640, 480) );
|
|
||||||
imshow( "detection result", scaledDraw );
|
|
||||||
|
|
||||||
cv::waitKey();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Mat scaledDraw;
|
|
||||||
cv::resize( draw, scaledDraw, Size(640, 480) );
|
|
||||||
imshow( "detection result", scaledDraw );
|
|
||||||
|
|
||||||
cv::waitKey();
|
|
||||||
}
|
|
||||||
}
|
|
Reference in New Issue
Block a user