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; }
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(); }