39 #include <visp3/core/vpConfig.h>
41 #if (VISP_HAVE_OPENCV_VERSION >= 0x020000) && (VISP_HAVE_OPENCV_VERSION < 0x030000) // Require opencv >= 2.0.0 and < 3.0.0
43 #include <visp3/vision/vpFernClassifier.h>
44 #include <visp3/core/vpImageTools.h>
45 #include <visp3/core/vpImageConvert.h>
46 #include <visp3/core/vpColor.h>
47 #include <visp3/core/vpDisplay.h>
55 ldetector(), fernClassifier(), gen(0, 256, 5, true, 0.6, 1.5, -CV_PI/2, CV_PI/2, -CV_PI/2, CV_PI/2),
56 hasLearn(false), threshold(20), nbView(2000), dist(2), nbClassfier(100), ClassifierSize(11),
57 nbOctave(2), patchSize(32), radius(7), nbPoints(200), blurImage(true), radiusBlur(7),
58 sigmaBlur(1), nbMinPoint(10),
59 #if (VISP_HAVE_OPENCV_VERSION >= 0x020408)
64 objKeypoints(), modelROI_Ref(), modelROI(),
65 modelPoints(), imgKeypoints(), refPt(), curPt()
81 ldetector(), fernClassifier(), gen(0, 256, 5, true, 0.6, 1.5, -CV_PI/2, CV_PI/2, -CV_PI/2, CV_PI/2),
82 hasLearn(false), threshold(20), nbView(2000), dist(2), nbClassfier(100), ClassifierSize(11),
83 nbOctave(2), patchSize(32), radius(7), nbPoints(200), blurImage(true), radiusBlur(7),
84 sigmaBlur(1), nbMinPoint(10),
85 #if (VISP_HAVE_OPENCV_VERSION >= 0x020408)
90 objKeypoints(), modelROI_Ref(), modelROI(),
91 modelPoints(), imgKeypoints(), refPt(), curPt()
93 this->
load(_dataFile, _objectName);
102 #if (VISP_HAVE_OPENCV_VERSION < 0x020408)
104 if(
curImg->width % 8 == 0){
106 cvReleaseImageHeader(&
curImg);
127 #if (VISP_HAVE_OPENCV_VERSION < 0x020408)
155 cv::Mat obj = (cv::Mat)
curImg;
162 std::vector<cv::Mat> objpyr;
163 cv::buildPyramid(obj, objpyr, d.nOctaves-1);
171 modelROI = cv::Rect(0, 0, objpyr[0].cols, objpyr[0].rows);
176 cv::FernClassifier::COMPRESSION_NONE,
gen);
180 for (
unsigned int i = 0; i <
modelPoints.size(); i += 1){
236 const unsigned int _height,
const unsigned int _width)
240 vpTRACE(
"Bad size for the subimage");
242 "Bad size for the subimage"));
247 (
unsigned int)_iP.
get_i(),
248 (
unsigned int)_iP.
get_j(),
249 _height, _width, subImage);
289 (
unsigned int)_rectangle.
getWidth()));
314 cv::Mat img = this->
curImg;
320 std::vector<cv::Mat> imgPyr;
321 cv::buildPyramid(img, imgPyr,
ldetector.nOctaves-1);
328 std::vector<int> bestMatches(m, -1);
329 std::vector<float> maxLogProb(m, -FLT_MAX);
330 std::vector<float> signature;
331 unsigned int totalMatch = 0;
338 for(
unsigned int i = 0; i < n; i++ ){
340 kpt.pt.x /= (float)(1 << kpt.octave);
341 kpt.pt.y /= (float)(1 << kpt.octave);
342 int k =
fernClassifier(imgPyr[(
unsigned int)kpt.octave], kpt.pt, signature);
343 if( k >= 0 && (bestMatches[(
unsigned int)k] < 0 || signature[(
unsigned int)k] > maxLogProb[(
unsigned int)k]) ){
344 maxLogProb[(
unsigned int)k] = signature[(
unsigned int)k];
345 bestMatches[(
unsigned int)k] = (
int)i;
358 for(
unsigned int i = 0; i < m; i++ ){
359 if( bestMatches[i] >= 0 ){
386 const unsigned int _height,
const unsigned int _width)
390 vpTRACE(
"Bad size for the subimage");
392 "Bad size for the subimage"));
398 (
unsigned int)_iP.
get_i(),
399 (
unsigned int)_iP.
get_j(),
400 _height, _width, subImage);
425 (
unsigned int)_rectangle.
getWidth()));
489 std::cout <<
" > Load data for the planar object detector..." << std::endl;
492 cv::FileStorage fs(_dataFile, cv::FileStorage::READ);
493 cv::FileNode node = fs.getFirstTopLevelNode();
495 cv::FileNodeIterator it = node[
"model-roi"].begin(), it_end;
501 const cv::FileNode node_ = node[
"model-points"];
520 cv::FileStorage fs(_dataFile, cv::FileStorage::WRITE);
522 cv::WriteStructContext ws(fs, _objectName, CV_NODE_MAP);
525 cv::WriteStructContext wsroi(fs,
"model-roi", CV_NODE_SEQ + CV_NODE_FLOW);
548 #if (VISP_HAVE_OPENCV_VERSION >= 0x020408)
553 if((
curImg->width % 8) == 0){
555 cvReleaseImageHeader(&
curImg);
572 std::cout <<
"!> conversion failed" << std::endl;
579 #elif !defined(VISP_BUILD_SHARED_LIBS)
581 void dummy_vpFernClassifier() {};
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.
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)
static void displayCross(const vpImage< unsigned char > &I, const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1)
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.