Eigen::Matrix<T,4,1> rotate_to_plane(Eigen::Matrix<T,4,1> normP, Eigen::Matrix<T,4,1> norm, Eigen::Matrix<T,4,1> cen, Eigen::Matrix<T,4,1> vec){ norm.normalize(); normP.normalize(); Eigen::Matrix<T,4,1> xe = cross(norm,normP).normalize(); T r1 = norm.mag(); T rP = normP.mag(); T o = acos(dot(normP,norm)/r1/rP) - M_PI; T o0 = acos(dot(normP,norm)/r1/rP); Eigen::Quaternion<T> qP(normP); Eigen::Quaternion<T> qi(norm); // Eigen::Quaternion<T> dq = (qP-qi).normalize(); Eigen::Quaternion<T> dq(cos(o/2.), sin(o/2.)*xe[0], sin(o/2.)*xe[1], sin(o/2.)*xe[2]); // Eigen::Quaternion<T> dq = qP*qi.conj()*qP; Eigen::Matrix<T,4,1> c = dq.normalize().rotate(vec - cen); return c; }
cv::Mat CBIR::getClustersIndices(QString path){ QString imgName = path.section('/', -1); IplImage* img = Utils::loadImage(path.toAscii().data(), true); if(img == NULL){ qDebug() << "La imagen no fue cargada."; exit(1); } //Computo los features. CvSeq *imgKeypoints, *imgDescriptors; CvSURFParams params = cvSURFParams(500, 1); imgKeypoints = 0; imgDescriptors = 0; CvMemStorage* storage = cvCreateMemStorage(0); cvExtractSURF(img, 0, &imgKeypoints, &imgDescriptors, storage, params); qDebug() << "Imagen" << path << "cargada con exito. Features:" << imgKeypoints->total; //Copio los descriptores a una Mat. cv::Mat queryDescriptorsMat(imgDescriptors->total, DESCRIPTOR_DIMS, CV_32F); float* img_ptr = queryDescriptorsMat.ptr<float>(0); CvSeqReader img_reader; cvStartReadSeq(imgDescriptors, &img_reader); for(int j=0; j<imgDescriptors->total; j++){ const float* descriptor = (const float*)img_reader.ptr; CV_NEXT_SEQ_ELEM(img_reader.seq->elem_size, img_reader); memcpy(img_ptr, descriptor, DESCRIPTOR_DIMS*sizeof(float)); img_ptr += DESCRIPTOR_DIMS; } cvReleaseMemStorage(&storage); cvReleaseImage(&img); if(clustersMat.data == NULL) exit(1); //Creo el índice para los cluster centers. cv::flann::KDTreeIndexParams kdtiParams = cv::flann::KDTreeIndexParams(8); cv::flann::Index clustersIndex(clustersMat, kdtiParams); //Clusterizo cada feature de la query según Knn-Search. cv::Mat indices(queryDescriptorsMat.rows, 1, CV_32S); cv::Mat dists(queryDescriptorsMat.rows, 1, CV_32F); clustersIndex.knnSearch(queryDescriptorsMat, indices, dists, 1, cv::flann::SearchParams(1024)); /***************************************************************************************************************/ //Guardo el archivo para realizar la query al índice. QFile query("cbir/lemur/query/" + imgName + ".query"); QTextStream stream(&query); if (!query.open(QIODevice::WriteOnly | QIODevice::Text)) qDebug() << "Ocurrio un error al intentar abrir el archivo" + imgName + ".query"; stream << "<DOC 1>" << endl; // Itero sobre todos los features de la imagen. for(int i=0; i<queryDescriptorsMat.rows ;i++){ stream << indices.at<int>(i, 0) << endl; } stream << "</DOC>"; query.close(); //Guardo el archivo con los parámetros de la query. QFile qP("cbir/lemur/query/query_params"); QTextStream qPStream(&qP); if (!qP.open(QIODevice::WriteOnly | QIODevice::Text)) qDebug() << "Ocurrio un error al intentar abrir el archivo query_params"; qPStream << "<parameters>" << endl << "<index>e:\\Proyectos\\Git\\keepc\\release\\cbir\\lemur\\index\\index.key</index>" << endl << "<retModel>tfidf</retModel>" << endl << "<textQuery>e:\\Proyectos\\Git\\keepc\\release\\cbir\\lemur\\query\\" << imgName << ".query</textQuery>" << endl << "<resultFile>e:\\Proyectos\\Git\\keepc\\release\\cbir\\lemur\\query\\" << imgName << ".results</resultFile>" << endl << "<TRECResultFormat>1</TRECResultFormat>" << endl << "<resultCount>10</resultCount>" << endl << "</parameters>"; qP.close(); return indices; }