@add_toggle_cpp
- This code is in your OpenCV sample folder. Otherwise you can grab it from
- [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/core/Matrix/Drawing_1.cpp)
- @include samples/cpp/tutorial_code/core/Matrix/Drawing_1.cpp
- [here](https://raw.githubusercontent.com/opencv/opencv/3.4/samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp)
++ [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp)
+ @include samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_1.cpp
@end_toggle
@add_toggle_java
- This code is in your OpenCV sample folder. Otherwise you can grab it from
- [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/java/tutorial_code/core/BasicGeometricDrawing/BasicGeometricDrawing.java)
- @include samples/java/tutorial_code/core/BasicGeometricDrawing/BasicGeometricDrawing.java
- [here](https://raw.githubusercontent.com/opencv/opencv/3.4/samples/java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java)
++ [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java)
+ @include samples/java/tutorial_code/ImgProc/BasicGeometricDrawing/BasicGeometricDrawing.java
@end_toggle
@add_toggle_python
- This code is in your OpenCV sample folder. Otherwise you can grab it from
- [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/python/tutorial_code/core/BasicGeometricDrawing/basic_geometric_drawing.py)
- @include samples/python/tutorial_code/core/BasicGeometricDrawing/basic_geometric_drawing.py
- [here](https://raw.githubusercontent.com/opencv/opencv/3.4/samples/python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py)
++ [here](https://raw.githubusercontent.com/opencv/opencv/master/samples/python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py)
+ @include samples/python/tutorial_code/imgProc/BasicGeometricDrawing/basic_geometric_drawing.py
@end_toggle
Explanation
CV_WRAP virtual void shuffleTrainTest() = 0;
/** @brief Returns matrix of test samples */
- CV_WRAP Mat getTestSamples() const;
+ CV_WRAP virtual Mat getTestSamples() const = 0;
/** @brief Returns vector of symbolic names captured in loadFromCSV() */
- CV_WRAP void getNames(std::vector<String>& names) const;
+ CV_WRAP virtual void getNames(std::vector<String>& names) const = 0;
- CV_WRAP static Mat getSubVector(const Mat& vec, const Mat& idx);
+ /** @brief Extract from 1D vector elements specified by passed indexes.
+ @param vec input vector (supported types: CV_32S, CV_32F, CV_64F)
+ @param idx 1D index vector
+ */
+ static CV_WRAP Mat getSubVector(const Mat& vec, const Mat& idx);
+
+ /** @brief Extract from matrix rows/cols specified by passed indexes.
+ @param matrix input matrix (supported types: CV_32S, CV_32F, CV_64F)
+ @param idx 1D index vector
+ @param layout specifies to extract rows (cv::ml::ROW_SAMPLES) or to extract columns (cv::ml::COL_SAMPLES)
+ */
+ static CV_WRAP Mat getSubMatrix(const Mat& matrix, const Mat& idx, int layout);
/** @brief Reads the dataset from a .csv file and returns the ready-to-use training data.
TrainData::~TrainData() {}
-Mat TrainData::getTestSamples() const
-{
- Mat idx = getTestSampleIdx();
- Mat samples = getSamples();
- return idx.empty() ? Mat() : getSubMatrix(samples, idx, getLayout());
-}
-
Mat TrainData::getSubVector(const Mat& vec, const Mat& idx)
{
- if( idx.empty() )
- return vec;
- int i, j, n = idx.checkVector(1, CV_32S);
- int type = vec.type();
- CV_Assert( type == CV_32S || type == CV_32F || type == CV_64F );
- int dims = 1, m;
+ if (!(vec.cols == 1 || vec.rows == 1))
+ CV_LOG_WARNING(NULL, "'getSubVector(const Mat& vec, const Mat& idx)' call with non-1D input is deprecated. It is not designed to work with 2D matrixes (especially with 'cv::ml::COL_SAMPLE' layout).");
+ return getSubMatrix(vec, idx, vec.rows == 1 ? cv::ml::COL_SAMPLE : cv::ml::ROW_SAMPLE);
+ }
+
+ template<typename T>
+ Mat getSubMatrixImpl(const Mat& m, const Mat& idx, int layout)
+ {
+ int nidx = idx.checkVector(1, CV_32S);
+ int dims = m.cols, nsamples = m.rows;
- if( vec.cols == 1 || vec.rows == 1 )
+ Mat subm;
+ if (layout == COL_SAMPLE)
{
- dims = 1;
- m = vec.cols + vec.rows - 1;
+ std::swap(dims, nsamples);
+ subm.create(dims, nidx, m.type());
}
else
{
- dims = vec.cols;
- m = vec.rows;
+ subm.create(nidx, dims, m.type());
}
- Mat subvec;
-
- if( vec.cols == m )
- subvec.create(dims, n, type);
- else
- subvec.create(n, dims, type);
- if( type == CV_32S )
- for( i = 0; i < n; i++ )
+ for (int i = 0; i < nidx; i++)
+ {
+ int k = idx.at<int>(i); CV_CheckGE(k, 0, "Bad idx"); CV_CheckLT(k, nsamples, "Bad idx or layout");
+ if (dims == 1)
{
- int k = idx.at<int>(i);
- CV_Assert( 0 <= k && k < m );
- if( dims == 1 )
- subvec.at<int>(i) = vec.at<int>(k);
- else
- for( j = 0; j < dims; j++ )
- subvec.at<int>(i, j) = vec.at<int>(k, j);
+ subm.at<T>(i) = m.at<T>(k); // at() has "transparent" access for 1D col-based / row-based vectors.
}
- else if( type == CV_32F )
- for( i = 0; i < n; i++ )
+ else if (layout == COL_SAMPLE)
{
- int k = idx.at<int>(i);
- CV_Assert( 0 <= k && k < m );
- if( dims == 1 )
- subvec.at<float>(i) = vec.at<float>(k);
- else
- for( j = 0; j < dims; j++ )
- subvec.at<float>(i, j) = vec.at<float>(k, j);
+ for (int j = 0; j < dims; j++)
+ subm.at<T>(j, i) = m.at<T>(j, k);
}
- else
- for( i = 0; i < n; i++ )
+ else
{
- int k = idx.at<int>(i);
- CV_Assert( 0 <= k && k < m );
- if( dims == 1 )
- subvec.at<double>(i) = vec.at<double>(k);
- else
- for( j = 0; j < dims; j++ )
- subvec.at<double>(i, j) = vec.at<double>(k, j);
+ for (int j = 0; j < dims; j++)
+ subm.at<T>(i, j) = m.at<T>(k, j);
}
- return subvec;
+ }
+ return subm;
+ }
+
+ Mat TrainData::getSubMatrix(const Mat& m, const Mat& idx, int layout)
+ {
+ if (idx.empty())
+ return m;
+ int type = m.type();
+ CV_CheckType(type, type == CV_32S || type == CV_32F || type == CV_64F, "");
+ if (type == CV_32S || type == CV_32F) // 32-bit
+ return getSubMatrixImpl<int>(m, idx, layout);
+ if (type == CV_64F) // 64-bit
+ return getSubMatrixImpl<double>(m, idx, layout);
+ CV_Error(Error::StsInternal, "");
}
+
class TrainDataImpl CV_FINAL : public TrainData
{
public:
return layout == ROW_SAMPLE ? samples.cols : samples.rows;
}
- return idx.empty() ? Mat() : getSubVector(samples, idx);
+ Mat getTestSamples() const CV_OVERRIDE
+ {
+ Mat idx = getTestSampleIdx();
++ return idx.empty() ? Mat() : getSubMatrix(samples, idx, getLayout());
+ }
+
Mat getSamples() const CV_OVERRIDE { return samples; }
Mat getResponses() const CV_OVERRIDE { return responses; }
Mat getMissing() const CV_OVERRIDE { return missing; }