43 #include <visp/vpConfig.h>
45 #if (VISP_HAVE_OPENCV_VERSION >= 0x020000) && (VISP_HAVE_OPENCV_VERSION < 0x030000) // Require opencv >= 2.0.0 and < 3.0.0
47 #include <visp/vpFernClassifier.h>
48 #include <visp/vpImageTools.h>
49 #include <visp/vpImageConvert.h>
50 #include <visp/vpColor.h>
51 #include <visp/vpDisplay.h>
59 ldetector(), fernClassifier(), gen(0, 256, 5, true, 0.6, 1.5, -CV_PI/2, CV_PI/2, -CV_PI/2, CV_PI/2),
60 hasLearn(false), threshold(20), nbView(2000), dist(2), nbClassfier(100), ClassifierSize(11),
61 nbOctave(2), patchSize(32), radius(7), nbPoints(200), blurImage(true), radiusBlur(7),
62 sigmaBlur(1), nbMinPoint(10),
63 #if (VISP_HAVE_OPENCV_VERSION >= 0x020408)
68 objKeypoints(), modelROI_Ref(), modelROI(),
69 modelPoints(), imgKeypoints(), refPt(), curPt()
85 ldetector(), fernClassifier(), gen(0, 256, 5, true, 0.6, 1.5, -CV_PI/2, CV_PI/2, -CV_PI/2, CV_PI/2),
86 hasLearn(false), threshold(20), nbView(2000), dist(2), nbClassfier(100), ClassifierSize(11),
87 nbOctave(2), patchSize(32), radius(7), nbPoints(200), blurImage(true), radiusBlur(7),
88 sigmaBlur(1), nbMinPoint(10),
89 #if (VISP_HAVE_OPENCV_VERSION >= 0x020408)
94 objKeypoints(), modelROI_Ref(), modelROI(),
95 modelPoints(), imgKeypoints(), refPt(), curPt()
97 this->
load(_dataFile, _objectName);
106 #if (VISP_HAVE_OPENCV_VERSION < 0x020408)
108 if(
curImg->width % 8 == 0){
110 cvReleaseImageHeader(&
curImg);
131 #if (VISP_HAVE_OPENCV_VERSION < 0x020408)
159 cv::Mat obj = (cv::Mat)
curImg;
166 std::vector<cv::Mat> objpyr;
167 cv::buildPyramid(obj, objpyr, d.nOctaves-1);
175 modelROI = cv::Rect(0, 0, objpyr[0].cols, objpyr[0].rows);
180 cv::FernClassifier::COMPRESSION_NONE,
gen);
184 for (
unsigned int i = 0; i <
modelPoints.size(); i += 1){
240 const unsigned int _height,
const unsigned int _width)
244 vpTRACE(
"Bad size for the subimage");
246 "Bad size for the subimage"));
251 (
unsigned int)_iP.
get_i(),
252 (
unsigned int)_iP.
get_j(),
253 _height, _width, subImage);
293 (
unsigned int)_rectangle.
getWidth()));
318 cv::Mat img = this->
curImg;
324 std::vector<cv::Mat> imgPyr;
325 cv::buildPyramid(img, imgPyr,
ldetector.nOctaves-1);
332 std::vector<int> bestMatches(m, -1);
333 std::vector<float> maxLogProb(m, -FLT_MAX);
334 std::vector<float> signature;
335 unsigned int totalMatch = 0;
342 for(
unsigned int i = 0; i < n; i++ ){
344 kpt.pt.x /= (float)(1 << kpt.octave);
345 kpt.pt.y /= (float)(1 << kpt.octave);
346 int k =
fernClassifier(imgPyr[(
unsigned int)kpt.octave], kpt.pt, signature);
347 if( k >= 0 && (bestMatches[(
unsigned int)k] < 0 || signature[(
unsigned int)k] > maxLogProb[(
unsigned int)k]) ){
348 maxLogProb[(
unsigned int)k] = signature[(
unsigned int)k];
349 bestMatches[(
unsigned int)k] = (
int)i;
362 for(
unsigned int i = 0; i < m; i++ ){
363 if( bestMatches[i] >= 0 ){
390 const unsigned int _height,
const unsigned int _width)
394 vpTRACE(
"Bad size for the subimage");
396 "Bad size for the subimage"));
402 (
unsigned int)_iP.
get_i(),
403 (
unsigned int)_iP.
get_j(),
404 _height, _width, subImage);
429 (
unsigned int)_rectangle.
getWidth()));
493 std::cout <<
" > Load data for the planar object detector..." << std::endl;
496 cv::FileStorage fs(_dataFile, cv::FileStorage::READ);
497 cv::FileNode node = fs.getFirstTopLevelNode();
499 cv::FileNodeIterator it = node[
"model-roi"].begin(), it_end;
505 const cv::FileNode node_ = node[
"model-points"];
524 cv::FileStorage fs(_dataFile, cv::FileStorage::WRITE);
526 cv::WriteStructContext ws(fs, _objectName, CV_NODE_MAP);
529 cv::WriteStructContext wsroi(fs,
"model-roi", CV_NODE_SEQ + CV_NODE_FLOW);
552 #if (VISP_HAVE_OPENCV_VERSION >= 0x020408)
557 if((
curImg->width % 8) == 0){
559 cvReleaseImageHeader(&
curImg);
576 std::cout <<
"!> conversion failed" << std::endl;
class that defines what is a Keypoint. This class provides all the basic elements to implement classe...
virtual ~vpFernClassifier()
std::vector< cv::KeyPoint > imgKeypoints
the vector containing the points in the current image.
bool blurImage
Flag to specify whether the reference image have to be blurred or not in order to improve the recogni...
unsigned int getWidth() const
bool hasLearn
Flag to indicate whether the classifier has been trained or not.
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
virtual unsigned int matchPoint(const vpImage< unsigned char > &I)
Type * bitmap
points toward the bitmap
Class to define colors available for display functionnalities.
int nbClassfier
Number of classifier.
int nbView
Number of view to generate for the training.
cv::Rect modelROI_Ref
the ROI in the reference image.
cv::PatchGenerator gen
The patch generator (OpenCV format).
unsigned int nbMinPoint
Number of minimum point below which the homography is not estimated (must be at least four) ...
error that can be emited by ViSP classes.
cv::LDetector ldetector
The points of interest detector.
static const vpColor green
int radius
Radius for the detector.
int nbPoints
Maximal number of points.
std::vector< cv::Point2f > curPt
virtual unsigned int buildReference(const vpImage< unsigned char > &I)
int patchSize
Size of the patch.
void set_i(const double ii)
int sigmaBlur
Sigma of the kernel used to blur the image.
int nbOctave
Number of octave for the multi scale.
bool _reference_computed
flag to indicate if the reference has been built.
virtual void displayCross(const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1)=0
std::vector< vpImagePoint > referenceImagePointsList
void record(const std::string &_objectName, const std::string &_dataFile)
record the Ferns classifier in the text file
std::vector< cv::KeyPoint > objKeypoints
keypoints detected in the reference image.
void set_j(const double jj)
int threshold
Threshold to accept or reject points (usually around 20)
cv::FernClassifier fernClassifier
The Fern classifier.
int dist
Minimal distance between two points.
std::vector< unsigned int > matchedReferencePoints
std::vector< cv::Point2f > refPt
vector in the OpenCV format to be used by the detector.
unsigned int getHeight() const
Defines a rectangle in the plane.
int radiusBlur
Radius of the kernel used to blur the image.
std::vector< vpImagePoint > currentImagePointsList
cv::Mat curImg
The current image in the OpenCV format.
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
void load(const std::string &_dataFile, const std::string &)
load the Fern classifier
virtual void display(const vpImage< unsigned char > &Iref, const vpImage< unsigned char > &Icurrent, unsigned int size=3)
void setImage(const vpImage< unsigned char > &I)
std::vector< cv::KeyPoint > modelPoints
the vector containing the points in the model.
int ClassifierSize
Size of the classifier.
cv::Rect modelROI
the ROI for the reference image.