使用OpenCV进行角点检测

需积分: 10 1 下载量 132 浏览量 更新于2024-09-17 收藏 1KB TXT 举报
"这篇代码示例展示了如何在OpenCV库的帮助下加载个人图片并进行角点检测。通过调用`cvGoodFeaturesToTrack`函数,我们可以识别图像中的关键角点,并在原始图像上标记它们的位置。" 这篇代码的核心知识点是利用OpenCV进行角点检测,具体包括以下几个步骤: 1. **头文件引入**:`#include<stdio.h>`、`#include"cv.h"`和`#include"highgui.h"`是OpenCV早期版本中用于图像处理的基本头文件。`#define MAX_CORNERS 100`定义了最多可检测的角点数量。 2. **变量定义**:`int cornersCount = MAX_CORNERS;`初始化了角点的数量,`CvPoint2D32f corners[MAX_CORNERS];`则定义了一个数组来存储检测到的角点坐标。 3. **图像处理**: - `IplImage* srcImage=0, *grayImage=0, *corners1=0, *corners2=0;`声明了四个IplImage指针,分别表示原图、灰度图以及两个用于角点检测的浮点型图像。 - `cvNamedWindow("image",1);`创建一个名为“image”的窗口来显示结果。 - `srcImage=cvLoadImage("D:\\a2.bmp",1);`加载指定路径的图像,1表示保留图像的色彩信息。 - `grayImage=cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_8U,1);`创建与原图大小相同的灰度图像。 - `cvCvtColor(srcImage,grayImage,CV_BGR2GRAY);`将原图转换为灰度图像。 4. **角点检测**:`cvGoodFeaturesToTrack`是OpenCV中用于角点检测的关键函数,其参数包括: - `grayImage`:输入的灰度图像。 - `corners1`:输出的特征角点位置(浮点型)。 - `corners2`:辅助图像,通常用于计算梯度信息。 - `corners`:存储检测到的角点数组。 - `cornersCount`:输出的角点数量。 - `0.05`:质量阈值,表示角点的最小特征值与最大特征值之比。 - `30`:最小边长,限制检测到的角点至少有30个像素的边缘。 - `0`:不使用掩模(全图检测)。 - `3`:最小角点间的欧几里得距离,防止检测到的角点过于密集。 - `0.4`:最小圆角率,用于过滤掉非尖锐的角点。 5. **结果显示**:如果检测到角点,代码会遍历`corners`数组并在原图上画出每个角点,使用`cvCircle`函数绘制圆圈表示角点位置。 这段代码是一个典型的角点检测应用实例,适用于对个人图像进行分析,可以用于诸如目标检测、图像识别等计算机视觉任务。在实际应用中,可能需要根据具体需求调整参数,例如改变`cvGoodFeaturesToTrack`的参数设置,以适应不同场景和图像内容。

% 拍摄标定板,使用单目相机拍摄10张.bmp类型的棋盘格图片 % 保证每张图片拍摄时相机的位置、角度、焦距等参数都不变 % 提取角点,使用Matlab自带的函数detectCheckerboardPoints,提取出每张图片上的棋盘格角点的位置 imageFileNames = {'01.bmp', '02.bmp', '03.bmp', ... '04.bmp', '05.bmp', '06.bmp', '07.bmp', ... '08.bmp', '09.bmp', '10.bmp'}; [imagePoints, boardSize] = detectCheckerboardPoints(imageFileNames); % 标定相机,使用Matlab自带的函数estimateCameraParameters,将每张图片上提取出的角点位置,作为输入,就可以得到相机的内参矩阵K、畸变参数D、旋转矩阵R、平移向量T等参数 squareSize = 2; % 棋盘格尺寸为2mm*2mm worldPoints = generateCheckerboardPoints(boardSize, squareSize); params = estimateCameraParameters(imagePoints, worldPoints, ... 'EstimateSkew', false, 'EstimateTangentialDistortion', false); % 评估标定结果,使用Matlab自带的函数showReprojectionErrors,可以显示出每张图片上提取出的角点位置与通过标定得到的内参矩阵K、畸变参数D、旋转矩阵R、平移向量T计算出的角点位置之间的误差,以评估标定结果的准确性 showReprojectionErrors(params); % 输出标定结果 disp(params.IntrinsicMatrix); disp(params.RadialDistortion); disp(params.TangentialDistortion); disp(params.RotationMatrices); disp(params.TranslationVectors); % 保存相机内外参数为.mat文件 save('camera_params.mat', 'params'); 添加代码需求 输出每张图片的角点提取结果

2023-06-01 上传