【OpenCV3】棋盘格角点检测与绘制——cv::findChessboardCorners()与cv::drawChessboardCorners()详解
棋盤格法是攝像機標定中常用的一種方法,在使用該方法時需要對棋盤格的角點進行檢測。opencv中封裝了一個專門用于棋盤格角點檢測的函數即cv::findChessboardCorners(),同時,也提供了一個專門用于繪制棋盤格角點的函數cv::drawChessboardCorners()。下面將對這兩個函數進行詳細的介紹。
1、cv::findChessboardCorners()棋盤格角點檢測
該函數的具體調用形式如下:
bool cv::findChessboardCorners( // 如果找到角點則返回truecv::InputArray image, // 輸入的棋盤格圖像(8UC1或8UC3)cv::Size patternSize, // 棋盤格內部角點的行、列數cv::OutputArray corners, // 輸出的棋盤格角點int flags = cv::CALIB_CB_ADAPTIVE_THRESH | cv::CALIB_CB_NORMALIZE_IMAGE);
第一個參數是輸入的棋盤格圖像(可以是8位單通道或三通道圖像)。
第二個參數是棋盤格內部的角點的行列數(注意:不是棋盤格的行列數,如下圖棋盤格的行列數分別為4、8,而內部角點的行列數分別是3、7,因此這里應該指定為cv::Size(3, 7))。
第三個參數是檢測到的棋盤格角點,類型為std::vector<cv::Point2f>。
第四個參數flag,用于指定在檢測棋盤格角點的過程中所應用的一種或多種過濾方法,可以使用下面的一種或多種,如果都是用則使用OR:
cv::CALIB_CB_ADAPTIVE_THRESH:cv::findChessboardCorners()默認的閾值化處理基于平均亮度,如果該標志指定,則使用自適應濾波(自適應濾波見?
OpenCV3中的閾值化操作——cv::threshold()與cv::adaptiveThreshold()詳解
)。cv::CALIB_CB_NORMALIZE_IMAGE:閾值化前使用cv::equalizeHist()進行直方圖均衡化處理。
cv::CALIB_CB_FILTER_QUADS:
cv::CALIB_CV_FAST_CHECK:
當然,找到的角點還需要使用cv::cornerSubPix()進行精度上的優化(具體請參考OpenCV3中的角點檢測——cv::goodFeaturesToTrack()與cv::cornerSubPix()詳解)。
2、cv::drawChessboardCorners()棋盤格角點的繪制
cv::drawChessboardCorners()的具體調用形式如下:
void cv::drawChessboardCorners(cv::InputOutputArray image, // 棋盤格圖像(8UC3)即是輸入也是輸出cv::Size patternSize, // 棋盤格內部角點的行、列數cv::InputArray corners, // findChessboardCorners()輸出的角點bool patternWasFound // findChessboardCorners()的返回值);
第一個參數是棋盤格圖像(8UC3)。
第二個參數是棋盤格內部角點的行、列,和cv::findChessboardCorners()指定的相同。
第三個參數是檢測到的棋盤格角點。
第四個參數是cv::findChessboardCorners()的返回值。
下面是棋盤格檢測與繪制的測試代碼
cv::Mat image_color = cv::imread("chessboard.png", cv::IMREAD_COLOR);cv::Mat image_gray;cv::cvtColor(image_color, image_gray, cv::COLOR_BGR2GRAY);std::vector<cv::Point2f> corners;bool ret = cv::findChessboardCorners(image_gray,cv::Size(3, 7),corners,cv::CALIB_CB_ADAPTIVE_THRESH |cv::CALIB_CB_NORMALIZE_IMAGE);//指定亞像素計算迭代標注cv::TermCriteria criteria = cv::TermCriteria(cv::TermCriteria::MAX_ITER + cv::TermCriteria::EPS,40,0.1);//亞像素檢測cv::cornerSubPix(image_gray, corners, cv::Size(5, 5), cv::Size(-1, -1), criteria);//角點繪制cv::drawChessboardCorners(image_color, cv::Size(3, 7), corners, ret);cv::imshow("chessboard corners", image_color);cv::waitKey(0);return;
檢測和繪制的結果如下:
2017.04.07
總結
以上是生活随笔為你收集整理的【OpenCV3】棋盘格角点检测与绘制——cv::findChessboardCorners()与cv::drawChessboardCorners()详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【OpenCV3】角点检测——cv::g
- 下一篇: 【OpenCV3】旋转矩形(cv::Ro