livox_camera_lidar_calibration 학습--카메라 내부 매개변수 교정

오픈 소스 코드는 다음 위치에 있습니다. GitHub - Shelfcol/livox_camera_lidar_calibration_modified: livox_camera_lidar_calibration 개선

코드는 CameraCalib.cpp입니다.

실행: roslaunch Camera_lidar_calibration CameraCalib.launch

1. 캡쳐된 체커보드 사진 23장을 캡쳐해서 읽어보세요

        사진 촬영: 모든 각도와 위치를 포함하는 20장 이상의 사진 데이터를 준비합니다. 촬영 시 사진과 같이 거리가 너무 가깝지 않아야 합니다(약 3미터).

        Mat imageInput = imread(파일명);

2. 바둑판의 모서리 점 추출

        Size Board_size = Size(row_number, col_number); /* 교정 보드의 각 행과 열에 있는 모서리 점의 수*/

        vector<Point2f> image_points_buf; /* 각 이미지에서 감지된 모서리 점을 캐시합니다*/

        0 == findChessboardCorners (imageInput, board_size, image_points_buf)

3. 성공적인 코너점 추출을 통해 이미지에서 하위 픽셀 코너점을 추출합니다.

        Mat view_gray; // 해당 회색조 이미지를 저장합니다.

        cvtColor (imageInput, view_gray, cv::COLOR_RGB2GRAY); // 회색조 이미지로 변환

        /* 하위 픽셀 정밀도*/

        // image_points_buf는 초기 모서리 점 좌표 벡터이며 하위 픽셀 좌표 위치의 출력으로도 사용됩니다.

        // Size(5,5) 검색창 크기

        // (-1, -1)은 데드존이 없음을 의미합니다.

        // TermCriteria 꼭지점 반복과정의 종료조건으로, 꼭지점의 반복횟수와 꼭지점의 정확도의 조합이 가능함

        CornerSubPix (view_gray, image_points_buf, 크기(5, 5), 크기(-1, -1), TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 30, 0.1));

        (구체적인 원칙은 나중에 추가하겠습니다)

         drawChessboardCorners (view_gray, board_size, image_points_buf, false); // 그림의 모서리 점을 표시하는 데 사용됩니다.

4. 이미지의 너비와 높이에 따라 가상의 세계 모서리 좌표를 설정합니다.

        여기서 boad_size의 높이는 체커보드 수치방향의 꼭지점 개수이고, width는 가로방향의 꼭지점 개수로, 여기서 검은색 블록의 가장 바깥쪽 원은 포함되지 않는다는 점에 유의하세요. 아래 이미지는 너비 = 8, 높이 = 6에 해당합니다. 각 정사각형의 크기는 Size square_size(w,h)이고, w와 h의 단위는 mm입니다.

         여기서는 왼쪽 위 모서리 점의 좌표가 (0,0)이고, 다른 모서리 점의 좌표는 그리드의 크기에 따라 계산된다고 가정합니다. 여기서는 교정 플레이트가 평면에 있는 것으로 가정합니다. 세계 좌표계 z=0

/* 初始化标定板上角点的三维坐标,以(0,0)坐标开始,每个角点的长宽由测量确定 */
int i, j, t;
for (t = 0; t<image_count; t++) { // 遍历所有图片数
    vector<Point3f> tempPointSet;
	for (i = 0; i<board_size.height; i++) {
		for (j = 0; j<board_size.width; j++) {
			Point3f realPoint;

			/* 假设标定板放在世界坐标系中z=0的平面上 */
			realPoint.x = i * square_size.width;
			realPoint.y = j * square_size.height; // 右x下y
			realPoint.z = 0;
			tempPointSet.push_back(realPoint);
		}
	}
	object_points.push_back(tempPointSet);
}

5. 추출된 꼭지점과 가정된 세계 좌표계 꼭지점을 기반으로 카메라 내부 매개변수를 계산합니다.

/* 开始标定 */
// object_points 世界坐标系中的角点的三维坐标
// image_points_seq 每一个内角点对应的图像坐标点
// image_size 图像的像素尺寸大小
// cameraMatrix 输出,内参矩阵
// distCoeffs 输出,畸变系数
// rvecsMat 输出,旋转向量
// tvecsMat 输出,位移向量
// 0 标定时所采用的算法
calibrateCamera(object_points, image_points_seq, image_size, cameraMatrix, distCoeffs, rvecsMat, tvecsMat, 0); // 

6. 계산된 내부 매개변수를 기반으로 3차원 점 재투영을 수행하여 교정 오류를 계산합니다.

/* 획득한 카메라의 내부 및 외부 매개변수를 사용하여 가정된 공간의 3차원 점을 다시 투영하여 새로운 투영점을 획득하고 image_points2에 저장합니다*/

입력: 월드 포인트에 해당하는 회전 및 변환 행렬인 가정된 월드 포인트, 카메라 내부 매개변수, 왜곡 계수 및 카메라 평면에 투영된 출력 포인트 좌표입니다.

projectPoints (tempPointSet, rvecsMat[i], tvecsMat[i], CameraMatrix, distCoeffs, image_points2);

여기에서 약간의 지식을 배우십시오 .

         CV_<비트 깊이>(S|U|F)C<채널 수>

         CV_32FC2는 32비트 부동 소수점 이중 채널을 나타냅니다.

	double total_err = 0.0;         /* 所有图像的平均误差的总和 */
	double err = 0.0;               /* 每幅图像的平均误差 */
	vector<Point2f> image_points2;  /* 保存重新计算得到的投影点 */
	fout << "Average error: \n";

	for (i = 0; i<image_count; i++) {
		vector<Point3f> tempPointSet = object_points[i];

		/* 通过得到的摄像机内外参数,对假定空间的三维点进行重新投影计算,得到新的投影点,保存在image_points2中 */
		projectPoints(tempPointSet, rvecsMat[i], tvecsMat[i], cameraMatrix, distCoeffs, image_points2);

		/* 计算新的投影点和旧的投影点之间的误差*/
		vector<Point2f> tempImagePoint = image_points_seq[i]; // 第i张图片的角点坐标
		Mat tempImagePointMat = Mat(1, tempImagePoint.size(), CV_32FC2); // 双通道数据,每个存放Vec2f
		Mat image_points2Mat  = Mat(1, image_points2.size(),  CV_32FC2);

		for (unsigned int j = 0; j < tempImagePoint.size(); j++) {
			image_points2Mat.at<Vec2f>(0, j) = Vec2f(image_points2[j].x, image_points2[j].y);
			tempImagePointMat.at<Vec2f>(0, j) = Vec2f(tempImagePoint[j].x, tempImagePoint[j].y);
		}
		err = norm(image_points2Mat, tempImagePointMat, NORM_L2); // 计算L2距离
		total_err += err /= point_counts[i];
		fout << "The error of picture " << i + 1 << " is " << err << " pixel" << endl;
	}
	fout << "Overall average error is: " << total_err / image_count << " pixel" << endl << endl;

7. 교정 결과

        1개의 3x3 내부 매개변수 매트릭스, 5개의 왜곡 보정 매개변수(k1, k2, p1, p2, k3)

8. Matlab은 카메라 내부 매개변수를 보정합니다.

        Matlab의 CameraCalibrator 도구는 내부 매개변수를 교정할 수 있으며 결과에는 1, 2, 11 데이터만 필요합니다.

Supongo que te gusta

Origin blog.csdn.net/qq_38650944/article/details/124120612
Recomendado
Clasificación