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