C++ opencv角点检测
时间: 2023-12-30 18:24:10 浏览: 88
opencv二维码定位图案检测(c++)
5星 · 资源好评率100%
以下是C++ OpenCV中的角点检测方法的介绍和示例:
1. Harris角点检测:
```cpp
void cornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, int borderType = BORDER_DEFAULT);
```
该函数用于在输入的8位单通道灰度图像中进行Harris角点检测,并将检测结果保存在输出数组中。参数说明如下:
- `src`:输入图像,必须是8位单通道灰度图像。
- `dst`:输出数组,用于保存Harris角点检测结果,类型为32位浮点数。
- `blockSize`:滑块窗口的尺寸,用于计算每个像素的响应函数。一般取值为2、3、5、7等。
- `ksize`:Sobel边缘检测滤波器的大小,一般取值为3。
- `k`:Harris中间参数,经校验一般取值为0.04到0.06之间。
- `borderType`:插值类型,默认为`BORDER_DEFAULT`。
示例代码:
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat src = imread("image.jpg", 0); // 读取灰度图像
Mat dst;
cornerHarris(src, dst, 2, 3, 0.04);
// 在原图上绘制角点
Mat dst_norm, dst_norm_scaled;
normalize(dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat());
convertScaleAbs(dst_norm, dst_norm_scaled);
for (int i = 0; i < dst_norm.rows; i++)
{
for (int j = 0; j < dst_norm.cols; j++)
{
if ((int)dst_norm.at<float>(i, j) > 100)
{
circle(src, Point(j, i), 5, Scalar(0), 2, 8, 0);
}
}
}
imshow("Harris Corner Detection", src);
waitKey(0);
return 0;
}
```
2. Shi-Tomasi角点检测:
Shi-Tomasi角点检测是一种改进的角点检测算法,相比于Harris角点检测,它在保持稳定性的同时提供了更好的角点检测精度。
示例代码:
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat src = imread("image.jpg", 0); // 读取灰度图像
Mat dst;
vector<Point2f> corners;
goodFeaturesToTrack(src, corners, 100, 0.01, 10);
// 在原图上绘制角点
for (size_t i = 0; i < corners.size(); i++)
{
circle(src, corners[i], 5, Scalar(0), 2, 8, 0);
}
imshow("Shi-Tomasi Corner Detection", src);
waitKey(0);
return 0;
}
```
阅读全文