Пример #1
0
void PatchMatch::propagation(const cv::Mat &src, const cv::Mat &dst, RosMat<offsetElement> &NearNei) {
    
    for (int i = 0; i < NearNei.rows; i ++) {
        for (int j = 0; j < NearNei.cols; j ++) {
            
            if ( dst_mask.at<double>(i, j) ) {
                
                if ( i >= 1 ) {
                    
                    update(src, dst, NearNei(i, j), NearNei(i - 1, j).offset + Point(j, i), Point(j, i));
                    
                }
                
                if ( j >= 1 ) {
                    
                    update(src, dst, NearNei(i, j), NearNei(i, j - 1).offset + Point(j, i), Point(j, i));
                    
                }
                
                randomSearch(src, dst, NearNei(i, j), Point(j, i));

                
            }
            

            
        }
    }
    
    
    for (int i = NearNei.rows - 1; i >= 0; i --) {
        for (int j = NearNei.cols - 1; j >= 0; j --) {
            
            if ( dst_mask.at<double>(i, j)) {
                
                if ( i < NearNei.rows - 1 ) {
                    
                    update(src, dst, NearNei(i, j), NearNei(i + 1, j).offset + Point(j, i), Point(j, i));
                    
                }
                
                if ( j < NearNei.cols - 1 ) {
                    
                    update(src, dst, NearNei(i, j), NearNei(i, j + 1).offset + Point(j, i), Point(j, i));
                    
                }
                
                randomSearch(src, dst, NearNei(i, j), Point(j, i));
                
            }
            

            
        }
    }
    
    
    
}
void startProcess()
{
	cout<<"process is started"<<endl;
	cv::pyrDown(image,image);
	cv::pyrDown(imageDup,imageDup);
	cv::pyrDown(colorDup,colorDup);
	cv::pyrDown(colorImage,colorImage);
	cv::pyrDown(finalImage,finalImage);
	cv::pyrDown(randomPatchImage,randomPatchImage);
	//cv::pyrDown(randomPatchesCreation,randomPatchesCreation);
	cv::pyrDown(randomPatchDup,randomPatchDup);
	cv::pyrDown(randomMappedImage,randomMappedImage);
				
	initiation();
	propogation();

	cout<<"propogation phase is completed"<<endl;

	cv::imshow("random patches after propogation",randomPatchDup);
	
	addtoImage();

	cv::imshow("complete image with random patches after propogation",imageDup);
	randomSearch(40);


		cv::imshow("complete image after random search",imageDup);


}
void GeneralizedPatchMatch::propagation(const cv::Mat &src, const cv::Mat &dst, dynamicArray2D<p_offset> &NearNei) {
    
    for (int i = 0; i < NearNei.rows; i ++) {
        for (int j = 0; j < NearNei.cols; j ++) {
            
            if ( i >= 1 ) {

                update(src, dst, NearNei.at(i, j), NearNei.at(i - 1, j), Point(j, i));
                
            }
            
            if ( j >= 1 ) {
                
                update(src, dst, NearNei.at(i, j), NearNei.at(i, j - 1), Point(j, i));
                
            }
            
            randomSearch(src, dst, NearNei.at(i, j), Point(j, i));
            
        }
    }
    
    
    for (int i = NearNei.rows - 1; i >= 0; i --) {
        for (int j = NearNei.cols - 1; j >= 0; j --) {
            
            if ( i < NearNei.rows - 1 ) {
                
                update(src, dst, NearNei.at(i, j), NearNei.at(i + 1, j), Point(j, i));
                
            }
            
            if ( j < NearNei.cols - 1 ) {
                
                update(src, dst, NearNei.at(i, j), NearNei.at(i, j + 1), Point(j, i));
                
            }
            
            randomSearch(src, dst, NearNei.at(i, j), Point(j, i));
            
        }
    }
    
    
    
}
int main(int argc, char *argv[]) {
    int algorithm, times_to_execute=1;

    do {
        printf ("Number of queens (1<=nqueens<%d): ", MAXQ);
        scanf ("%d", &nqueens);
    } while ((nqueens < 1) || (nqueens > MAXQ));

    do {
        printf ("Algorithm: (1) Random search  (2) Hill climbing  ");
        printf ("(3) Simulated Annealing  (4) Genetic Algorithm: ");
        scanf ("%d", &algorithm);
    } while ((algorithm < 1) || (algorithm > 4));
    
    if (algorithm != 4) {
        do {
            printf("How many times to execute? (1<n<10000):");
            scanf("%d", &times_to_execute);
        } while ((times_to_execute < 1 || times_to_execute > 10000));
    }
  
    initializeRandomGenerator();
    
    int i=0;
    switch (algorithm) {
        case 1: randomSearch();       break;
        case 2:
            solutions_found = 0;
            for (i=0; i<times_to_execute; i++) {
                initiateQueens(1);
                hillClimbing();
            }
            printf("Algorithm finished. Found a solution in %d out of %d executions.\n", solutions_found, i);
            break;
        case 3:
            solutions_found = 0;
            for(i = 0; i < times_to_execute; i++)
            {
                initiateQueens(1);
                simulatedAnnealing();
            }
            printf("Algorithm finished. Found a solution in %d out of %d executions.\n", solutions_found, i);
            break;
        case 4:
            initiateQueens(1);
            geneticAlgorithm();
    }

    return 0;  
}