opencv相机标定对称圆形
时间: 2023-11-07 19:57:45 浏览: 135
对称圆形标定图案是OpenCV相机标定中的一种常用标定图案。在OpenCV的官方例程中,使用的是对称圆形特征图作为标定图案。相机标定的目的是通过拍摄包含已知尺寸的标定图案的图片来确定相机的内部参数和畸变参数,从而对图像进行校正和测量。
使用对称圆形标定图案进行相机标定的步骤如下:
1. 准备标定图案:根据需要,在标定板上绘制一组相互对称的圆形特征。
2. 拍摄标定图像:使用相机拍摄多张包含标定图案的图片,保证标定图案在不同位置、角度和距离上的变化。
3. 提取图像中的特征点:使用图像处理算法提取图像中的圆形特征点的像素坐标。
4. 生成3D-2D对应点对:将标定板上每个特征点的实际3D坐标与其在图像中的2D像素坐标进行对应。
5. 执行相机标定:通过求解相机的内部参数矩阵和畸变参数,将3D-2D对应点对转换为相机的外部参数矩阵。
6. 评估标定结果:根据标定误差指标评估相机标定的准确性。
7. 应用相机标定:将标定结果应用于后续的图像处理、计算机视觉任务中。
通过以上步骤,可以使用对称圆形标定图案完成OpenCV相机的标定。此外,在OpenCV中也支持其他标定图案,如棋盘格和非对称圆形特征图。不同的标定图案适用于不同的应用场景和标定精度要求。
相关问题
opencv圆形标定
在OpenCV中,圆形标定图案可以用于相机的标定。圆形标定图案分为对称圆形和非对称圆形两种类型。使用圆形标定图案进行相机标定的步骤如下:
1. 准备标定图案:根据需要选择对称圆形或非对称圆形标定图案。可以使用OpenCV自带的例程中的imagelist_creator.cpp生成标定图像。
2. 拍摄标定图像:使用相机拍摄一系列包含标定图案的图像。确保图像中的标定图案清晰可见,并且标定图案在不同位置和角度下都有足够的变化。
3. 提取标定图案的角点:使用OpenCV的findCirclesGrid函数来检测图像中标定图案的角点。该函数会返回每个标定图案的角点坐标。
4. 标定相机:使用OpenCV的calibrateCamera函数来进行相机标定。将标定图像的角点坐标和实际世界坐标传递给该函数,它将返回相机的内参矩阵、畸变系数和旋转平移向量等标定结果。
5. 评估标定结果:可以使用reprojectionError函数来评估标定结果的准确性。该函数会计算标定图案的重投影误差,即标定图案的角点在标定结果下的重投影位置与实际位置之间的差距。
下面是一个使用对称圆形标定图案进行相机标定的示例代码:
```python
import cv2
import numpy as np
# 准备标定图案
pattern_size = (7, 7) # 标定图案的内角点个数
pattern_points = np.zeros((np.prod(pattern_size), 3), np.float32)
pattern_points[:, :2] = np.indices(pattern_size).T.reshape(-1, 2)
# 拍摄标定图像
images = [] # 存储标定图像
# 读取图像并检测角点
for i in range(1, 21):
img = cv2.imread(f'calibration_images/{i}.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findCirclesGrid(gray, pattern_size, None)
if ret:
images.append((gray, corners))
# 标定相机
obj_points = [] # 存储标定图案的实际世界坐标
img_points = [] # 存储标定图案的图像坐标
for gray, corners in images:
obj_points.append(pattern_points)
img_points.append(corners)
ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None)
# 评估标定结果
mean_error = 0
for i in range(len(obj_points)):
img_points2, _ = cv2.projectPoints(obj_points[i], rvecs[i], tvecs[i], camera_matrix, dist_coeffs)
error = cv2.norm(img_points[i], img_points2.reshape(-1, 2), cv2.NORM_L2) / len(img_points2)
mean_error += error
mean_error /= len(obj_points)
print("Mean reprojection error: ", mean_error)
```
opencv圆形棋盘格相机标定源码
您可以使用OpenCV提供的相机标定示例程序来进行圆形棋盘格相机标定。在文件夹中,您可以找到名为camera_calibration.cpp的源代码文件,其中包含了OpenCV相机标定的实例程序。您还需要修改in_VID5和VID5两个XML文档来设置标定参数和标定图片路径。此外,OpenCV的相机标定程序还支持Checkerboard(棋盘格)、Symmetric Circle Grid(对称圆网格)和Asymmetric Circle Grid(非对称圆网格)三种标定图案。您可以根据需要选择合适的标定图案进行相机标定。\[1\]
如果您需要生成一张黑白对称圆点的图像作为标定图案,您可以使用以下代码。这段代码使用了OpenCV库来生成一张黑白对称圆点的图像,您可以根据需要修改圆点个数、图片分辨率和图片格式。\[3\]
```cpp
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
#define WINDOW_WIDTH 1200 //定义窗口大小的宏
#define WINDOW_LENTH 1700
#define WINDOW_NAME1 "【绘制图1】" //为窗口标题定义的宏
#define WINDOW_NAME2 "【绘制图2】" //为窗口标题定义的宏
void drawFilledCircle(Mat img, Point center) {
int thickness = -1;
int lineType = 8;
circle(img, center, WINDOW_WIDTH / 12, Scalar(0, 0, 0), thickness, lineType);
}
int main() {
Mat atomImage(WINDOW_WIDTH, WINDOW_LENTH, CV_8UC3, Scalar(255, 255, 255));
for (int i = 180 + WINDOW_WIDTH / 12; i < WINDOW_LENTH; i = i + WINDOW_WIDTH / 4) {
for (int j = 50 + WINDOW_WIDTH / 12; j < WINDOW_WIDTH; j = j + WINDOW_WIDTH / 4) {
drawFilledCircle(atomImage, cv::Point(i, j));
}
}
imwrite("symmetricCirclesGridPattern.png", atomImage);
imshow(WINDOW_NAME1, atomImage);
waitKey(0);
return(0);
}
```
这段代码将生成一张名为symmetricCirclesGridPattern.png的黑白对称圆点图像,并显示在窗口中。您可以根据需要修改窗口大小和窗口标题。\[3\]
#### 引用[.reference_title]
- *1* *3* [MATLAB/OpenCV--基于棋盘格/对称圆点/非对称圆点--相机标定教程](https://blog.csdn.net/m0_51729073/article/details/121268125)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* [C++ OpenCV相机标定---实心圆点、棋盘格](https://blog.csdn.net/huhu7777/article/details/126927710)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文