1

我最近使用Matlab 單相機校準應用程序算法來校準相機內在和外在因素。在找到棋盤的角落時,Matlab的許多功能都會執行(精確度)opencv api cv::findChessboardCorners,但在某些圖片上,Matlab的表現很奇怪。Matlab detectCheckerboardPoints瑕疵

例如,下面的圖像中,板正方形之間的角是清楚的看到,而MATLAB發現上陌生的地方冗餘的:

  1. 原始圖像://應該有5 * 8 = 40內角點的失真的圖像上發現的 enter image description here

  2. 角點:// 6 * 9 = 54發現 enter image description here

  3. 點在原始圖像上發現:// 6 * 10 = 60 ... enter image description here

的MATLAB代碼段是簡單如下:

img=imread(fn); 
[imUndist, newOrig]=undistortImage(img, cameraParams); 
[pxs, bdsize]=detectCheckerboardPoints(imUndist); %or detect on 'img' directly 
imMarked=insertMarker(imUndist, pxs); 
imshow(imMarked); 
  • 與此opencv圖像上(下面的代碼)檢測的角點是非常精確的:
  • // OpenCV的代碼:

    Mat img = imread(fpath); 
    int ww = 8, hh = 15; 
    cv::Size bsz(ww, hh); 
    vector<Point2f> ptvec; 
    bool found = cv::findChessboardCorners(img, bsz, ptvec, CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE); 
    cv::drawChessboardCorners(img, bsz, ptvec, found); 
    imshow("img", img); 
    waitKey(); 
    

    enter image description here

    回答

    4

    使棋盤變大!這可能發生,並且確實發生。通常,您希望棋盤成爲大部分屏幕的一部分。您解決兩個問題:

    1. 有每平方棋盤更多的像素,因此眼角檢測算法可以找到更好
    2. 您糾正扭曲越好。相機失真在圖像的角落更加強烈,因此如果棋盤在圖像周圍有點,它將檢測到失真明顯好於在圖像中間的一小部分。
    +0

    如果我必須使用**圖像**我上面發佈,和** matlab **,有沒有什麼辦法可以做出一些改進? – zhangxaochen

    1

    您最好製作一個大於方格大小的白色邊距的棋盤,但如果您堅持使用這些圖像,請使用Paint對它們進行編輯,並使最外面的黑色方格和一些棋盤周圍的區域。它有助於更​​好地檢測,而且對進一步的計算沒有不良影響。我希望它能起作用。