c++opencv角点检测绘制
时间: 2025-06-20 09:40:17 浏览: 13
### 使用 C++ 和 OpenCV 进行角点检测并绘制结果
为了实现这一目标,可以采用 `cv::cornerHarris` 函数来执行 Harris 角点检测,并利用绘图函数将这些角点标记到原始图像上。下面提供了一个完整的例子说明如何完成这项工作。
#### 加载库与初始化变量
首先确保已经包含了必要的头文件,并定义了一些基本参数:
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main() {
Mat img, gray; // 原始图片和灰度化后的图片
vector<Point> corners; // 存储找到的角点位置
// 载入测试图像
img = imread("path_to_image.jpg");
if(img.empty()){
cout << "Could not open or find the image!" << endl ;
return -1;
}
}
```
#### 执行 Harris 角点检测
接着转换成灰度模式并对图像应用 Harris 变换计算响应值矩阵:
```cpp
cvtColor(img, gray, COLOR_BGR2GRAY);
gray.convertTo(gray, CV_32F);
// 定义用于存储Harris角点响应值的结果矩阵
Mat harris_dst = Mat::zeros(gray.size(), CV_32FC1);
// 应用Harris角点检测算法
cornerHarris(gray, harris_dst, 2, 3, 0.04);
// 对harris_dst中的负数置零处理以便后续操作
normalize(harris_dst, harris_dst, 0, 255, NORM_MINMAX);
convertScaleAbs(harris_dst, harris_dst);
threshold(harris_dst, harris_dst, 0.01 * harris_dst.maxVal(), 255, THRESH_BINARY)[^4];
```
#### 提取显著角点坐标
通过遍历整个响应值矩阵寻找局部极大值作为候选角点的位置:
```cpp
for(int y=0;y<harris_dst.rows;++y){
uchar* row_ptr = harris_dst.ptr<uchar>(y);
for(int x=0;x<harris_dst.cols;++x){
if(row_ptr[x]==255){ // 如果该像素是极值,则认为是一个角点
Point p(x,y);
circles.push_back(p);
// 绘制红色圆形表示角点所在位置
circle(img,p,3,Scalar(0,0,255),-1,CV_AA);
}
}
}
```
#### 显示带有标注角点的图像
最后一步就是展示经过处理之后含有明显标志物的新版本图像给用户查看:
```cpp
imshow("Detected Corners",img);
waitKey();
return 0;
}
```
上述代码片段展示了怎样使用 C++ 结合 OpenCV 来识别二维平面内的关键特征点即所谓的“角”。这种方法非常适合于计算机视觉领域内诸如物体跟踪、三维重建等应用场景之中。
阅读全文
相关推荐


















