2012-10-04 58 views
1

我有以下问题:一切正常,但是当我到达calibrateCamera部分我得到以下错误:OpenCV的错误:断言失败(NI> 0 && NI == NI1)

OpenCV Error: Assertion failed (ni > 0 && ni == ni1) in unknown function, file . .....\src\opencv\modules\calib3d\src\calibration.cpp, line 3197

我新的在这里,也许我的代码不够清晰,但请友好。 非常感谢您提前。

我的代码是:(我删除了包括和编译的部分,因为它得到了真正的大字母在这里)

int _tmain() 
{ 


printf("Everything loaded. Press Enter to continue.\n\a"); 


getch(); 

system("cls");        //bildschirm clearen 


int numBoards = 0; 
int numCornersHor; 
int numCornersVer; 
char stCurPath[200]; 
int numFiles = 0; 
char stRemFileNum[200]; 

int curNum; 

vector<string> file_names; 
string s; 
bool pathok = false; 

#pragma region ask user for path to load images and list them 

//             ask user for path to load images and list them      




while(pathok == false) 
{ 
fflush(stdin); 
printf("Enter path to the folder where the pictures are:\n"); 
scanf("%199[^\n]s", stCurPath); //achtung wegen bufferoverflow - nicht mehr als 199 zeichen + EOF (0) einlesen. 
           //[^\n] wegen Leerzeichen. scanf liest bis Enter. 
system("cls"); 

DIR *dir; 
struct dirent *ent; 
dir = opendir (stCurPath); 




if (dir != NULL) { 
/* print all the files and directories within directory */ 
    printf("Your chosen path:\n%s\n\nFiletree of this path:\n", stCurPath); 
    while ((ent = readdir (dir)) != NULL) 
    { 
     numFiles++; //Anzahl der Files 
     printf ("%d)\t%s\n",numFiles, ent->d_name); 
     s = ent->d_name; 
     file_names.push_back(s); 
    } 
    closedir (dir); 

    fflush(stdout); 
    printf ("\nNumber of found files: %d\n", numFiles); 

    pathok = true; 
} 
else 
{ 
    /* could not open directory */ 

    printf ("Could not open directory. Make sure path is ok!\n\n"); 
    pathok = false; 

    /*perror (""); 
    return EXIT_FAILURE*/; 
} 
}//while(pathok == false) 
/*****************************end ask user for path to load images and list them****************************************/ 

#pragma endregion 

#pragma region ask user to exclude some files 

/*****************************************ask user to exclude some files*************************/ 
printf ("\nEnter the number of the files you dont want to load (number only!).\nSeperate single files with comma.\nEnter 0 if you don't want to exclude files.\nEnter x to exclude all non bmp files.\n\nNumbers:\n"); 
scanf("%199s", stRemFileNum);  //achtung wegen bufferoverflow - nicht mehr als 199 zeichen + EOF (0) einlesen 
vector<string>::iterator it; 
if(strcmp(stRemFileNum,"x") == 0) 
{ 
    curNum=1; 
    numFiles = 0; 
    string extstr; 
    const char * extc; 

    file_names.erase(remove_if(file_names.begin(), 
           file_names.end(), 
           isBmpExtension), file_names.end()); 

    system("cls");      //bildschirm clearen 
    printf("New Filetree of this path:\n\n"); 
    it = file_names.begin(); 
    for(it; it != file_names.end(); ++it) 
    { 
     numFiles++; 
     printf ("%d)\t%s\n",numFiles, (*it).c_str());   
    } 

    printf ("\nNumber of found files: %d\n", numFiles); 
}//if(strcmp(stRemFileNum,"x") == 0) 


//end user entered x 

//start user entered 0 

if(strcmp(stRemFileNum,"0") != 0 && strcmp(stRemFileNum,"x") != 0) 
{ 

    //fehler 
    numFiles = 0; 
    vector<string> numbersVector; 
    string strNumbers = stRemFileNum; 
    Tokenize(strNumbers, numbersVector, ","); 
    sort(numbersVector.begin(), numbersVector.end(), strCompDesc); 

    for(it = numbersVector.begin(); it != numbersVector.end(); ++it) 
    { 
     curNum = atoi((*it).c_str()); 
     file_names.erase(file_names.begin() + (curNum - 1)); 
    } 


    system("cls");      //bildschirm clearen 
    printf("New Filetree of this path:\n\n"); 

    //fehler ende 

    for(vector<string>::iterator it = file_names.begin(); it != file_names.end(); ++it) 
    { 
     numFiles++; 
     printf ("%d)\t%s\n",numFiles, (*it).c_str());   
    } 

    printf ("\nNumber of found files: %d\n", numFiles); 

} 
//user entered 0 
else if(strcmp(stRemFileNum,"0") == 0) 
{ 
    printf ("\nNo files excluded.\n"); 
} 


/*****************end ask user to exclude some files *******************************************/ 

#pragma endregion 

fflush(stdin); 
printf("\nEnter number of corners along width: "); 
scanf("%d", &numCornersHor); 
fflush(stdin); 
printf("Enter number of corners along height: "); 
scanf("%d", &numCornersVer); 





int numSquares = numCornersHor * numCornersVer; 
Size board_sz = Size(numCornersHor, numCornersVer); 

vector<vector<Point3f>> object_points; 
vector<vector<Point2f>> image_points; 

vector<Point2f> corners; 
vector<Point3f> obj; 

int pictures_done=0; 

Mat image; 
Mat gray_image; 


//Bilder zum persönlichen auswerten anzeigen +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

// 

for(vector<string>::iterator it = file_names.begin(); it != file_names.end(); ++it) 
{ 



printf("\nLoading Picture..\n"); 

image = imread(string(stCurPath) + "\\" + (*it).c_str()); //als farbe lesen; doppelter backslash o. normaler 

//resize(image, image, Size(0,0), 0.5, 0.5, INTER_AREA); 

cvtColor(image,gray_image,CV_RGB2GRAY); 





for(int j=0;j<numSquares;j++) 
{ 
    obj.push_back(Point3f(j/numCornersHor, j%numCornersHor, 0.0f)); 
}//for(int j=0;j<numSquares;j++) 



bool found = findChessboardCorners(image, board_sz, corners, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS); 

    if(found) 
    { 
     cornerSubPix(gray_image, corners, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1)); 
     drawChessboardCorners(gray_image, board_sz, corners, found); 
    } 

    cvNamedWindow("win1", 1); 
    imshow("win1", gray_image); 
    waitKey(30); 
    cvMoveWindow("win1",0,0); 
    waitKey(30); 
    printf("\nPicture loaded.\nPress a to load original, s to store snap and show next picture,"); 
    printf("\nd to drop snap and show next picture, and f to close the programm\n"); 

    char key; 
    bool bOriginalDisplayed = false; 

    while(1) 
    { 
     if (cin.rdbuf()->in_avail()) 
     { 
      key = _getch(); 
     } 

     if('a' == key && found!=0) 
     { 
      if (!bOriginalDisplayed) 
      { 
       printf("\nLoading original..\n"); 
       cvNamedWindow("win2", 1); 
       cvMoveWindow("win2",0,0); 
       imshow("win2", image);     //oder imshow cvMoveWindow("Smile", 100, 100); 

       bOriginalDisplayed = true; 
       waitKey(50); 
       printf("\nOriginal loaded.\nPess a again to close original before you continue.\n"); 
      } 
      else 
      { 
       cvDestroyWindow("win2"); 
       printf("\nOriginal closed.\n"); 
       bOriginalDisplayed = false; 
      } 
     } 

     if('s'==key) 
     { 
      image_points.push_back(corners); 
      object_points.push_back(obj); 
      printf("\nSnap stored!\n"); 
      pictures_done++; 
      found = false; 
      break; 
     } 

     if('d' == key) 
     { 
      pictures_done++; 
      break; 
      found = false; 
     } 

     if('f' == key) 
     { 
      return 0; 
     } 

     Sleep(50); 
    } //while (1) 



} //for(vector<string>::iterator it = file_names.begin(); it != file_names.end(); ++it) 


cvDestroyWindow("win1"); 
waitKey(50); 

Mat intrinsic = Mat(3, 3, CV_32FC1); 
Mat distCoeffs; 
vector<Mat> rvecs; 
vector<Mat> tvecs; 


intrinsic.ptr<float>(0)[0] = 1; 
intrinsic.ptr<float>(1)[1] = 1; 

calibrateCamera(object_points, image_points, image.size(), intrinsic, distCoeffs, rvecs, tvecs); 


Mat imageUndistorted; 

for(vector<string>::iterator it = file_names.begin(); it != file_names.end(); ++it) 
{ 
printf("\nLoading undistorted Picture..\n"); 
image = imread(string(stCurPath) + "\\" + (*it).c_str()); //als farbe lesen; doppelter backslash o. normaler  
//resize(image, image, Size(0,0), 0.5, 0.5, INTER_AREA); 
cvtColor(image,gray_image,CV_RGB2GRAY); 

    cvNamedWindow("win1", 1); 
    cvNamedWindow("win2", 1); 
    cvMoveWindow("win1",0,0); 
    cvMoveWindow("win2",0,0); 
    undistort(image, imageUndistorted, intrinsic, distCoeffs); 
    imshow("win1", image); 
    waitKey(0); 
    imshow("win2", imageUndistorted); 
    waitKey(30); 
    printf("\nPicture loaded. Press s for the next picture or f to exit."); 

    char key; 
    bool bOriginalDisplayed = false; 

    while(1) 
    { 
     if (cin.rdbuf()->in_avail()) 
     { 
      key = _getch(); 
     } 

     if('s'==key) 
     { 
      break; 
     } 

     if('f' == key) 
     { 
      return 0; 
     } 

     Sleep(50); 
    } //while (1) 



} //for(vector<string>::iterator it = file_names.begin(); it != file_names.end(); ++it) 








return 0; 

} 
+3

欢迎来到SO。当您发布代码时,请务必将其缩进四个空格,以便将其识别为代码。此外,您应该将您的示例代码削减到重现问题所需的最小值。这会让它更容易,因此更有可能让某人给你帮助。这里有很多无关的代码供我们浏览。 – SSteve

+0

我找到了答案,如果你有兴趣,请看下面的问题。 –

+0

当你找到并发布它时,你应该接受你自己的解决方案。除了wath,SSteve说,我还建议*如果*你在代码中留下了评论,让他们对那些试图帮助你的人有用和有帮助。德语的评论让我们难以阅读并帮助你。 – penelope

回答

4

如果发现了问题。我是一个很好的人,我来到这里为将来遇到同样问题的人发布答案。

解决方法:添加obj.clear()进入的功能,所以OBJ始终保持相同的大小,当你推回。就像这样:

//Bilder zum persönlichen auswerten anzeigen +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
// 

for(vector<string>::iterator it = file_names.begin(); it != file_names.end(); ++it) 
{ 
    printf("\nLoading Picture..\n"); 
    image = imread(string(stCurPath) + "\\" + (*it).c_str()); //als farbe lesen; doppelter backslash o. normaler 
    //resize(image, image, Size(0,0), 0.5, 0.5, INTER_AREA); 
    cvtColor(image,gray_image,CV_RGB2GRAY); 

    obj.clear(); 
    for(int j=0;j<numSquares;j++) 
    { 
     obj.push_back(Point3f(j/numCornersHor, j%numCornersHor, 0.0f)); 
    }//for(int j=0;j<numSquares;j++) 

    bool found = findChessboardCorners(image, board_sz, corners, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS); 

    if(found) 

玩得开心编程。问候,Escore。

+0

嘿,它给同样的错误。 – Abc

+0

这样做并不能解决我的问题。 – Abc

相关问题