opencv c++中的canny语法
时间: 2023-12-24 21:03:18 浏览: 63
在OpenCV C++中,Canny函数的语法如下:
```c++
void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false);
```
其中各个参数的含义如下:
- `InputArray image`:输入的单通道图像,可以是灰度图像或者是单通道的彩色图像。
- `OutputArray edges`:输出的二值图像,其中白色像素表示边缘,黑色像素表示非边缘。
- `double threshold1`:第一个阈值,用于进行边缘连接。
- `double threshold2`:第二个阈值,用于进行边缘断开。
- `int apertureSize`:Sobel算子的大小,可以是1、3、5或者7,默认值为3。
- `bool L2gradient`:一个布尔值,用于指定是否使用更精确的L2范数来计算图像梯度,默认值为false。
需要注意的是,Canny函数只能处理单通道图像,如果需要对多通道图像进行边缘检测,则需要将其转换为灰度图像或者单通道的彩色图像。
相关问题
opencv c++中findcontours语法
在OpenCV C++中,`findContours`函数的语法如下:
```c++
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point());
```
其中,参数含义如下:
- `image`:输入的二值图像,通常为经过边缘检测后得到的图像。
- `contours`:输出的轮廓,为一个`vector<vector<Point> >`类型的数组,其中每个元素表示一个轮廓,包含一系列点的坐标。
- `hierarchy`:输出的轮廓的层级关系,为一个`vector<Vec4i>`类型的数组,其中每个元素包含四个整数,分别表示当前轮廓的父轮廓、子轮廓、内嵌轮廓和外层轮廓的索引。
- `mode`:轮廓检索模式,可以取以下值:
- `RETR_EXTERNAL`:只检索最外层的轮廓。
- `RETR_LIST`:检索所有轮廓,但不建立轮廓间的层级关系。
- `RETR_CCOMP`:检索所有轮廓,并将轮廓分为两层:顶层为各部分的外部边界,次层为空洞的边界。
- `RETR_TREE`:检索所有轮廓,并重构嵌套轮廓的完整层级关系。
- `method`:轮廓逼近方法,可以取以下值:
- `CHAIN_APPROX_NONE`:保存物体边界上所有连续的轮廓点到contours向量内。
- `CHAIN_APPROX_SIMPLE`:压缩水平、垂直和对角线方向上的像素,仅保留终点坐标。
- `CHAIN_APPROX_TC89_L1`:使用Teh-Chin链逼近算法中的L1距离。
- `CHAIN_APPROX_TC89_KCOS`:使用Teh-Chin链逼近算法中的Kcos距离。
- `offset`:可选的偏移量,用于指定轮廓点坐标的偏移值。
例如,在检测最外层轮廓并使用简单的轮廓逼近方法时,可以这样调用`findContours`函数:
```c++
Mat img = imread("test.jpg", IMREAD_GRAYSCALE);
Mat img_canny;
Canny(img, img_canny, 100, 200);
vector<vector<Point>> contours;
findContours(img_canny, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
```
这将读入名为`test.jpg`的灰度图像,对其进行Canny边缘检测,并在其中寻找最外层轮廓,使用简单的轮廓逼近方法。最终,找到的轮廓将存储在`contours`向量内。
c++ opencv canny调用
在OpenCV中,Canny算子是一种边缘检测算法,用于从图像中识别出边缘。Canny算子由John F. Canny于1986年提出,它包括两个步骤:
1. **高斯滤波**(Gaussian Blurring):首先对输入图像应用高斯滤波器,去除噪声并平滑图像,使得边缘检测结果更稳定。
2. **计算梯度**(Gradient Calculation):接着计算每个像素点的梯度幅值和方向。这通常通过 Sobel 或者 Scharr 算子完成,它们分别求得水平和垂直方向上的梯度。
3. **非极大值抑制**(Non-Maximum Suppression, NMS):消除响应强度不是最大值但与其相邻像素强度较高的伪边缘。
4. **双阈值处理**(Hysteresis Thresholding):设置低阈值和高阈值,对于小于低阈值的边缘忽略,大于高阈值的视为强边缘,介于两者之间的边缘只有当其连接了高阈值边缘才被认为是真正边缘。
在OpenCV中,你可以使用`cv::Canny()`函数来调用Canny算法。基本语法如下:
```cpp
Mat src, edges; // src是输入图像,edges是输出结果
cvtColor(src, gray, COLOR_BGR2GRAY); // 转换到灰度图
Canny(gray, edges, lowThreshold, highThreshold, apertureSize);
```
其中参数说明如下:
- `gray`: 输入灰度图像。
- `edges`: 输出边缘检测后的图像。
- `lowThreshold` 和 `highThreshold`: 分别是低阈值和高阈值。
- `apertureSize`: 梯度算子的大小,默认为3。
阅读全文