From 6a511755b2a6a9b267b377b460ba6885ce41cce9 Mon Sep 17 00:00:00 2001 From: Roman Donchenko Date: Mon, 27 Jan 2014 17:39:33 +0400 Subject: [PATCH 1/2] Fixed build for samples/cpp/train_HOG.cpp. get_hogdescriptor_visu is passed img->clone(), which is not usable as a non-const reference (and it doesn't modify the argument, anyway). --- samples/cpp/train_HOG.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/cpp/train_HOG.cpp b/samples/cpp/train_HOG.cpp index 3f21206a18..e3ee190fc3 100644 --- a/samples/cpp/train_HOG.cpp +++ b/samples/cpp/train_HOG.cpp @@ -14,7 +14,7 @@ void get_svm_detector(const SVM& svm, vector< float > & hog_detector ); void convert_to_ml(const std::vector< cv::Mat > & train_samples, cv::Mat& trainData ); void load_images( const string & prefix, const string & filename, vector< Mat > & img_lst ); void sample_neg( const vector< Mat > & full_neg_lst, vector< Mat > & neg_lst, const Size & size ); -Mat get_hogdescriptor_visu(Mat& color_origImg, vector& descriptorValues, const Size & size ); +Mat get_hogdescriptor_visu(const Mat& color_origImg, vector& descriptorValues, const Size & size ); void compute_hog( const vector< Mat > & img_lst, vector< Mat > & gradient_lst, const Size & size ); void train_svm( const vector< Mat > & gradient_lst, const vector< int > & labels ); void draw_locations( Mat & img, const vector< Rect > & locations, const Scalar & color ); @@ -155,7 +155,7 @@ void sample_neg( const vector< Mat > & full_neg_lst, vector< Mat > & neg_lst, co } // From http://www.juergenwiki.de/work/wiki/doku.php?id=public:hog_descriptor_computation_and_visualization -Mat get_hogdescriptor_visu(Mat& color_origImg, vector& descriptorValues, const Size & size ) +Mat get_hogdescriptor_visu(const Mat& color_origImg, vector& descriptorValues, const Size & size ) { const int DIMX = size.width; const int DIMY = size.height; From 3985980b2fca749c7e329a4ef6d7aed3e377a106 Mon Sep 17 00:00:00 2001 From: Cosmin Boaca Date: Tue, 28 Jan 2014 11:54:39 +0200 Subject: [PATCH 2/2] Added returnDFVal parameter to parallel CvSVM::predict function --- modules/ml/doc/support_vector_machines.rst | 2 +- modules/ml/include/opencv2/ml.hpp | 2 +- modules/ml/src/svm.cpp | 10 ++++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/ml/doc/support_vector_machines.rst b/modules/ml/doc/support_vector_machines.rst index 14ee12bb4e..9793bd6e3f 100644 --- a/modules/ml/doc/support_vector_machines.rst +++ b/modules/ml/doc/support_vector_machines.rst @@ -242,7 +242,7 @@ Predicts the response for input sample(s). .. ocv:function:: float CvSVM::predict( const CvMat* sample, bool returnDFVal=false ) const -.. ocv:function:: float CvSVM::predict( const CvMat* samples, CvMat* results ) const +.. ocv:function:: float CvSVM::predict( const CvMat* samples, CvMat* results, bool returnDFVal=false ) const .. ocv:pyfunction:: cv2.SVM.predict(sample[, returnDFVal]) -> retval diff --git a/modules/ml/include/opencv2/ml.hpp b/modules/ml/include/opencv2/ml.hpp index 42b90d22d9..7bc1d6fcf0 100644 --- a/modules/ml/include/opencv2/ml.hpp +++ b/modules/ml/include/opencv2/ml.hpp @@ -490,7 +490,7 @@ public: bool balanced=false ); virtual float predict( const CvMat* sample, bool returnDFVal=false ) const; - virtual float predict( const CvMat* samples, CV_OUT CvMat* results ) const; + virtual float predict( const CvMat* samples, CV_OUT CvMat* results, bool returnDFVal=false ) const; CV_WRAP CvSVM( const cv::Mat& trainData, const cv::Mat& responses, const cv::Mat& varIdx=cv::Mat(), const cv::Mat& sampleIdx=cv::Mat(), diff --git a/modules/ml/src/svm.cpp b/modules/ml/src/svm.cpp index f2d3c33ab8..341a817c94 100644 --- a/modules/ml/src/svm.cpp +++ b/modules/ml/src/svm.cpp @@ -2194,18 +2194,20 @@ float CvSVM::predict( const CvMat* sample, bool returnDFVal ) const } struct predict_body_svm : ParallelLoopBody { - predict_body_svm(const CvSVM* _pointer, float* _result, const CvMat* _samples, CvMat* _results) + predict_body_svm(const CvSVM* _pointer, float* _result, const CvMat* _samples, CvMat* _results, bool _returnDFVal) { pointer = _pointer; result = _result; samples = _samples; results = _results; + returnDFVal = _returnDFVal; } const CvSVM* pointer; float* result; const CvMat* samples; CvMat* results; + bool returnDFVal; void operator()( const cv::Range& range ) const { @@ -2213,7 +2215,7 @@ struct predict_body_svm : ParallelLoopBody { { CvMat sample; cvGetRow( samples, &sample, i ); - int r = (int)pointer->predict(&sample); + int r = (int)pointer->predict(&sample, returnDFVal); if (results) results->data.fl[i] = (float)r; if (i == 0) @@ -2222,11 +2224,11 @@ struct predict_body_svm : ParallelLoopBody { } }; -float CvSVM::predict(const CvMat* samples, CV_OUT CvMat* results) const +float CvSVM::predict(const CvMat* samples, CV_OUT CvMat* results, bool returnDFVal) const { float result = 0; cv::parallel_for_(cv::Range(0, samples->rows), - predict_body_svm(this, &result, samples, results) + predict_body_svm(this, &result, samples, results, returnDFVal) ); return result; }