如何使用OpenCV进行Canny边缘检测?
时间: 2024-06-21 22:02:34 浏览: 99
OpenCv实现Canny边缘检测
5星 · 资源好评率100%
OpenCV是一个强大的计算机视觉库,其中包含了许多图像处理和计算机视觉算法,包括Canny边缘检测。Canny边缘检测是一种广泛用于图像处理的边缘检测算法,它能有效地分离出图像中的边缘,同时减少噪声的影响。以下是使用OpenCV在C++中进行Canny边缘检测的基本步骤:
1. **导入必要的库**:
```cpp
#include <opencv2/opencv.hpp>
```
2. **读取图像**:
```cpp
cv::Mat image = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE); // 读取灰度图像
```
3. **转换为浮点型**:
```cpp
Mat floatImage;
image.convertTo(floatImage, CV_32F);
```
4. **高斯滤波**:
使用`cv::GaussianBlur()`降低图像噪声,这是Canny算法的第一步:
```cpp
cv::GaussianBlur(floatImage, floatImage, cv::Size(3, 3), 0);
```
5. **计算梯度(Sobel算子)**:
```cpp
cv::Mat gradX, gradY;
cv::Sobel(floatImage, gradX, CV_32F, 1, 0, 3); // 对x轴进行梯度计算
cv::Sobel(floatImage, gradY, CV_32F, 0, 1, 3); // 对y轴进行梯度计算
```
6. **计算梯度幅值和方向**:
```cpp
Mat absGradX = cv::abs(gradX);
Mat absGradY = cv::abs(gradY);
Mat gradientMag, gradientAng;
cv::cartToPolar(absGradX, absGradY, gradientMag, gradientAng, true);
```
7. **非极大值抑制**:
这一步消除强度较小但方向相同的边缘:
```cpp
cv::Canny(gradientMag, threshold1, threshold2, gradientAng);
```
8. **边缘连接**:
```cpp
std::vector<std::vector<cv::Point>> contours;
cv::findContours(threshold1, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
```
9. **显示结果**:
```cpp
cv::drawContours(image, contours, -1, Scalar(0, 0, 255), 2);
cv::imshow("Canny Edges", image);
cv::waitKey(0);
```
阅读全文