标定的程序在官方的源码里有,
opencv-4.5.5\samples\cpp\tutorial_code\calib3d\camera_calibration
很多小白不知道怎么跑起来,这个也怪OpenCV官方,工作没做完善,其实的default.xml是要自己手动改的,输入的图片也要自己去拍摄,还有那个VID5.xml也要改成可以直接找到图片的路径;
我这里拍了5张图,故意做了鱼眼效果后,用于标定校正。程序已经改好了,直接visual studio就可以跑了,到这里去下载吧,
https://github.com/SpaceView/OpenCV455_cameraCalibrationDemo
关于标定板:
OpenCV官方曾经提供的标定板是9x6和7x7的,实际应用根据场景的需要,可能需要不同的标定板。
这里我们手动生成标定板chessboard格子的图片, 生成标定板的程序如下,
void Generate7x7Image() {
const int BLOCKWIDTH = 100;
const int BLOCKNUM = 7;
cv::Size sz = { BLOCKNUM* BLOCKWIDTH, BLOCKNUM* BLOCKWIDTH };
cv::Mat mat(sz, CV_8UC3);
for (int r = 0; r < BLOCKNUM; r++) {
for (int c = 0; c < BLOCKNUM; c++) {
int IX = c * BLOCKWIDTH, IY = r * BLOCKWIDTH;
int EX = IX + BLOCKWIDTH, EY = IY + BLOCKWIDTH;
cv::Vec3b value;
if (0 == (c + r) % 2) {
value = { 0xFF,0xFF, 0xFF };
}
else {
value = 0x000000;
}
for (int y = IY; y < EY; y++) {
cv::Vec3b* p = mat.ptr<cv::Vec3b>(y);
for (int x = IX; x < EX; x++) {
p[x] = value;
}
}
}
}
cv::imwrite("Generated7x7.png", mat);
}
这样,一张7x7(算格交叉点的话是6x6)就生成了,如下图,
然后打印出来就可以做标定板了。
本文结束。