void Mesh::addVertices( InputArray _pts, InputArray _colors ) { if (_pts.total() == 0 || _colors.total() == 0) { m_beginIndicesVer.push_back((int)m_vertices.size()); return; } Mat pts = _pts.getMat(); Mat colors = _colors.getMat(); assert(pts.type() == CV_64FC3 && colors.type() == CV_8UC3); assert(pts.total() == colors.total()); int total = (int)pts.total(); assert(pts.isContinuous() && colors.isContinuous()); Vec3d* ptsPtr = (Vec3d*)pts.data; Vec3b* colorsPtr = (Vec3b*)colors.data; int cnt = (int)m_vertices.size(); int begin = cnt; m_beginIndicesVer.push_back(cnt); for (int i = 0; i < total; i++) { Vec3d xyz = ptsPtr[i]; Vec3b color = colorsPtr[i]; m_vertices.push_back(Vertex(xyz, cnt, color)); cnt++; m_barycenter += xyz; } cout << "Points total number:" << m_vertices.size() << endl; }
//------------------------------------------------------------------------------ // Eigenfaces //------------------------------------------------------------------------------ void Eigenfaces::train(InputArray _src, InputArray _local_labels) { if(_src.total() == 0) { string error_message = format("Empty training data was given. You'll need more than one sample to learn a model."); CV_Error(CV_StsBadArg, error_message); } else if(_local_labels.getMat().type() != CV_32SC1) { string error_message = format("Labels must be given as integer (CV_32SC1). Expected %d, but was %d.", CV_32SC1, _local_labels.type()); CV_Error(CV_StsBadArg, error_message); } // make sure data has correct size if(_src.total() > 1) { for(int i = 1; i < static_cast<int>(_src.total()); i++) { if(_src.getMat(i-1).total() != _src.getMat(i).total()) { string error_message = format("In the Eigenfaces method all input samples (training images) must be of equal size! Expected %d pixels, but was %d pixels.", _src.getMat(i-1).total(), _src.getMat(i).total()); CV_Error(CV_StsUnsupportedFormat, error_message); } } } // get labels Mat labels = _local_labels.getMat(); // observations in row Mat data = asRowMatrix(_src, CV_64FC1); // number of samples int n = data.rows; // assert there are as much samples as labels if(static_cast<int>(labels.total()) != n) { string error_message = format("The number of samples (src) must equal the number of labels (labels)! len(src)=%d, len(labels)=%d.", n, labels.total()); CV_Error(CV_StsBadArg, error_message); } // clear existing model data _labels.release(); _projections.clear(); // clip number of components to be valid if((_num_components <= 0) || (_num_components > n)) _num_components = n; // perform the PCA PCA pca(data, Mat(), CV_PCA_DATA_AS_ROW, _num_components); // copy the PCA results _mean = pca.mean.reshape(1,1); // store the mean vector _eigenvalues = pca.eigenvalues.clone(); // eigenvalues by row transpose(pca.eigenvectors, _eigenvectors); // eigenvectors by column labels.copyTo(_labels); // store labels for prediction // save projections for(int sampleIdx = 0; sampleIdx < data.rows; sampleIdx++) { Mat p = subspaceProject(_eigenvectors, _mean, data.row(sampleIdx)); _projections.push_back(p); } }
static void checkSimilarity(InputArray res, InputArray ref, double maxNormInf = 1, double maxNormL2 = 1.0 / 64) { double normInf = cvtest::norm(res, ref, NORM_INF); double normL2 = cvtest::norm(res, ref, NORM_L2) / res.total(); if (maxNormInf >= 0) EXPECT_LE(normInf, maxNormInf); if (maxNormL2 >= 0) EXPECT_LE(normL2, maxNormL2); }
int Dictionary::getDistanceToId(InputArray bits, int id, bool allRotations) const { CV_Assert(id >= 0 && id < bytesList.rows); unsigned int nRotations = 4; if(!allRotations) nRotations = 1; Mat candidateBytes = getByteListFromBits(bits.getMat()); int currentMinDistance = int(bits.total() * bits.total()); for(unsigned int r = 0; r < nRotations; r++) { int currentHamming = cv::hal::normHamming( bytesList.ptr(id) + r*candidateBytes.cols, candidateBytes.ptr(), candidateBytes.cols); if(currentHamming < currentMinDistance) { currentMinDistance = currentHamming; } } return currentMinDistance; }
cv::Mat cv::viz::vtkTrajectorySource::ExtractPoints(InputArray _traj) { CV_Assert(_traj.kind() == _InputArray::STD_VECTOR || _traj.kind() == _InputArray::MAT); CV_Assert(_traj.type() == CV_32FC(16) || _traj.type() == CV_64FC(16)); Mat points(1, (int)_traj.total(), CV_MAKETYPE(_traj.depth(), 3)); const Affine3d* dpath = _traj.getMat().ptr<Affine3d>(); const Affine3f* fpath = _traj.getMat().ptr<Affine3f>(); if (_traj.depth() == CV_32F) for(int i = 0; i < points.cols; ++i) points.at<Vec3f>(i) = fpath[i].translation(); if (_traj.depth() == CV_64F) for(int i = 0; i < points.cols; ++i) points.at<Vec3d>(i) = dpath[i].translation(); return points; }