Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}