Exemple #1
0
int main()
{
   Reader reader;

   /// Если одна большая плитка стоит больше чем две маленькие, то можно ничего не искать
   if( reader.A() > reader.B()*2 )
   {
      std::cout << ( reader.Stars()*reader.B() );
      return 0;
   }

   TableType adj;

   /// заполняем данными из входного файла
   reader.DoFill(adj);

   /// представляем итые клетки в виде двудольного графа
   /// представляем паркет в виде шахматной доски, черные в одной доле, белые в другой
   /// ищем максимум паросочетаний
   PairList pairs;
   FindPairs( reader.VCount(), reader.UCount(), adj, pairs );

   /// считаем найденные пары
   int count = std::count_if( pairs.begin(), pairs.end(), Compare() );
   
   std::cout << count*reader.A() + ( reader.Stars() - count*2 )*reader.B();

   return 0;
}
int KitechSurfObjectRecognitionComp::LocatePlanarObject( const CvSeq* objectKeypoints, const CvSeq* objectDescriptors, const CvSeq* imageKeypoints, const CvSeq* imageDescriptors, const CvPoint src_corners[4], CvPoint dst_corners[4] )
{
    double h[9];
    CvMat _h = cvMat(3, 3, CV_64F, h);
    vector<int> ptpairs;
    vector<CvPoint2D32f> pt1, pt2;
    CvMat _pt1, _pt2;
    int i, n;

    FindPairs( objectKeypoints, objectDescriptors, imageKeypoints, imageDescriptors, ptpairs );
    n = ptpairs.size()/2;
    if( n < 4 )
        return 0;

    pt1.resize(n);
    pt2.resize(n);
    for( i = 0; i < n; i++ )
    {
        pt1[i] = ((CvSURFPoint*)cvGetSeqElem(objectKeypoints,ptpairs[i*2]))->pt;
        pt2[i] = ((CvSURFPoint*)cvGetSeqElem(imageKeypoints,ptpairs[i*2+1]))->pt;
    }

    _pt1 = cvMat(1, n, CV_32FC2, &pt1[0] );
    _pt2 = cvMat(1, n, CV_32FC2, &pt2[0] );
    if( !cvFindHomography( &_pt1, &_pt2, &_h, CV_RANSAC, 5 ))
        return 0;

    for( i = 0; i < 4; i++ )
    {
        double x = src_corners[i].x, y = src_corners[i].y;
        double Z = 1./(h[6]*x + h[7]*y + h[8]);
        double X = (h[0]*x + h[1]*y + h[2])*Z;
        double Y = (h[3]*x + h[4]*y + h[5])*Z;
        dst_corners[i] = cvPoint(cvRound(X), cvRound(Y));
    }

    return 1;
}
Exemple #3
0
void PairFinder::doWork() {

    qDebug()<<"started file loading in new thread";

    loadInputFile();
    std::stringstream ss1, ss2;
    ss1 << "Offset (nm): ";
    ss2 << "Offset (px): ";

    for (int i = 0; i < dimensions; ++i)
    {
        ss1 << Offset[i] << " ";
        ss2 << Offset[i]/NM_PER_PX << " ";
    }
    sdm->writeToLogFile(QString::fromStdString(ss1.str()));
    sdm->writeToLogFile(QString::fromStdString(ss2.str()));

    if(canceled)
    {
        sdm->setStartDemixingButtonEnabled(true);
        emit finished();
        return;
    }

    if(fishing_settings.run)
    {
        sdm->writeToLogFile("searching optimal offset");
        qDebug() << "starting fishing";
        /*if(fishing_settings.range > min_maxValues.max_x)
        {
            fishing_settings.range = min_maxValues.max_x/10;
            if(fishing_settings.range > min_maxValues.max_y)
                fishing_settings.range = min_maxValues.max_y/10;
        }*/
            double minOffsetX = Offset[0]-(fishing_settings.range/2);
            double minOffsetY = Offset[1]-(fishing_settings.range/2);
            double maxOffsetX = Offset[0]+(fishing_settings.range/2);
            double maxOffsetY = Offset[1]+(fishing_settings.range/2);
            int counterX = 0;
            int counterY = 0;
            while(Offset[0]<maxOffsetX)
            {
                Offset[0] = minOffsetX + fishing_settings.increment*counterX;
                while(Offset[1]<maxOffsetY)
                {

                    Offset[1] = minOffsetY + fishing_settings.increment*counterY;
                    //qDebug() << "current Offset : " << Offset[0] << " " << Offset[1];
                    FindPairs(true, fishing_settings.subset);
                    counterY++;
                }
                Offset[1]=minOffsetY;
                counterY=0;
                counterX++;
            }


        int index = 0;
        fishing_run max_pairs;
        std::vector<fishing_run>::iterator it;
        for( it = fishing_results.begin(); it != fishing_results.end(); ++it )
        {
            fishing_run current_result = *it;
            if (index == 0)
            {
                max_pairs = current_result;
            }
            if(max_pairs.numpairs < current_result.numpairs)
                max_pairs = current_result;

            ++index;
        }

        std::stringstream ss1, ss2;
        ss1 << "new Offset (nm): ";
        ss2 << "new Offset (px): ";

        for (int i = 0; i < dimensions; ++i)
        {
            //new Offset:
            Offset[i] = max_pairs.getOffset(i);    
            qDebug() << "new Offset : " << Offset[i];
            ss1 << Offset[i] << " ";
            ss2 << Offset[i]/NM_PER_PX << " ";
        }
        sdm->writeToLogFile(QString::fromStdString(ss1.str()));
        sdm->writeToLogFile(QString::fromStdString(ss2.str()));
    }

    FindPairs(false);

    qDebug() << "found " << numpairs << " pairs";
    if ( numpairs == 0)
    {
        //QMessageBox msgBox;
       // msgBox.setText("");

       // msgBox.critical(0,"SDmixer Error","No pairs found! Please check input file and offset settings.");
        /*int ret = msgBox.exec();
        if(ret == QMessageBox::Ok)*/
        emit error("No pairs found! Please check input file and offset settings.");
        return;
    }


    std::ostringstream os; os << "found " << numpairs << " pairs." ;
    sdm->writeToLogFile(QString::fromStdString(os.str()));

    if(runGrouping)
    {
        qDebug() << "starting grouping";
        sdm->writeToLogFile("starting Grouping");
        startGrouping();
    }

    sdm->setPF_min_maxValues(min_maxValues);

    //saveFile();

    emit finished();

}