Commit 0f3fe957 authored by Alexander Alekhin's avatar Alexander Alekhin

Merge pull request #12450 from sturkmen72:update_HOGDescriptor

parents fc4679d4 abbb73e8
...@@ -380,7 +380,7 @@ public: ...@@ -380,7 +380,7 @@ public:
/**@brief Creates the HOG descriptor and detector with default params. /**@brief Creates the HOG descriptor and detector with default params.
aqual to HOGDescriptor(Size(64,128), Size(16,16), Size(8,8), Size(8,8), 9, 1 ) aqual to HOGDescriptor(Size(64,128), Size(16,16), Size(8,8), Size(8,8), 9 )
*/ */
CV_WRAP HOGDescriptor() : winSize(64,128), blockSize(16,16), blockStride(8,8), CV_WRAP HOGDescriptor() : winSize(64,128), blockSize(16,16), blockStride(8,8),
cellSize(8,8), nbins(9), derivAperture(1), winSigma(-1), cellSize(8,8), nbins(9), derivAperture(1), winSigma(-1),
...@@ -414,7 +414,7 @@ public: ...@@ -414,7 +414,7 @@ public:
{} {}
/** @overload /** @overload
@param filename the file name containing HOGDescriptor properties and coefficients of the trained classifier @param filename The file name containing HOGDescriptor properties and coefficients for the linear SVM classifier.
*/ */
CV_WRAP HOGDescriptor(const String& filename) CV_WRAP HOGDescriptor(const String& filename)
{ {
...@@ -448,28 +448,28 @@ public: ...@@ -448,28 +448,28 @@ public:
/**@example samples/cpp/peopledetect.cpp /**@example samples/cpp/peopledetect.cpp
*/ */
/**@brief Sets coefficients for the linear SVM classifier. /**@brief Sets coefficients for the linear SVM classifier.
@param _svmdetector coefficients for the linear SVM classifier. @param svmdetector coefficients for the linear SVM classifier.
*/ */
CV_WRAP virtual void setSVMDetector(InputArray _svmdetector); CV_WRAP virtual void setSVMDetector(InputArray svmdetector);
/** @brief Reads HOGDescriptor parameters from a file node. /** @brief Reads HOGDescriptor parameters from a cv::FileNode.
@param fn File node @param fn File node
*/ */
virtual bool read(FileNode& fn); virtual bool read(FileNode& fn);
/** @brief Stores HOGDescriptor parameters in a file storage. /** @brief Stores HOGDescriptor parameters in a cv::FileStorage.
@param fs File storage @param fs File storage
@param objname Object name @param objname Object name
*/ */
virtual void write(FileStorage& fs, const String& objname) const; virtual void write(FileStorage& fs, const String& objname) const;
/** @brief loads coefficients for the linear SVM classifier from a file /** @brief loads HOGDescriptor parameters and coefficients for the linear SVM classifier from a file.
@param filename Name of the file to read. @param filename Path of the file to read.
@param objname The optional name of the node to read (if empty, the first top-level node will be used). @param objname The optional name of the node to read (if empty, the first top-level node will be used).
*/ */
CV_WRAP virtual bool load(const String& filename, const String& objname = String()); CV_WRAP virtual bool load(const String& filename, const String& objname = String());
/** @brief saves coefficients for the linear SVM classifier to a file /** @brief saves HOGDescriptor parameters and coefficients for the linear SVM classifier to a file
@param filename File name @param filename File name
@param objname Object name @param objname Object name
*/ */
...@@ -505,7 +505,7 @@ public: ...@@ -505,7 +505,7 @@ public:
@param padding Padding @param padding Padding
@param searchLocations Vector of Point includes set of requested locations to be evaluated. @param searchLocations Vector of Point includes set of requested locations to be evaluated.
*/ */
CV_WRAP virtual void detect(const Mat& img, CV_OUT std::vector<Point>& foundLocations, CV_WRAP virtual void detect(InputArray img, CV_OUT std::vector<Point>& foundLocations,
CV_OUT std::vector<double>& weights, CV_OUT std::vector<double>& weights,
double hitThreshold = 0, Size winStride = Size(), double hitThreshold = 0, Size winStride = Size(),
Size padding = Size(), Size padding = Size(),
...@@ -521,7 +521,7 @@ public: ...@@ -521,7 +521,7 @@ public:
@param padding Padding @param padding Padding
@param searchLocations Vector of Point includes locations to search. @param searchLocations Vector of Point includes locations to search.
*/ */
virtual void detect(const Mat& img, CV_OUT std::vector<Point>& foundLocations, virtual void detect(InputArray img, CV_OUT std::vector<Point>& foundLocations,
double hitThreshold = 0, Size winStride = Size(), double hitThreshold = 0, Size winStride = Size(),
Size padding = Size(), Size padding = Size(),
const std::vector<Point>& searchLocations=std::vector<Point>()) const; const std::vector<Point>& searchLocations=std::vector<Point>()) const;
...@@ -570,7 +570,7 @@ public: ...@@ -570,7 +570,7 @@ public:
@param paddingTL Padding from top-left @param paddingTL Padding from top-left
@param paddingBR Padding from bottom-right @param paddingBR Padding from bottom-right
*/ */
CV_WRAP virtual void computeGradient(const Mat& img, CV_OUT Mat& grad, CV_OUT Mat& angleOfs, CV_WRAP virtual void computeGradient(InputArray img, InputOutputArray grad, InputOutputArray angleOfs,
Size paddingTL = Size(), Size paddingBR = Size()) const; Size paddingTL = Size(), Size paddingBR = Size()) const;
/** @brief Returns coefficients of the classifier trained for people detection (for 64x128 windows). /** @brief Returns coefficients of the classifier trained for people detection (for 64x128 windows).
...@@ -639,7 +639,7 @@ public: ...@@ -639,7 +639,7 @@ public:
@param winStride winStride @param winStride winStride
@param padding padding @param padding padding
*/ */
virtual void detectROI(const cv::Mat& img, const std::vector<cv::Point> &locations, virtual void detectROI(InputArray img, const std::vector<cv::Point> &locations,
CV_OUT std::vector<cv::Point>& foundLocations, CV_OUT std::vector<double>& confidences, CV_OUT std::vector<cv::Point>& foundLocations, CV_OUT std::vector<double>& confidences,
double hitThreshold = 0, cv::Size winStride = Size(), double hitThreshold = 0, cv::Size winStride = Size(),
cv::Size padding = Size()) const; cv::Size padding = Size()) const;
...@@ -652,17 +652,12 @@ public: ...@@ -652,17 +652,12 @@ public:
in the detector coefficients (as the last free coefficient). But if the free coefficient is omitted (which is allowed), you can specify it manually here. in the detector coefficients (as the last free coefficient). But if the free coefficient is omitted (which is allowed), you can specify it manually here.
@param groupThreshold Minimum possible number of rectangles minus 1. The threshold is used in a group of rectangles to retain it. @param groupThreshold Minimum possible number of rectangles minus 1. The threshold is used in a group of rectangles to retain it.
*/ */
virtual void detectMultiScaleROI(const cv::Mat& img, virtual void detectMultiScaleROI(InputArray img,
CV_OUT std::vector<cv::Rect>& foundLocations, CV_OUT std::vector<cv::Rect>& foundLocations,
std::vector<DetectionROI>& locations, std::vector<DetectionROI>& locations,
double hitThreshold = 0, double hitThreshold = 0,
int groupThreshold = 0) const; int groupThreshold = 0) const;
/** @brief read/parse Dalal's alt model file
@param modelfile Path of Dalal's alt model file.
*/
void readALTModel(String modelfile);
/** @brief Groups the object candidate rectangles. /** @brief Groups the object candidate rectangles.
@param rectList Input/output vector of rectangles. Output vector includes retained and grouped rectangles. (The Python list is not modified in place.) @param rectList Input/output vector of rectangles. Output vector includes retained and grouped rectangles. (The Python list is not modified in place.)
@param weights Input/output vector of weights of rectangles. Output vector includes weights of retained and grouped rectangles. (The Python list is not modified in place.) @param weights Input/output vector of weights of rectangles. Output vector includes weights of retained and grouped rectangles. (The Python list is not modified in place.)
...@@ -688,7 +683,7 @@ protected: ...@@ -688,7 +683,7 @@ protected:
}; };
/** @brief Detect QR code in image and return minimum area of quadrangle that describes QR code. /** @brief Detect QR code in image and return minimum area of quadrangle that describes QR code.
@param in Matrix of the type CV_8UC1 containing an image where QR code are detected. @param in Matrix of the type CV_8U containing an image where QR code are detected.
@param points Output vector of vertices of a quadrangle of minimal area that describes QR code. @param points Output vector of vertices of a quadrangle of minimal area that describes QR code.
@param eps_x Epsilon neighborhood, which allows you to determine the horizontal pattern of the scheme 1:1:3:1:1 according to QR code standard. @param eps_x Epsilon neighborhood, which allows you to determine the horizontal pattern of the scheme 1:1:3:1:1 according to QR code standard.
@param eps_y Epsilon neighborhood, which allows you to determine the vertical pattern of the scheme 1:1:3:1:1 according to QR code standard. @param eps_y Epsilon neighborhood, which allows you to determine the vertical pattern of the scheme 1:1:3:1:1 according to QR code standard.
......
...@@ -234,17 +234,20 @@ inline float32x4_t vsetq_f32(float f0, float f1, float f2, float f3) ...@@ -234,17 +234,20 @@ inline float32x4_t vsetq_f32(float f0, float f1, float f2, float f3)
return a; return a;
} }
#endif #endif
void HOGDescriptor::computeGradient(const Mat& img, Mat& grad, Mat& qangle, void HOGDescriptor::computeGradient(InputArray _img, InputOutputArray _grad, InputOutputArray _qangle,
Size paddingTL, Size paddingBR) const Size paddingTL, Size paddingBR) const
{ {
CV_INSTRUMENT_REGION(); CV_INSTRUMENT_REGION();
Mat img = _img.getMat();
CV_Assert( img.type() == CV_8U || img.type() == CV_8UC3 ); CV_Assert( img.type() == CV_8U || img.type() == CV_8UC3 );
Size gradsize(img.cols + paddingTL.width + paddingBR.width, Size gradsize(img.cols + paddingTL.width + paddingBR.width,
img.rows + paddingTL.height + paddingBR.height); img.rows + paddingTL.height + paddingBR.height);
grad.create(gradsize, CV_32FC2); // <magnitude*(1-alpha), magnitude*alpha> _grad.create(gradsize, CV_32FC2); // <magnitude*(1-alpha), magnitude*alpha>
qangle.create(gradsize, CV_8UC2); // [0..nbins-1] - quantized gradient orientation _qangle.create(gradsize, CV_8UC2); // [0..nbins-1] - quantized gradient orientation
Mat grad = _grad.getMat();
Mat qangle = _qangle.getMat();
Size wholeSize; Size wholeSize;
Point roiofs; Point roiofs;
...@@ -1650,12 +1653,13 @@ void HOGDescriptor::compute(InputArray _img, std::vector<float>& descriptors, ...@@ -1650,12 +1653,13 @@ void HOGDescriptor::compute(InputArray _img, std::vector<float>& descriptors,
} }
} }
void HOGDescriptor::detect(const Mat& img, void HOGDescriptor::detect(InputArray _img,
std::vector<Point>& hits, std::vector<double>& weights, double hitThreshold, std::vector<Point>& hits, std::vector<double>& weights, double hitThreshold,
Size winStride, Size padding, const std::vector<Point>& locations) const Size winStride, Size padding, const std::vector<Point>& locations) const
{ {
CV_INSTRUMENT_REGION(); CV_INSTRUMENT_REGION();
Mat img = _img.getMat();
hits.clear(); hits.clear();
weights.clear(); weights.clear();
if( svmDetector.empty() ) if( svmDetector.empty() )
...@@ -1764,7 +1768,7 @@ void HOGDescriptor::detect(const Mat& img, ...@@ -1764,7 +1768,7 @@ void HOGDescriptor::detect(const Mat& img,
} }
} }
void HOGDescriptor::detect(const Mat& img, std::vector<Point>& hits, double hitThreshold, void HOGDescriptor::detect(InputArray img, std::vector<Point>& hits, double hitThreshold,
Size winStride, Size padding, const std::vector<Point>& locations) const Size winStride, Size padding, const std::vector<Point>& locations) const
{ {
CV_INSTRUMENT_REGION(); CV_INSTRUMENT_REGION();
...@@ -3544,12 +3548,13 @@ public: ...@@ -3544,12 +3548,13 @@ public:
Mutex* mtx; Mutex* mtx;
}; };
void HOGDescriptor::detectROI(const cv::Mat& img, const std::vector<cv::Point> &locations, void HOGDescriptor::detectROI(InputArray _img, const std::vector<cv::Point> &locations,
CV_OUT std::vector<cv::Point>& foundLocations, CV_OUT std::vector<double>& confidences, CV_OUT std::vector<cv::Point>& foundLocations, CV_OUT std::vector<double>& confidences,
double hitThreshold, cv::Size winStride, cv::Size padding) const double hitThreshold, cv::Size winStride, cv::Size padding) const
{ {
CV_INSTRUMENT_REGION(); CV_INSTRUMENT_REGION();
Mat img = _img.getMat();
foundLocations.clear(); foundLocations.clear();
confidences.clear(); confidences.clear();
...@@ -3656,12 +3661,13 @@ void HOGDescriptor::detectROI(const cv::Mat& img, const std::vector<cv::Point> & ...@@ -3656,12 +3661,13 @@ void HOGDescriptor::detectROI(const cv::Mat& img, const std::vector<cv::Point> &
} }
} }
void HOGDescriptor::detectMultiScaleROI(const cv::Mat& img, void HOGDescriptor::detectMultiScaleROI(InputArray _img,
CV_OUT std::vector<cv::Rect>& foundLocations, std::vector<DetectionROI>& locations, CV_OUT std::vector<cv::Rect>& foundLocations, std::vector<DetectionROI>& locations,
double hitThreshold, int groupThreshold) const double hitThreshold, int groupThreshold) const
{ {
CV_INSTRUMENT_REGION(); CV_INSTRUMENT_REGION();
Mat img = _img.getMat();
std::vector<Rect> allCandidates; std::vector<Rect> allCandidates;
Mutex mtx; Mutex mtx;
...@@ -3674,110 +3680,6 @@ void HOGDescriptor::detectMultiScaleROI(const cv::Mat& img, ...@@ -3674,110 +3680,6 @@ void HOGDescriptor::detectMultiScaleROI(const cv::Mat& img,
cv::groupRectangles(foundLocations, groupThreshold, 0.2); cv::groupRectangles(foundLocations, groupThreshold, 0.2);
} }
void HOGDescriptor::readALTModel(String modelfile)
{
// read model from SVMlight format..
FILE *modelfl;
if ((modelfl = fopen(modelfile.c_str(), "rb")) == NULL)
{
String eerr("file not exist");
String efile(__FILE__);
String efunc(__FUNCTION__);
CV_THROW (Exception(Error::StsError, eerr, efile, efunc, __LINE__));
}
char version_buffer[10];
if (!fread (&version_buffer,sizeof(char),10,modelfl))
{
String eerr("version?");
String efile(__FILE__);
String efunc(__FUNCTION__);
fclose(modelfl);
CV_THROW (Exception(Error::StsError, eerr, efile, efunc, __LINE__));
}
if(strcmp(version_buffer,"V6.01")) {
String eerr("version does not match");
String efile(__FILE__);
String efunc(__FUNCTION__);
fclose(modelfl);
CV_THROW (Exception(Error::StsError, eerr, efile, efunc, __LINE__));
}
/* read version number */
int version = 0;
if (!fread (&version,sizeof(int),1,modelfl))
{
fclose(modelfl);
CV_THROW (Exception());
}
if (version < 200)
{
String eerr("version does not match");
String efile(__FILE__);
String efunc(__FUNCTION__);
fclose(modelfl);
CV_THROW (Exception());
}
int kernel_type;
size_t nread;
nread=fread(&(kernel_type),sizeof(int),1,modelfl);
{// ignore these
int poly_degree;
nread=fread(&(poly_degree),sizeof(int),1,modelfl);
double rbf_gamma;
nread=fread(&(rbf_gamma),sizeof(double), 1, modelfl);
double coef_lin;
nread=fread(&(coef_lin),sizeof(double),1,modelfl);
double coef_const;
nread=fread(&(coef_const),sizeof(double),1,modelfl);
int l;
nread=fread(&l,sizeof(int),1,modelfl);
CV_Assert(l >= 0 && l < 0xFFFF);
char* custom = new char[l];
nread=fread(custom,sizeof(char),l,modelfl);
delete[] custom;
}
int totwords;
nread=fread(&(totwords),sizeof(int),1,modelfl);
{// ignore these
int totdoc;
nread=fread(&(totdoc),sizeof(int),1,modelfl);
int sv_num;
nread=fread(&(sv_num), sizeof(int),1,modelfl);
}
double linearbias;
nread=fread(&linearbias, sizeof(double), 1, modelfl);
std::vector<float> detector;
detector.clear();
if(kernel_type == 0) { /* linear kernel */
/* save linear wts also */
CV_Assert(totwords + 1 > 0 && totwords < 0xFFFF);
double *linearwt = new double[totwords+1];
int length = totwords;
nread = fread(linearwt, sizeof(double), totwords + 1, modelfl);
if(nread != static_cast<size_t>(length) + 1) {
delete [] linearwt;
fclose(modelfl);
CV_THROW (Exception());
}
for(int i = 0; i < length; i++)
detector.push_back((float)linearwt[i]);
detector.push_back((float)-linearbias);
setSVMDetector(detector);
delete [] linearwt;
} else {
fclose(modelfl);
CV_THROW (Exception());
}
fclose(modelfl);
}
void HOGDescriptor::groupRectangles(std::vector<cv::Rect>& rectList, std::vector<double>& weights, int groupThreshold, double eps) const void HOGDescriptor::groupRectangles(std::vector<cv::Rect>& rectList, std::vector<double>& weights, int groupThreshold, double eps) const
{ {
CV_INSTRUMENT_REGION(); CV_INSTRUMENT_REGION();
......
...@@ -553,15 +553,15 @@ public: ...@@ -553,15 +553,15 @@ public:
ts(cvtest::TS::ptr()), failed(false) ts(cvtest::TS::ptr()), failed(false)
{ } { }
virtual void computeGradient(const Mat& img, Mat& grad, Mat& qangle, virtual void computeGradient(InputArray img, InputOutputArray grad, InputOutputArray qangle,
Size paddingTL, Size paddingBR) const; Size paddingTL, Size paddingBR) const;
virtual void detect(const Mat& img, virtual void detect(InputArray img,
vector<Point>& hits, vector<double>& weights, double hitThreshold = 0.0, vector<Point>& hits, vector<double>& weights, double hitThreshold = 0.0,
Size winStride = Size(), Size padding = Size(), Size winStride = Size(), Size padding = Size(),
const vector<Point>& locations = vector<Point>()) const; const vector<Point>& locations = vector<Point>()) const;
virtual void detect(const Mat& img, vector<Point>& hits, double hitThreshold = 0.0, virtual void detect(InputArray img, vector<Point>& hits, double hitThreshold = 0.0,
Size winStride = Size(), Size padding = Size(), Size winStride = Size(), Size padding = Size(),
const vector<Point>& locations = vector<Point>()) const; const vector<Point>& locations = vector<Point>()) const;
...@@ -985,7 +985,7 @@ inline bool HOGDescriptorTester::is_failed() const ...@@ -985,7 +985,7 @@ inline bool HOGDescriptorTester::is_failed() const
static inline int gcd(int a, int b) { return (a % b == 0) ? b : gcd (b, a % b); } static inline int gcd(int a, int b) { return (a % b == 0) ? b : gcd (b, a % b); }
void HOGDescriptorTester::detect(const Mat& img, void HOGDescriptorTester::detect(InputArray _img,
vector<Point>& hits, vector<double>& weights, double hitThreshold, vector<Point>& hits, vector<double>& weights, double hitThreshold,
Size winStride, Size padding, const vector<Point>& locations) const Size winStride, Size padding, const vector<Point>& locations) const
{ {
...@@ -996,6 +996,7 @@ void HOGDescriptorTester::detect(const Mat& img, ...@@ -996,6 +996,7 @@ void HOGDescriptorTester::detect(const Mat& img,
if( svmDetector.empty() ) if( svmDetector.empty() )
return; return;
Mat img = _img.getMat();
if( winStride == Size() ) if( winStride == Size() )
winStride = cellSize; winStride = cellSize;
Size cacheStride(gcd(winStride.width, blockStride.width), Size cacheStride(gcd(winStride.width, blockStride.width),
...@@ -1085,7 +1086,7 @@ void HOGDescriptorTester::detect(const Mat& img, ...@@ -1085,7 +1086,7 @@ void HOGDescriptorTester::detect(const Mat& img,
} }
} }
void HOGDescriptorTester::detect(const Mat& img, vector<Point>& hits, double hitThreshold, void HOGDescriptorTester::detect(InputArray img, vector<Point>& hits, double hitThreshold,
Size winStride, Size padding, const vector<Point>& locations) const Size winStride, Size padding, const vector<Point>& locations) const
{ {
vector<double> weightsV; vector<double> weightsV;
...@@ -1166,15 +1167,19 @@ void HOGDescriptorTester::compute(InputArray _img, vector<float>& descriptors, ...@@ -1166,15 +1167,19 @@ void HOGDescriptorTester::compute(InputArray _img, vector<float>& descriptors,
} }
} }
void HOGDescriptorTester::computeGradient(const Mat& img, Mat& grad, Mat& qangle, void HOGDescriptorTester::computeGradient(InputArray _img, InputOutputArray _grad, InputOutputArray _qangle,
Size paddingTL, Size paddingBR) const Size paddingTL, Size paddingBR) const
{ {
Mat img = _img.getMat();
CV_Assert( img.type() == CV_8U || img.type() == CV_8UC3 ); CV_Assert( img.type() == CV_8U || img.type() == CV_8UC3 );
Size gradsize(img.cols + paddingTL.width + paddingBR.width, Size gradsize(img.cols + paddingTL.width + paddingBR.width,
img.rows + paddingTL.height + paddingBR.height); img.rows + paddingTL.height + paddingBR.height);
grad.create(gradsize, CV_32FC2); // <magnitude*(1-alpha), magnitude*alpha> _grad.create(gradsize, CV_32FC2); // <magnitude*(1-alpha), magnitude*alpha>
qangle.create(gradsize, CV_8UC2); // [0..nbins-1] - quantized gradient orientation _qangle.create(gradsize, CV_8UC2); // [0..nbins-1] - quantized gradient orientation
Mat grad = _grad.getMat();
Mat qangle = _qangle.getMat();
Size wholeSize; Size wholeSize;
Point roiofs; Point roiofs;
img.locateROI(wholeSize, roiofs); img.locateROI(wholeSize, roiofs);
......
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