2017-07-31 87 views
1

嘿,我在這個庫中使用JavaCV org.bytedeco.javacpp.opencv_core版本1.3.2作爲gradle依賴。調用findChessboardCorners時獲取角點的座標

我運行這段代碼以獲得在棋盤的角落,但我有麻煩獲取座標所檢測的每個角落:

Mat imageCorners = new Mat(); 
    Size boardSize = new Size(9,6); 
    boolean found = findChessboardCorners(capturedFrame,boardSize,imageCorners,CV_CALIB_CB_ADAPTIVE_THRESH+CV_CALIB_CB_NORMALIZE_IMAGE); 

但對於54角的方法檢測,該矩陣存儲角落只有54x1的大小。

if (found) { 
    FloatRawIndexer sI = imageCorners.createIndexer(); 
    for (int y = 0; y < imageCorners.rows(); y++) { 
     for (int x = 0; x < imageCorners.cols(); x++) { 
     logger.debug("Row: " + y + " Column " + x); 
     logger.debug(sI.get(y, x)); 
     } 
    } 
    } 

日誌文件看起來是這樣的:

14:57:50.057 [main] DEBUG JavaCVTransformation2 - Row: 0 Column 0 
14:57:50.059 [main] DEBUG JavaCVTransformation2 - 164.02007 
14:57:50.059 [main] DEBUG JavaCVTransformation2 - Row: 1 Column 0 
14:57:50.059 [main] DEBUG JavaCVTransformation2 - 224.07906 
14:57:50.059 [main] DEBUG JavaCVTransformation2 - Row: 2 Column 0 
14:57:50.059 [main] DEBUG JavaCVTransformation2 - 283.54288 
14:57:50.059 [main] DEBUG JavaCVTransformation2 - Row: 3 Column 0 
14:57:50.059 [main] DEBUG JavaCVTransformation2 - 343.4154 
14:57:50.060 [main] DEBUG JavaCVTransformation2 - Row: 4 Column 0 
14:57:50.060 [main] DEBUG JavaCVTransformation2 - 402.7718 
14:57:50.060 [main] DEBUG JavaCVTransformation2 - Row: 5 Column 0 
14:57:50.060 [main] DEBUG JavaCVTransformation2 - 462.38278 
14:57:50.060 [main] DEBUG JavaCVTransformation2 - Row: 6 Column 0 
14:57:50.060 [main] DEBUG JavaCVTransformation2 - 522.2342 
14:57:50.060 [main] DEBUG JavaCVTransformation2 - Row: 7 Column 0 
14:57:50.060 [main] DEBUG JavaCVTransformation2 - 580.99805 
14:57:50.061 [main] DEBUG JavaCVTransformation2 - Row: 8 Column 0 
14:57:50.061 [main] DEBUG JavaCVTransformation2 - 640.7774 
14:57:50.061 [main] DEBUG JavaCVTransformation2 - Row: 9 Column 0 
14:57:50.061 [main] DEBUG JavaCVTransformation2 - 151.04564 

繪製它工作完全正常,所以冥冥之中有必須是兩個座標到每個角落,我想。

drawChessboardCorners(capturedFrame, boardSize, imageCorners, found); 

有沒有辦法在撥打電話findChessboardCorners()時得到轉角座標?

+0

在C++中的輸出''imageCorners''是一個''矢量''可以通過''imageCorners [i] .x''和'imageCorners [i] .y''進行訪問。這對你有幫助嗎? – Phann

回答

0

我沒有找到方法findChessboardCorners的解決方案,但我發現它的另一種方法svFindChessboardCornersimport static org.bytedeco.javacpp.opencv_calib3d.*;工作。

IplImage iplImage = frameConverter.convertToIplImage(capturedFrame); 

    CvSize boardSize = new CvSize(9, 6); 
    float[] corners = new float[108]; 
    int found = cvFindChessboardCorners(iplImage, boardSize, corners); 

此方法將存儲的角座標浮子陣列上,所以訪問所述第一點是這樣的:

Point2f srcp1 = new Point2f(corners[0], corners[1]);