【OpenCV】 基於 ransac 算法的 sift 特徵匹配程序(開發環境爲OpenCV2.3.1+VS2010)

因爲前一陣子忙於自己的畢設,所以就沒有及時更新日誌,今天正好沒其他事兒,所以,我就把圖像拼接程序寫上來了。。。歡迎大家的閱讀以及批評和指正。
下面的程序是基於opencv2.3.1+vs2010的搭建的環境下編程的。。。
首先對兩個usb通用攝像頭進行了標定。然後進行圖像拼接,最後進行測距。
這不是最終版,因爲最終版是我的論文內容。
所以,要過一陣子才能寫上來,因爲現在寫上來我的論文可能被互聯網的查重率坑爹的。。。
呵呵,請大家見諒。。。不過,很多重點代碼都是完好無損的。。。。

#include <math.h>
#include <ctime>
#include <cv.h>
#include <highgui.h>
#include <features2d/features2d.hpp>
#include <cvaux.h>
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
using namespace cv;


void main()
{
ofstream fout("Result.txt");


float f_left[2],f_right[2];
IplImage * show; //RePlay圖像指針
    cvNamedWindow("RePlay",1);
    int number_image_copy=7; //複製圖像幀數
    CvSize board_size=cvSize(9,6); //標定板角點數
    CvSize2D32f square_size=cvSize2D32f(10,10);  //假設我的每個標定方格長寬都是1.82釐米
    float square_length=square_size.width; //方格長度
    float square_height=square_size.height;  //方格高度
    int board_width=board_size.width; //每行角點數
    int board_height=board_size.height; //每列角點數
    int total_per_image=board_width*board_height; //每張圖片角點總數
    int count; //存儲每幀圖像中實際識別的角點數
    int found; //識別標定板角點的標誌位
    int step; //存儲步長,step=successes*total_per_image;
    int successes=0; //存儲成功找到標定板上所有角點的圖像幀數
    int a=1; //臨時變量,表示在操作第a幀圖像
const int NImages = 7;//圖片總數


CvMat *rotation_vectors;
    CvMat *translation_vectors;
    CvPoint2D32f * image_points_buf = new CvPoint2D32f[total_per_image]; //存儲角點圖像座標的數組
    CvMat * image_points=cvCreateMat(NImages*total_per_image,2,CV_32FC1);//存儲角點的圖像座標的矩陣
    CvMat * object_points=cvCreateMat(NImages*total_per_image,3,CV_32FC1);//存儲角點的三維座標的矩陣
    CvMat * point_counts=cvCreateMat(NImages,1,CV_32SC1);//存儲每幀圖像的識別的角點數
    CvMat * intrinsic_matrix=cvCreateMat(3,3,CV_32FC1);//內參數矩陣
    CvMat * distortion_coeffs=cvCreateMat(5,1,CV_32FC1);//畸變係數
    rotation_vectors = cvCreateMat(NImages,3,CV_32FC1);//旋轉矩陣
    translation_vectors = cvCreateMat(NImages,3,CV_32FC1);//平移矩陣
ifstream fin("calibdata1.txt"); /* 定標所用圖像文件的路徑 */


    while(a<=number_image_copy)
    {
        //sprintf_s (filename,"%d.jpg",a);
string filename;
getline(fin,filename);
        show=cvLoadImage(filename.c_str(),1);
        //尋找棋盤圖的內角點位置
        found=cvFindChessboardCorners(show,board_size,image_points_buf,&count,
        CV_CALIB_CB_ADAPTIVE_THRESH|CV_CALIB_CB_FILTER_QUADS);


        if (found==0)
        { //如果沒找到標定板角點時
            cout<<"第"<<a<<"幀圖片無法找到棋盤格所有角點!\n\n";
fout<<"第"<<a<<"幀圖片無法找到棋盤格所有角點!\n\n";
            cvNamedWindow("RePlay",1);
            cvShowImage("RePlay",show);
            cvWaitKey(2000);


        }
        else
        { //找到標定板角點時
            cout<<"第"<<a<<"幀圖像成功獲得"<<count<<"個角點...\n";
fout<<"第"<<a<<"幀圖像成功獲得"<<count<<"個角點...\n";
            cvNamedWindow("RePlay",1);
            IplImage * gray_image= cvCreateImage(cvGetSize(show),8,1);
            cvCvtColor(show,gray_image,CV_BGR2GRAY);
            cout<<"獲取源圖像灰度圖過程完成...\n";
fout<<"獲取源圖像灰度圖過程完成...\n";


            cvFindCornerSubPix(gray_image,image_points_buf,count,cvSize(11,11),cvSize(-1,-1),
            cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,30,0.1));
            cout<<"灰度圖亞像素化過程完成...\n";
fout<<"灰度圖亞像素化過程完成...\n";
            cvDrawChessboardCorners(show,board_size,image_points_buf,count,found);
            cout<<"在源圖像上繪製角點過程完成...\n\n";
fout<<"在源圖像上繪製角點過程完成...\n\n";
            cvShowImage("RePlay",show);
            cvWaitKey(500);
        }


        if(total_per_image==count)
        {
            step=successes*total_per_image; //計算存儲相應座標數據的步長
            for(int i=step,j=0;j<total_per_image;++i,++j)
            {
                CV_MAT_ELEM(*image_points, float,i,0)=image_points_buf[j].x;
                CV_MAT_ELEM(*image_points, float,i,1)=image_points_buf[j].y;
                CV_MAT_ELEM(*object_points,float,i,0)=(float)((j/board_width)*square_length);
                CV_MAT_ELEM(*object_points,float,i,1)=(float)((j%board_width)*square_height);
                CV_MAT_ELEM(*object_points,float,i,2)=0.0f;
            }
            CV_MAT_ELEM(*point_counts,int,successes,0)=total_per_image;
            successes++;
        }
cout<<"hahahahh======"<<a<<endl;
fout<<"hahahahh======"<<a<<endl;
        a++;
    }


    cvReleaseImage(&show);
    cvDestroyWindow("RePlay");




    cout<<"*********************************************\n";
fout<<"*********************************************\n";
    cout<<NImages<<"幀圖片中,標定成功的圖片爲"<<successes<<"幀...\n";
fout<<NImages<<"幀圖片中,標定成功的圖片爲"<<successes<<"幀...\n";
    cout<<NImages<<"幀圖片中,標定失敗的圖片爲"<<NImages-successes<<"幀...\n\n";
fout<<NImages<<"幀圖片中,標定失敗的圖片爲"<<NImages-successes<<"幀...\n\n";
    cout<<"*********************************************\n\n";
fout<<"*********************************************\n\n";


    cout<<"按任意鍵開始計算攝像機內參數...\n\n";
fout<<"按任意鍵開始計算攝像機內參數...\n\n";




    /*CvCapture* capture1;
    capture1 = cvCreateCameraCapture(0);*/
    IplImage * show_colie;
    show_colie = cvLoadImage("F:\\graduatelunwen\\opencvprojects\\june\\opecv_ransac_sift_cameraCalibration\\dinggao_wanchengban_sift_ransac\\left_43.jpg",1);




    CvMat * object_points2 = cvCreateMat(successes*total_per_image,3,CV_32FC1);
    CvMat * image_points2  = cvCreateMat(successes*total_per_image,2,CV_32FC1);
    CvMat * point_counts2  = cvCreateMat(successes,1,CV_32SC1);




    for(int i=0;i<successes*total_per_image;++i)
    {
        CV_MAT_ELEM(*image_points2, float,i,0)=CV_MAT_ELEM(*image_points, float,i,0);
        CV_MAT_ELEM(*image_points2, float,i,1)=CV_MAT_ELEM(*image_points, float,i,1);
        CV_MAT_ELEM(*object_points2,float,i,0)=CV_MAT_ELEM(*object_points,float,i,0);
        CV_MAT_ELEM(*object_points2,float,i,1)=CV_MAT_ELEM(*object_points,float,i,1);
        CV_MAT_ELEM(*object_points2,float,i,2)=CV_MAT_ELEM(*object_points,float,i,2);
    }


    for(int i=0;i<successes;++i)
    {
        CV_MAT_ELEM(*point_counts2,int,i,0) = CV_MAT_ELEM(*point_counts,int,i,0);
    }




    cvReleaseMat(&object_points);
    cvReleaseMat(&image_points);
    cvReleaseMat(&point_counts);




    CV_MAT_ELEM(*intrinsic_matrix,float,0,0)=1.0f;
    CV_MAT_ELEM(*intrinsic_matrix,float,1,1)=1.0f;



    cvCalibrateCamera2(object_points2,image_points2,point_counts2,cvGetSize(show_colie),
    intrinsic_matrix,distortion_coeffs,rotation_vectors,translation_vectors,0);


    cout<<"攝像機內參數矩陣爲:\n";
fout<<"攝像機內參數矩陣爲:\n";
    cout<<CV_MAT_ELEM(*intrinsic_matrix,float,0,0)<<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,0,1)
    <<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,0,2)
    <<"\n\n";
    cout<<CV_MAT_ELEM(*intrinsic_matrix,float,1,0)<<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,1,1)
    <<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,1,2)
    <<"\n\n";
    cout<<CV_MAT_ELEM(*intrinsic_matrix,float,2,0)<<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,2,1)
    <<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,2,2)
    <<"\n\n";


fout<<CV_MAT_ELEM(*intrinsic_matrix,float,0,0)<<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,0,1)
    <<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,0,2)
    <<"\n\n";
    fout<<CV_MAT_ELEM(*intrinsic_matrix,float,1,0)<<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,1,1)
    <<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,1,2)
    <<"\n\n";
    fout<<CV_MAT_ELEM(*intrinsic_matrix,float,2,0)<<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,2,1)
    <<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,2,2)
    <<"\n\n";


f_left[0]=CV_MAT_ELEM(*intrinsic_matrix,float,0,0);
f_left[1]=CV_MAT_ELEM(*intrinsic_matrix,float,1,1);




    cout<<"畸變係數矩陣爲:\n";
    cout<<CV_MAT_ELEM(*distortion_coeffs,float,0,0)<<" "<<CV_MAT_ELEM(*distortion_coeffs,float,1,0)
    <<" "<<CV_MAT_ELEM(*distortion_coeffs,float,2,0)
    <<" "<<CV_MAT_ELEM(*distortion_coeffs,float,3,0)
    <<" "<<CV_MAT_ELEM(*distortion_coeffs,float,4,0)
    <<"\n\n";


fout<<"畸變係數矩陣爲:\n";
    fout<<CV_MAT_ELEM(*distortion_coeffs,float,0,0)<<" "<<CV_MAT_ELEM(*distortion_coeffs,float,1,0)
    <<" "<<CV_MAT_ELEM(*distortion_coeffs,float,2,0)
    <<" "<<CV_MAT_ELEM(*distortion_coeffs,float,3,0)
    <<" "<<CV_MAT_ELEM(*distortion_coeffs,float,4,0)
    <<"\n\n";


    cvSave("Intrinsics.xml",intrinsic_matrix);
    cvSave("Distortion.xml",distortion_coeffs);


    cout<<"攝像機矩陣、畸變係數向量已經分別存儲在名爲Intrinsics.xml、Distortion.xml文檔中\n\n";
    fout<<"攝像機矩陣、畸變係數向量已經分別存儲在名爲Intrinsics.xml、Distortion.xml文檔中\n\n";


for(int ii = 0; ii < NImages; ++ii)
{ float tranv[3] = {0.0};
float rotv[3] = {0.0};


for ( int i = 0; i < 3; i++)
{
tranv[i] = ((float*)(translation_vectors->data.ptr+ii*translation_vectors->step))[i];
rotv[i] = ((float*)(rotation_vectors->data.ptr+rotation_vectors->step))[i];
}

cout << "第" << ii+1 << "幅圖的外參數" << endl;
fout << "第" << ii+1 << "幅圖的外參數" << endl;
printf("ROTATION VECTOR 旋轉向量 : \n");
printf("[ %6.4f %6.4f %6.4f ] \n", rotv[0], rotv[1], rotv[2]);
printf("TRANSLATION VECTOR 平移向量: \n");
printf("[ %6.4f %6.4f %6.4f ] \n", tranv[0], tranv[1], tranv[2]);
printf("-----------------------------------------\n");


fout<<"ROTATION VECTOR 旋轉向量 : \n"<<endl;
fout<< rotv[0]<<"  "<< rotv[1]<<"  "<< rotv[2]<<endl;
fout<<"TRANSLATION VECTOR 平移向量: \n"<<endl;
fout<< tranv[0]<<"  "<< tranv[1]<< "  "<<tranv[2]<<endl;
fout<<"-----------------------------------------\n"<<endl;
}
    CvMat * intrinsic=(CvMat *)cvLoad("Intrinsics.xml");
    CvMat * distortion=(CvMat *)cvLoad("Distortion.xml");


    IplImage * mapx=cvCreateImage(cvGetSize(show_colie),IPL_DEPTH_32F,1);
    IplImage * mapy=cvCreateImage(cvGetSize(show_colie),IPL_DEPTH_32F,1);


    cvInitUndistortMap(intrinsic,distortion,mapx,mapy);


    cvNamedWindow("原始圖像",1);
    cvNamedWindow("非畸變圖像",1);


   // cout<<"按‘E’鍵退出顯示...\n\n";


    /*while(show_colie)
    {*/
        IplImage * clone=cvCloneImage(show_colie);
        cvShowImage("原始圖像",show_colie);
        cvRemap(clone,show_colie,mapx,mapy);
        cvReleaseImage(&clone);
        cvShowImage("非畸變圖像",show_colie);
cvWaitKey(500);
        /*if(cvWaitKey(10)=='e')
        {
            break;
        }*/


        /*show_colie=cvQueryFrame(capture1);
    }*/




/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////                                                        //////////////////////////////////////////////
//////////                右攝像機標定                       //////////////////////////////////////////////                                
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    IplImage * showR; //RePlay圖像指針
    cvNamedWindow("RePlayR",1);
    int number_image_copyR=7; //複製圖像幀數
    CvSize board_sizeR=cvSize(9,6); //標定板角點數
    CvSize2D32f square_sizeR=cvSize2D32f(10,10);  //假設我的每個標定方格長寬都是1.82釐米
    float square_lengthR=square_sizeR.width;  //方格長度
    float square_heightR=square_sizeR.height;  //方格高度
    int board_widthR=board_sizeR.width; //每行角點數
    int board_heightR=board_sizeR.height; //每列角點數
    int total_per_imageR=board_widthR*board_heightR; //每張圖片角點總數
    int countR; //存儲每幀圖像中實際識別的角點數
    int foundR; //識別標定板角點的標誌位
    int stepR; //存儲步長,stepR=successesR*total_per_imageR;
    int successesR=0; //存儲成功找到標定板上所有角點的圖像幀數
    int aR=1; //臨時變量,表示在操作第a幀圖像
const int NImagesR = 7;//圖片總數


CvMat *rotation_vectorsR;
    CvMat *translation_vectorsR;
    CvPoint2D32f * image_pointsR_bufR = new CvPoint2D32f[total_per_imageR]; //存儲角點圖像座標的數組
    CvMat * image_pointsR=cvCreateMat(NImagesR*total_per_imageR,2,CV_32FC1);//存儲角點的圖像座標的矩陣
    CvMat * object_pointsR=cvCreateMat(NImagesR*total_per_imageR,3,CV_32FC1);//存儲角點的三維座標的矩陣
    CvMat * point_countRsR=cvCreateMat(NImagesR,1,CV_32SC1);//存儲每幀圖像的識別的角點數
    CvMat * intrinsicR_matrixR=cvCreateMat(3,3,CV_32FC1);//內參數矩陣
    CvMat * distortionR_coeffsR=cvCreateMat(5,1,CV_32FC1);//畸變係數
    rotation_vectorsR = cvCreateMat(NImagesR,3,CV_32FC1);//旋轉矩陣
    translation_vectorsR = cvCreateMat(NImagesR,3,CV_32FC1);//平移矩陣
ifstream finR("calibdata2.txt"); /* 定標所用圖像文件的路徑 */


    while(aR<=number_image_copyR)
    {
        //sprintf_s (filename,"%d.jpg",a);
string filenameR;
getline(finR,filenameR);
        showR=cvLoadImage(filenameR.c_str(),1);
        //尋找棋盤圖的內角點位置
        foundR=cvFindChessboardCorners(showR,board_sizeR,image_pointsR_bufR,&countR,
        CV_CALIB_CB_ADAPTIVE_THRESH|CV_CALIB_CB_FILTER_QUADS);


        if (foundR==0)
        { //如果沒找到標定板角點時
            cout<<"第"<<aR<<"幀圖片無法找到棋盤格所有角點!\n\n";
fout<<"第"<<aR<<"幀圖片無法找到棋盤格所有角點!\n\n";
            cvNamedWindow("RePlayR",1);
            cvShowImage("RePlayR",showR);
            cvWaitKey(500);


        }
        else
        { //找到標定板角點時
            cout<<"第"<<aR<<"幀圖像成功獲得"<<countR<<"個角點...\n";
fout<<"第"<<aR<<"幀圖像成功獲得"<<countR<<"個角點...\n";
            cvNamedWindow("RePlayR",1);
            IplImage * gray_imageR= cvCreateImage(cvGetSize(showR),8,1);
            cvCvtColor(showR,gray_imageR,CV_BGR2GRAY);
            cout<<"獲取源圖像灰度圖過程完成...\n";
fout<<"獲取源圖像灰度圖過程完成...\n";


            cvFindCornerSubPix(gray_imageR,image_pointsR_bufR,countR,cvSize(11,11),cvSize(-1,-1),
            cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,30,0.1));
            cout<<"灰度圖亞像素化過程完成...\n";
fout<<"灰度圖亞像素化過程完成...\n";
            cvDrawChessboardCorners(showR,board_sizeR,image_pointsR_bufR,countR,foundR);
            cout<<"在源圖像上繪製角點過程完成...\n\n";
fout<<"在源圖像上繪製角點過程完成...\n\n";
            cvShowImage("RePlayR",showR);
            cvWaitKey(500);
        }


        if(total_per_imageR==countR)
        {
            stepR=successesR*total_per_imageR; //計算存儲相應座標數據的步長
            for(int i=stepR,j=0;j<total_per_imageR;++i,++j)
            {
                CV_MAT_ELEM(*image_pointsR, float,i,0)=image_pointsR_bufR[j].x;
                CV_MAT_ELEM(*image_pointsR, float,i,1)=image_pointsR_bufR[j].y;
                CV_MAT_ELEM(*object_pointsR,float,i,0)=(float)((j/board_widthR)*square_lengthR);
                CV_MAT_ELEM(*object_pointsR,float,i,1)=(float)((j%board_widthR)*square_heightR);
                CV_MAT_ELEM(*object_pointsR,float,i,2)=0.0f;
            }
            CV_MAT_ELEM(*point_countRsR,int,successesR,0)=total_per_imageR;
            successesR++;
        }
cout<<"hahahahh======"<<aR<<endl;
fout<<"hahahahh======"<<aR<<endl;
        aR++;
    }


    cvReleaseImage(&showR);
    cvDestroyWindow("RePlayR");




    cout<<"*********************************************\n";
    cout<<NImagesR<<"幀圖片中,標定成功的圖片爲"<<successesR<<"幀...\n";
    cout<<NImagesR<<"幀圖片中,標定失敗的圖片爲"<<NImagesR-successesR<<"幀...\n\n";
    cout<<"*********************************************\n\n";


    cout<<"按任意鍵開始計算攝像機內參數...\n\n";


fout<<"*********************************************\n";
    fout<<NImagesR<<"幀圖片中,標定成功的圖片爲"<<successesR<<"幀...\n";
    fout<<NImagesR<<"幀圖片中,標定失敗的圖片爲"<<NImagesR-successesR<<"幀...\n\n";
    fout<<"*********************************************\n\n";


    fout<<"按任意鍵開始計算攝像機內參數...\n\n";




    /*CvCapture* capture1;
    capture1 = cvCreateCameraCapture(0);*/
    IplImage * showR_colieR;
    showR_colieR = cvLoadImage("F:\\graduatelunwen\\opencvprojects\\june\\opecv_ransac_sift_cameraCalibration\\dinggao_wanchengban_sift_ransac\\right_43.jpg",1);




    CvMat * object_pointsR2R = cvCreateMat(successesR*total_per_imageR,3,CV_32FC1);
    CvMat * image_pointsR2R  = cvCreateMat(successesR*total_per_imageR,2,CV_32FC1);
    CvMat * point_countRsR2R  = cvCreateMat(successesR,1,CV_32SC1);




    for(int i=0;i<successesR*total_per_imageR;++i)
    {
        CV_MAT_ELEM(*image_pointsR2R, float,i,0)=CV_MAT_ELEM(*image_pointsR, float,i,0);
        CV_MAT_ELEM(*image_pointsR2R, float,i,1)=CV_MAT_ELEM(*image_pointsR, float,i,1);
        CV_MAT_ELEM(*object_pointsR2R,float,i,0)=CV_MAT_ELEM(*object_pointsR,float,i,0);
        CV_MAT_ELEM(*object_pointsR2R,float,i,1)=CV_MAT_ELEM(*object_pointsR,float,i,1);
        CV_MAT_ELEM(*object_pointsR2R,float,i,2)=CV_MAT_ELEM(*object_pointsR,float,i,2);
    }


    for(int i=0;i<successesR;++i)
    {
        CV_MAT_ELEM(*point_countRsR2R,int,i,0) = CV_MAT_ELEM(*point_countRsR,int,i,0);
    }




    cvReleaseMat(&object_pointsR);
    cvReleaseMat(&image_pointsR);
    cvReleaseMat(&point_countRsR);




    CV_MAT_ELEM(*intrinsicR_matrixR,float,0,0)=1.0f;
    CV_MAT_ELEM(*intrinsicR_matrixR,float,1,1)=1.0f;



    cvCalibrateCamera2(object_pointsR2R,image_pointsR2R,point_countRsR2R,cvGetSize(showR_colieR),
    intrinsicR_matrixR,distortionR_coeffsR,rotation_vectorsR,translation_vectorsR,0);


    cout<<"攝像機內參數矩陣爲:\n";
    cout<<CV_MAT_ELEM(*intrinsicR_matrixR,float,0,0)<<" "<<CV_MAT_ELEM(*intrinsicR_matrixR,float,0,1)
    <<" "<<CV_MAT_ELEM(*intrinsicR_matrixR,float,0,2)
    <<"\n\n";
    cout<<CV_MAT_ELEM(*intrinsicR_matrixR,float,1,0)<<" "<<CV_MAT_ELEM(*intrinsicR_matrixR,float,1,1)
    <<" "<<CV_MAT_ELEM(*intrinsicR_matrixR,float,1,2)
    <<"\n\n";
    cout<<CV_MAT_ELEM(*intrinsicR_matrixR,float,2,0)<<" "<<CV_MAT_ELEM(*intrinsicR_matrixR,float,2,1)
    <<" "<<CV_MAT_ELEM(*intrinsicR_matrixR,float,2,2)
    <<"\n\n";


fout<<"攝像機內參數矩陣爲:\n";
    fout<<CV_MAT_ELEM(*intrinsicR_matrixR,float,0,0)<<" "<<CV_MAT_ELEM(*intrinsicR_matrixR,float,0,1)
    <<" "<<CV_MAT_ELEM(*intrinsicR_matrixR,float,0,2)
    <<"\n\n";
    fout<<CV_MAT_ELEM(*intrinsicR_matrixR,float,1,0)<<" "<<CV_MAT_ELEM(*intrinsicR_matrixR,float,1,1)
    <<" "<<CV_MAT_ELEM(*intrinsicR_matrixR,float,1,2)
    <<"\n\n";
    fout<<CV_MAT_ELEM(*intrinsicR_matrixR,float,2,0)<<" "<<CV_MAT_ELEM(*intrinsicR_matrixR,float,2,1)
    <<" "<<CV_MAT_ELEM(*intrinsicR_matrixR,float,2,2)
    <<"\n\n";


f_right[0]=CV_MAT_ELEM(*intrinsicR_matrixR,float,0,0);
f_right[1]=CV_MAT_ELEM(*intrinsicR_matrixR,float,1,1);


    cout<<"畸變係數矩陣爲:\n";
    cout<<CV_MAT_ELEM(*distortionR_coeffsR,float,0,0)<<" "<<CV_MAT_ELEM(*distortionR_coeffsR,float,1,0)
    <<" "<<CV_MAT_ELEM(*distortionR_coeffsR,float,2,0)
    <<" "<<CV_MAT_ELEM(*distortionR_coeffsR,float,3,0)
    <<" "<<CV_MAT_ELEM(*distortionR_coeffsR,float,4,0)
    <<"\n\n";


fout<<"畸變係數矩陣爲:\n";
    fout<<CV_MAT_ELEM(*distortionR_coeffsR,float,0,0)<<" "<<CV_MAT_ELEM(*distortionR_coeffsR,float,1,0)
    <<" "<<CV_MAT_ELEM(*distortionR_coeffsR,float,2,0)
    <<" "<<CV_MAT_ELEM(*distortionR_coeffsR,float,3,0)
    <<" "<<CV_MAT_ELEM(*distortionR_coeffsR,float,4,0)
    <<"\n\n";


    cvSave("intrinsicRs.xml",intrinsicR_matrixR);
    cvSave("distortionR.xml",distortionR_coeffsR);


    cout<<"攝像機矩陣、畸變係數向量已經分別存儲在名爲intrinsicRs.xml、distortionR.xml文檔中\n\n";
fout<<"攝像機矩陣、畸變係數向量已經分別存儲在名爲intrinsicRs.xml、distortionR.xml文檔中\n\n";
for(int ii = 0; ii < NImagesR; ++ii)
{ float tranvR[3] = {0.0};
float rotvR[3] = {0.0};


for ( int i = 0; i < 3; i++)
{
tranvR[i] = ((float*)(translation_vectorsR->data.ptr+ii*translation_vectorsR->step))[i];
rotvR[i] = ((float*)(rotation_vectorsR->data.ptr+rotation_vectorsR->step))[i];
}

cout << "第" << ii+1 << "幅圖的外參數" << endl;
printf("ROTATION VECTOR 旋轉向量 : \n");
printf("[ %6.4f %6.4f %6.4f ] \n", rotvR[0], rotvR[1], rotvR[2]);
printf("TRANSLATION VECTOR 平移向量: \n");
printf("[ %6.4f %6.4f %6.4f ] \n", tranvR[0], tranvR[1], tranvR[2]);
printf("-----------------------------------------\n");


fout << "第" << ii+1 << "幅圖的外參數" << endl;
fout<<"ROTATION VECTOR 旋轉向量 : \n";
fout<<"[ %6.4f %6.4f %6.4f ] \n"<<rotvR[0]<<"  "<< rotvR[1]<<"  "<< rotvR[2]<<endl;
fout<<"TRANSLATION VECTOR 平移向量: \n";
fout<<"[ %6.4f %6.4f %6.4f ] \n"<< tranvR[0]<<"  "<< tranvR[1]<<"  "<< tranvR[2]<<endl;
fout<<"-----------------------------------------\n";


}
    CvMat * intrinsicR=(CvMat *)cvLoad("intrinsicRs.xml");
    CvMat * distortionR=(CvMat *)cvLoad("distortionR.xml");


    IplImage * mapxR=cvCreateImage(cvGetSize(showR_colieR),IPL_DEPTH_32F,1);
    IplImage * mapyR=cvCreateImage(cvGetSize(showR_colieR),IPL_DEPTH_32F,1);


    cvInitUndistortMap(intrinsicR,distortionR,mapxR,mapyR);


    cvNamedWindow("原始圖像右",1);
    cvNamedWindow("非畸變圖像右",1);


   // cout<<"按‘E’鍵退出顯示...\n\n";


    /*while(showR_colieR)
    {*/
        IplImage * cloneR=cvCloneImage(showR_colieR);
        cvShowImage("原始圖像右",showR_colieR);
        cvRemap(cloneR,showR_colieR,mapxR,mapyR);
        cvReleaseImage(&cloneR);
        cvShowImage("非畸變圖像右",showR_colieR);
cvWaitKey(500);
        /*if(cvWaitKey(10)=='e')
        {
            break;
        }*/


        /*showR_colieR=cvQueryFrame(capture1);
    }*/
time_t start=0,end=0;
int i,j,k;
int max=-1;
float hh[8];
start=time(0);
float para[8][9];
float h[8];
//CvCapture* cap1;
//CvCapture* cap2;
//Mat input11,input22;
//cap1=cvCreateCameraCapture(0);
//cap2=cvCreateCameraCapture(1);
/*while(1)
{
input11=cvQueryFrame(cap1);
input22=cvQueryFrame(cap2);


namedWindow("Camera_1",1);
imshow("Camera_1",input11);
namedWindow("Camera_2",1);
imshow("Camera_2",input22);
*/
Mat input11,input22;
//Mat input11=imread("123.jpg",1);
//Mat input22=imread("124.jpg",1);
//Mat input11(show_colie);
//Mat input22(showR_colieR);
Mat input1,input2;
input11=imread("left_2.jpg",1);
input22=imread("right_2.jpg",1);
cvtColor(input11,input1,CV_RGB2GRAY,1);
cvtColor(input22,input2,CV_RGB2GRAY,1);
imwrite("left_2heibei.jpg",input1);
imwrite("right_2heibai.jpg",input2);
SiftFeatureDetector detector;
vector<KeyPoint> keypoint1,keypoint2;
detector.detect(input1,keypoint1);


Mat output1;
drawKeypoints(input1,keypoint1,output1);
imshow("sift_result1.png",output1);
imwrite("sift_result1.png",output1);


Mat output2;
SiftDescriptorExtractor extractor;
Mat descriptor1,descriptor2;
BruteForceMatcher<L2<float>> matcher;


vector<DMatch> matches;
Mat img_matches;
detector.detect(input2,keypoint2);
drawKeypoints(input2,keypoint2,output2);
imshow("sift_result2.png",output2);
imwrite("sift_result2.png",output2);


extractor.compute(input1,keypoint1,descriptor1);
extractor.compute(input2,keypoint2,descriptor2);


matcher.match(descriptor1,descriptor2,matches);


drawMatches(input1,keypoint1,input2,keypoint2,matches,img_matches);
imshow("matches",img_matches);
imwrite("matches.png",img_matches);
//分配空間
int pointcount=(int)matches.size();
Mat point1(pointcount,2,CV_32F);
Mat point2(pointcount,2,CV_32F);
//把Keypoint轉換爲Mat
Point2f point;
for (i=0;i<pointcount;i++)
{
point=keypoint1[matches[i].queryIdx].pt;
point1.at<float>(i,0)=point.x;
point1.at<float>(i,1)=point.y;


point=keypoint2[matches[i].trainIdx].pt;
point2.at<float>(i,0)=point.x;
point2.at<float>(i,1)=point.y;
}
//用RANSAC方法計算F
Mat m_fundamental;
vector<uchar> m_ransacstatus;


m_fundamental=findFundamentalMat(point1,point2,m_ransacstatus,FM_RANSAC);
/*
float hhh[9];
for(i=0;i<9;i++)
hhh[i]=0;
for(i=0;i<3;i++)
{
for (j=0;j<3;j++)
{
hhh[i*3+j]=m_fundamental.ptr<float>(i)[j];
}
}
*/
//計算外點個數
int outlinercount=0;
for(i=0;i<pointcount;i++)
{
if(m_ransacstatus[i]==0)//動態爲0表示外點
{
outlinercount++;
}
}
//計算內點
vector<Point2f> m_leftinliner;
vector<Point2f> m_rightinliner;
vector<DMatch> m_inlinermatches;
//上面三個變量用於保存內點和匹配關係
int inlinercount=pointcount-outlinercount;
m_inlinermatches.resize(inlinercount);
m_leftinliner.resize(inlinercount);
m_rightinliner.resize(inlinercount);


inlinercount=0;
for(i=0;i<pointcount;i++)
{
if(m_ransacstatus[i]!=0)
{
m_leftinliner[inlinercount].x=point1.at<float>(i,0);
m_leftinliner[inlinercount].y=point1.at<float>(i,1);
m_rightinliner[inlinercount].x=point2.at<float>(i,0);
m_rightinliner[inlinercount].y=point2.at<float>(i,1);
m_inlinermatches[inlinercount].queryIdx=inlinercount;
m_inlinermatches[inlinercount].trainIdx=inlinercount;
inlinercount++;
}
}
//把內點轉換爲drawMatches可以使用的格式
vector<KeyPoint> key1(inlinercount);
vector<KeyPoint> key2(inlinercount);
KeyPoint::convert(m_leftinliner,key1);
KeyPoint::convert(m_rightinliner,key2);
//顯示計算F過後的內點匹配

Mat outimage;

drawMatches(input11,key1,input22,key2,m_inlinermatches,outimage);
// namedWindow("Match features");
imshow("Match feature",outimage);
imwrite("提純後的.jpg",outimage);
vector<KeyPoint> ransac1,ransac2;
vector<KeyPoint> left,right;
vector<int> tichunyihou;
int counter=0;
int counterdidi=0;
srand(unsigned(time(0)));
int counterwo;
int *countergege;
countergege=new int[inlinercount];
int * zuizhong=new int[inlinercount];
for(i=0;i<inlinercount;i++)
{
zuizhong[i]=0;
}
left.clear();
right.clear();


while(counter<250)
{
counterwo=0;
for(i=0;i<inlinercount;i++)
{
countergege[i]=0;
}

counterdidi++;
ransac1.clear();
ransac2.clear();


int temp[4];
for (i=0;i<4;i++)
temp[i]=rand()%inlinercount;
int gibal=0;


for (i=0;i<3;i++)
{
for (j=i+1;j<4;j++)
{
if (temp[i]==temp[j])
{
gibal=1;
break;
}
}
}
if(gibal==1)
continue;
int a,b;
float tan1=0,tan2=0;
for(i=0;i<3;i++)
{
j=i+1;
a=(j-1+4)%4;
b=(j+1+4)%4;
tan1=(key1[m_inlinermatches[j].queryIdx].pt.y-key1[m_inlinermatches[a].queryIdx].pt.y)
/(key1[m_inlinermatches[j].queryIdx].pt.x-key1[m_inlinermatches[a].queryIdx].pt.x);
tan2=(key1[m_inlinermatches[j].queryIdx].pt.y-key1[m_inlinermatches[b].queryIdx].pt.y)
/(key1[m_inlinermatches[j].queryIdx].pt.x-key1[m_inlinermatches[b].queryIdx].pt.x);


if(abs(tan1/tan2-1)<=0.05)
gibal=2;

}
if (gibal==2)
continue;


for (i=0;i<4;i++)
{
cout<<temp[i]<<"  ";
fout<<temp[i]<<"  ";
}
cout<<endl;
fout<<endl;
if(gibal==1)
continue;

for(j=0;j<4;j++)
{ 
ransac1.push_back(key1[m_inlinermatches[temp[j]].queryIdx]);
ransac2.push_back(key2[m_inlinermatches[temp[j]].trainIdx]);
}
if(ransac1.empty() || ransac2.empty())
{
cout<<"隨機抽出四個特徵點匹配對失敗,請重試"<<endl;
fout<<"隨機抽出四個特徵點匹配對失敗,請重試"<<endl;
continue;
}
//求透視矩陣

for(i=0;i<8;i++)
h[i]=0.0;
for (i=0;i<=7;i++)
{
for (j=0;j<=8;j++)
{
para[i][j]=0;
}
}


for (i=0;i<=2;i++)
{
para[i][2]=1;
para[i+3][5]=1;
para[i][0]=ransac1[i].pt.x;
para[i][1]=ransac1[i].pt.y;
para[i+3][3]=ransac1[i].pt.x;
para[i+3][4]=ransac1[i].pt.y;
para[i][6]=-ransac1[i].pt.x*ransac2[i].pt.x;
para[i][7]=-ransac1[i].pt.y*ransac2[i].pt.x;
para[i][8]=ransac2[i].pt.x;
para[i+3][6]=-ransac1[i].pt.x*ransac2[i].pt.y;
para[i+3][7]=-ransac1[i].pt.y*ransac2[i].pt.y;
para[i+3][8]=ransac2[i].pt.y;
}
para[6][2]=1;
para[7][5]=1;
para[6][0]=ransac1[3].pt.x;
para[6][1]=ransac1[3].pt.y;
para[7][3]=ransac1[3].pt.x;
para[7][4]=ransac1[3].pt.y;
para[6][6]=-ransac1[3].pt.x*ransac2[3].pt.y;
para[6][7]=-ransac1[3].pt.y*ransac2[3].pt.x;
para[6][8]=ransac2[3].pt.x;
para[7][6]=-ransac1[3].pt.x*ransac2[3].pt.y;
para[7][7]=-ransac1[3].pt.y*ransac2[3].pt.y;
para[7][8]=ransac2[3].pt.y;


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//建立完擴展矩陣,求出透視矩陣的參數:透視矩陣參數估值

for (int g=0;g<8;g++)//初始化
h[g]=0.0;
for (i=0;i<8;i++)
{
float temper1=para[i][i];
if (para[i][i]!=0)
{
for (int j=i+1;j<8;j++)
{
float temper2=para[j][i];
if (para[j][i]!=0)
{ 
for (int k=i;k<9;k++)
{
para[j][k]=para[i][k]-para[j][k]*para[i][i]/temper2;
}
}
else continue;

}
for (int r=i;r<9;r++)
para[i][r]/=temper1;
}
else continue;
} 


for (i=0;i<=7;i++)
h[i]=para[i][8];
for (j=7;j>=0;j--)
{
for (int k=0;k<7-j;k++)
{
h[j]-=h[7-k]*para[j][7-k];
}
}

//計算出每個透視矩陣所滿足的內點數
float xx,yy;
float juli;
int ok=0;

for(i=0;i<inlinercount;i++)
{
xx=0;yy=0;
xx=h[0]*key1[m_inlinermatches[i].queryIdx].pt.x+h[1]*key1[m_inlinermatches[i].queryIdx].pt.y+h[2];
yy=h[3]*key1[m_inlinermatches[i].queryIdx].pt.x+h[4]*key1[m_inlinermatches[i].queryIdx].pt.y+h[5];


juli=sqrt(pow((xx-key2[m_inlinermatches[i].trainIdx].pt.x),2)+pow((yy-key2[m_inlinermatches[i].trainIdx].pt.y),2));
if (juli<2)
{

countergege[counterwo]=i;
counterwo++;
ok++;
}
}


if(ok>max)
{
max=ok;
for(k=0;k<8;k++)
hh[k]=h[k];
for(i=0;i<inlinercount;i++)
{
zuizhong[i]=countergege[i];
}
}

counter++;

}
for(i=0;i<8;i++)
{
cout<<hh[i]<<endl;
fout<<hh[i]<<endl;
}

for(i=0;i<max;i++)
{
left.push_back(key1[m_inlinermatches[zuizhong[i]].queryIdx]);
right.push_back(key2[m_inlinermatches[zuizhong[i]].trainIdx]);
}
cout<<"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"<<endl;
vector<DMatch> wanquantichun;
int haha=left.size();
wanquantichun.resize(haha);

for(i=0;i<haha;i++)
{
wanquantichun[i].queryIdx=i;
wanquantichun[i].trainIdx=i;
}
Mat outimagehaha;
float f=85;
float T=2000;
drawMatches(input11,left,input22,right,wanquantichun,outimagehaha);
float xl=0,xr=0;
float Z=430;
for(i=0;i<haha;i++)
{
Z=0;
if(key1[i].pt.x<428 && key1[i].pt.x>213 )
{
if(key2[i].pt.x<428 && key2[i].pt.x>213)
{
xl=abs(385-key1[i].pt.x);
xr=abs(282-key2[i].pt.x);


Z=abs(f*T/(xl+xr));
cout<<"距離爲=="<<Z<<endl;
fout<<"距離爲=="<<Z<<endl;
}
}
}

// namedWindow("Match features");
/*for(i=0;i<haha;i++)
{

if(left[i].pt.x<640 && left[i].pt.x>385 )
{
if(right[i].pt.x<282 && right[i].pt.x>0 )
{
xl=abs(385-key1[i].pt.x);
xr=abs(282-key2[i].pt.x);


//Z=abs(f*T/(xl-xr));
f=abs(Z*(xl+xr)/T);
cout<<"距離爲=="<<f<<endl;
fout<<"距離爲=="<<f<<endl;
}
}
}
*/
imshow("完全提純後  Match feature",outimagehaha);
imwrite("完全提純後的.jpg",outimagehaha);


float uxleft,uxright;
//uxleft=


//圖像配準
int xx1=input11.cols;
int yy1=input11.rows;
int xx2=input22.cols;
int yy2=input22.rows;
int garo=0;
int saero=0;
int yiweiX=1000,yiweiYmin=1000,yiweiYmax=-1000;
int xxx,yyy;
for(i=0;i<yy1;i++)
{
for (j=0;j<xx1;j++)
{
garo=int(j*hh[0]+i*hh[1]+hh[2]);
saero=int(j*hh[3]+i*hh[4]+hh[5]);
if(yiweiX>garo)
yiweiX=garo;
if(yiweiYmin>saero)
yiweiYmin=saero;
if(yiweiYmax<saero)
yiweiYmax=saero;
}
}

if(yiweiX>0)
yiweiX=0;

cout<<yiweiYmin<<"      "<<yiweiX<<"     "<<yiweiYmax<<endl;
fout<<yiweiYmin<<"      "<<yiweiX<<"     "<<yiweiYmax<<endl;


if(yiweiYmax>=yy2)
{
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^1111111111111111111111111
if(yiweiYmin<0)
{
cout<<"第一種情況"<<endl;
fout<<"第一種情況"<<endl;
Mat zuihoupeizhun(yiweiYmax-yiweiYmin,xx2-yiweiX,CV_8UC3,Scalar(0,0,0));
for(i=0;i<yy1;i++)
{
for(j=0;j<xx1;j++)
{
garo=int(j*hh[0]+i*hh[1]+hh[2]);
saero=int(j*hh[3]+i*hh[4]+hh[5]);
xxx=garo-yiweiX;
yyy=saero-yiweiYmin;
if (yyy>=0 && xxx>=0&&xxx<(xx2-yiweiX)&&yyy<(yiweiYmax-yiweiYmin))
{
zuihoupeizhun.at<Vec3b>(yyy,xxx)[0]=input11.at<Vec3b>(i,j)[0];
zuihoupeizhun.at<Vec3b>(yyy,xxx)[1]=input11.at<Vec3b>(i,j)[1];
zuihoupeizhun.at<Vec3b>(yyy,xxx)[2]=input11.at<Vec3b>(i,j)[2];
}
else 
continue;

} 
}
for (i=0;i<yy2;i++)
{
for (j=0;j<xx2;j++)
{
xxx=j-yiweiX;
yyy=i-yiweiYmin;
if (yyy>=0 && xxx>=0&&xxx<(xx2-yiweiX)&&yyy<(yiweiYmax-yiweiYmin))
{
zuihoupeizhun.at<Vec3b>(yyy,xxx)[0]=input22.at<Vec3b>(i,j)[0];
zuihoupeizhun.at<Vec3b>(yyy,xxx)[1]=input22.at<Vec3b>(i,j)[1];
zuihoupeizhun.at<Vec3b>(yyy,xxx)[2]=input22.at<Vec3b>(i,j)[2];
}
else
 continue;
}
}
namedWindow("src");
imshow("src",zuihoupeizhun);
imwrite("src.png",zuihoupeizhun);
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^222222222222222
else
{
cout<<"第二種情況"<<endl;
fout<<"第二種情況"<<endl;
Mat zuihoupeizhun(yiweiYmax,xx2-yiweiX,CV_8UC3,Scalar(0,0,0));
for(i=0;i<yy1;i++)
{
for(j=0;j<xx1;j++)
{
garo=int(j*hh[0]+i*hh[1]+hh[2]);
saero=int(j*hh[3]+i*hh[4]+hh[5]);
xxx=garo-yiweiX;
yyy=saero;
if (yyy>=0 && xxx>=0 && yyy<yiweiYmax && xxx<(xx2-yiweiX))
{
zuihoupeizhun.at<Vec3b>(yyy,xxx)[0]=input11.at<Vec3b>(i,j)[0];
zuihoupeizhun.at<Vec3b>(yyy,xxx)[1]=input11.at<Vec3b>(i,j)[1];
zuihoupeizhun.at<Vec3b>(yyy,xxx)[2]=input11.at<Vec3b>(i,j)[2];
}
else 
continue;

}

}
for (i=0;i<yy2;i++)
{
for (j=0;j<xx2;j++)
{
xxx=j-yiweiX;
yyy=i;
if (yyy>=0 && xxx>=0 && yyy<yiweiYmax && xxx<(xx2-yiweiX))
{
zuihoupeizhun.at<Vec3b>(yyy,xxx)[0]=input22.at<Vec3b>(i,j)[0];
zuihoupeizhun.at<Vec3b>(yyy,xxx)[1]=input22.at<Vec3b>(i,j)[1];
zuihoupeizhun.at<Vec3b>(yyy,xxx)[2]=input22.at<Vec3b>(i,j)[2];
}
else
 continue;
}
}
namedWindow("src");
imshow("src",zuihoupeizhun);
imwrite("src.png",zuihoupeizhun);
}
}
else
{
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^3333333333333333333333333333
if(yiweiYmin<0)
{
cout<<"第三種情況"<<endl;
fout<<"第三種情況"<<endl;
Mat zuihoupeizhun(yy2-yiweiYmin,xx2-yiweiX,CV_8UC3,Scalar(0,0,0));
for(i=0;i<yy1;i++)
{
for(j=0;j<xx1;j++)
{
garo=int(j*hh[0]+i*hh[1]+hh[2]);
saero=int(j*hh[3]+i*hh[4]+hh[5]);
xxx=garo-yiweiX;
yyy=saero-yiweiYmin;
if (yyy>=0 && xxx>=0 && yyy<(yy2-yiweiYmin) && xxx<(xx2-yiweiX))
{
zuihoupeizhun.at<Vec3b>(yyy,xxx)[0]=input11.at<Vec3b>(i,j)[0];
zuihoupeizhun.at<Vec3b>(yyy,xxx)[1]=input11.at<Vec3b>(i,j)[1];
zuihoupeizhun.at<Vec3b>(yyy,xxx)[2]=input11.at<Vec3b>(i,j)[2];
}
else 
continue;

} 
}
for (i=0;i<yy2;i++)
{
for (j=0;j<xx2;j++)
{
xxx=j-yiweiX;
yyy=i-yiweiYmin;
if (yyy>=0 && xxx>=0 && yyy<(yy2-yiweiYmin) && xxx<(xx2-yiweiX))
{
zuihoupeizhun.at<Vec3b>(yyy,xxx)[0]=input22.at<Vec3b>(i,j)[0];
zuihoupeizhun.at<Vec3b>(yyy,xxx)[1]=input22.at<Vec3b>(i,j)[1];
zuihoupeizhun.at<Vec3b>(yyy,xxx)[2]=input22.at<Vec3b>(i,j)[2];
}
else
 continue;
}
}
namedWindow("src");
imshow("src",zuihoupeizhun);
imwrite("src.png",zuihoupeizhun);
}
else
{
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^444444444444444444
cout<<"第四種情況"<<endl;
fout<<"第四種情況"<<endl;
Mat zuihoupeizhun(yy2,xx2-yiweiX,CV_8UC3,Scalar(0,0,0));
for(i=0;i<yy1;i++)
{
for(j=0;j<xx1;j++)
{
garo=int(j*hh[0]+i*hh[1]+hh[2]);
saero=int(j*hh[3]+i*hh[4]+hh[5]);
xxx=garo-yiweiX;
yyy=saero;
if (yyy>=0 && xxx>=0 && yyy<yy2 && xxx<(xx2-yiweiX))
{
zuihoupeizhun.at<Vec3b>(yyy,xxx)[0]=input11.at<Vec3b>(i,j)[0];
zuihoupeizhun.at<Vec3b>(yyy,xxx)[1]=input11.at<Vec3b>(i,j)[1];
zuihoupeizhun.at<Vec3b>(yyy,xxx)[2]=input11.at<Vec3b>(i,j)[2];
}
else 
continue;

} 
}
for (i=0;i<yy2;i++)
{
for (j=0;j<xx2;j++)
{
xxx=j-yiweiX;
yyy=i;
if (xxx>=0 && yyy>=0)
{
zuihoupeizhun.at<Vec3b>(yyy,xxx)[0]=input22.at<Vec3b>(i,j)[0];
zuihoupeizhun.at<Vec3b>(yyy,xxx)[1]=input22.at<Vec3b>(i,j)[1];
zuihoupeizhun.at<Vec3b>(yyy,xxx)[2]=input22.at<Vec3b>(i,j)[2];
}
else
 continue;
}
}
namedWindow("src");
imshow("src",zuihoupeizhun);
imwrite("src.jpg",zuihoupeizhun);
}
}

end=time(0);
cout<<"i love you"<<endl;
fout<<"i love you"<<endl;




cout<<"最後的max===="<<max<<endl;
fout<<"最後的max===="<<max<<endl;

end=time(0);
cout<<endl<<"總跑程序的時間爲:"<<end-start<<"秒"<<endl;
fout<<endl<<"總跑程序的時間爲:"<<end-start<<"秒"<<endl;
cout<<endl;fout<<endl;
cout<<"counter=="<<counter<<endl<<"counterdidi=="<<counterdidi<<endl;
fout<<"counter=="<<counter<<endl<<"counterdidi=="<<counterdidi<<endl;
waitKey(30000);
}

發佈了95 篇原創文章 · 獲贊 29 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章