目录
一、主要函数
1、findChessboardCorners()
bool cv::findChessboardCorners ( InputArray image,
Size patternSize,
OutputArray corners,
int flags = CALIB_CB_ADAPTIVE_THRESH+CALIB_CB_NORMALIZE_IMAGE
)
- 功能:寻找棋盘图的内角点位置
image
:输入的棋盘图,必须是8位的灰度或者彩色图像。pattern_size
:棋盘图中每行和每列角点的个数。corners
:检测到的内角点坐标。flags
:各种操作标志。
标志 | 简记 | 含义 |
---|---|---|
CALIB_CB_ADAPTIVE_THRESH | 1 | 使用自适应阈值(通过平均图像亮度计算得到)将图像转换为黑白图,而不是一个固定的阈值。 |
CALIB_CB_NORMALIZE_IMAGE | 2 | 在利用固定阈值或者自适应的阈值进行二值化之前,先使用equalizeHist来均衡化图像亮度。 |
CALIB_CB_FILTER_QUADS | 4 | 使用其他的准则(如轮廓面积,周长,方形形状)来去除在轮廓检测阶段检测到的错误方块 |
CALIB_CB_FAST_CHECK | 8 | 使用快速方法查找图像中的角点 |
2、find4QuadCornerSubpix()
bool cv::find4QuadCornerSubpix ( InputArray img,
InputOutputArray corners,
Size region_size
)
img
:输入的Mat矩阵,最好是8位灰度图像,检测效率更高;corners
:初始的角点坐标向量,同时作为亚像素坐标位置的输出,所以需要是浮点型数据,一般用元素是Pointf2f/Point2d
的向量来表示。
region_size
:角点搜索窗口的尺寸,优化坐标时考虑的邻域范围。
3、drawChessboardCorners
void cv::drawChessboardCorners ( InputOutputArray image,
Size patternSize,
InputArray corners,
bool patternWasFound
)
该函数绘制单独的棋盘角,如果未找到棋盘,则将检测到的角画成红色圆圈,如果找到棋盘,则将检测到的角画成用线连接的彩色角。
image
:需要绘制角点的目标图像,它必须是一个8位彩色图像。patternSize
:每张标定棋盘上内角点的行列数。corners
:检测到的角点坐标数组。patternWasFound
:绘制角点样式的标志,用于显示是否找到完整标定板。
patternWasFound=ture
时,依次连接各个内角点。
patternWasFound=false
时,以(红色)圆圈标记处角点位置。
二、代码实现
#include <iostream>
#include <vector>
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("方形标定板.png");
if (!img.data)
{
cout << "读取图像错误,请确认图像文件是否正确" << endl;
return -1;
}
imshow("方形标定板", img);
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
//定义数目尺寸
Size board_size = Size(6, 9); //方格标定板内角点数目(行,列)
//检测角点
vector<Point2f> img_points;
findChessboardCorners(gray, board_size, img_points); //计算方格标定板角点
//细化角点坐标
find4QuadCornerSubpix(gray, img_points, Size(5, 5)); //细化方格标定板角点坐标
//绘制角点检测结果
drawChessboardCorners(img, board_size, img_points, true);
//显示结果
imshow("方形标定板角点检测结果", img);
waitKey(0);
return 0;
}