43 #include <visp/vpConfig.h>
45 #if (VISP_HAVE_OPENCV_VERSION >= 0x020000) // Require opencv >= 2.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>
57 vpFernClassifier::vpFernClassifier():
vpBasicKeyPoint(), gen(0, 256, 5, true, 0.6, 1.5, -CV_PI/2, CV_PI/2, -CV_PI/2, CV_PI/2)
75 this->
load(_dataFile, _objectName);
140 std::vector<cv::Mat> objpyr;
141 cv::buildPyramid(obj, objpyr, d.nOctaves-1);
149 modelROI = cv::Rect(0, 0, objpyr[0].cols, objpyr[0].rows);
154 cv::FernClassifier::COMPRESSION_NONE,
gen);
158 for (
unsigned int i = 0; i <
modelPoints.size(); i += 1){
214 const unsigned int _height,
const unsigned int _width)
218 vpTRACE(
"Bad size for the subimage");
220 "Bad size for the subimage"));
225 (
unsigned int)_iP.
get_i(),
226 (
unsigned int)_iP.
get_j(),
227 _height, _width, subImage);
267 (
unsigned int)_rectangle.
getWidth()));
298 std::vector<cv::Mat> imgPyr;
299 cv::buildPyramid(img, imgPyr,
ldetector.nOctaves-1);
306 std::vector<int> bestMatches(m, -1);
307 std::vector<float> maxLogProb(m, -FLT_MAX);
308 std::vector<float> signature;
309 unsigned int totalMatch = 0;
316 for(
unsigned int i = 0; i < n; i++ ){
318 kpt.pt.x /= (float)(1 << kpt.octave);
319 kpt.pt.y /= (float)(1 << kpt.octave);
320 int k =
fernClassifier(imgPyr[(
unsigned int)kpt.octave], kpt.pt, signature);
321 if( k >= 0 && (bestMatches[(
unsigned int)k] < 0 || signature[(
unsigned int)k] > maxLogProb[(
unsigned int)k]) ){
322 maxLogProb[(
unsigned int)k] = signature[(
unsigned int)k];
323 bestMatches[(
unsigned int)k] = (
int)i;
336 for(
unsigned int i = 0; i < m; i++ ){
337 if( bestMatches[i] >= 0 ){
364 const unsigned int _height,
const unsigned int _width)
368 vpTRACE(
"Bad size for the subimage");
370 "Bad size for the subimage"));
376 (
unsigned int)_iP.
get_i(),
377 (
unsigned int)_iP.
get_j(),
378 _height, _width, subImage);
403 (
unsigned int)_rectangle.
getWidth()));
467 std::cout <<
" > Load data for the planar object detector..." << std::endl;
470 cv::FileStorage fs(_dataFile, cv::FileStorage::READ);
471 cv::FileNode node = fs.getFirstTopLevelNode();
473 cv::FileNodeIterator it = node[
"model-roi"].begin(), it_end;
479 const cv::FileNode node_ = node[
"model-points"];
498 cv::FileStorage fs(_dataFile, cv::FileStorage::WRITE);
500 cv::WriteStructContext ws(fs, _objectName, CV_NODE_MAP);
503 cv::WriteStructContext wsroi(fs,
"model-roi", CV_NODE_SEQ + CV_NODE_FLOW);
548 std::cout <<
"!> conversion failed" << std::endl;