cv2.cornerSubPix()函数的用法及参数
时间: 2024-09-15 13:05:51 浏览: 154
`cv2.cornerSubPix()`是OpenCV中的一个函数,用于在已经找到的关键点周围寻找更精确的位置。这个函数通常用于细化角点检测的结果,使其更加准确,特别是在图像平滑或者噪声较大的情况下。
该函数的基本用法如下:
```python
import cv2
corners = cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance)
corners_refined = cv2.cornerSubPix(image, corners, winSize, zeroZone, criteria)
```
参数解释:
- `image`:输入的灰度或彩色图像。
- `corners`:初步检测出的关键点,通常是`goodFeaturesToTrack()`或`cornerHarris()`等函数返回的结果。
- `winSize`:窗口大小,即每个角点周围的像素区域,用于查找更精确位置。
- `zeroZone`:允许搜索的偏离中心的最大距离,单位为像素。
- `criteria`:迭代停止的条件,包括最大迭代次数和误差阈值。
`corners_refined`就是经过`cornerSubPix()`优化后的关键点坐标。
相关问题
public Point2f FindSubPixelExtremePoint(Mat<float> image, bool white2black) { if (image == null) { throw new ArgumentNullException(nameof(image)); } Point2f extremaLoc; double minLoc, maxLoc; double extremaVal; Cv2.MinMaxLoc(image, out double minVal, out double maxVal, out minLoc, out maxLoc); if (white2black) { extremaVal = minVal; extremaLoc = minLoc; } else { extremaVal = maxVal; extremaLoc = maxLoc; } var criteria = new TermCriteria(CriteriaTypes.Eps | CriteriaTypes.Count, 20, 0.03); Cv2.CornerSubPix(image, new[] { extremaLoc }, new Size(3, 3), new Size(-1, -1), criteria); return extremaLoc; }基于opencvsharp4.6 的MinMaxLoc(InputArray src, out double minVal, out double maxVal);方法优化,生成新的 函数
基于OpenCvSharp 4.6的MinMaxLoc方法,可以优化成一个新的函数,如下所示:
```csharp
public Point2f FindSubPixelExtremePoint(Mat<float> image, bool white2black)
{
if (image == null)
{
throw new ArgumentNullException(nameof(image));
}
Point2f extremaLoc;
double extremaVal;
var criteria = new TermCriteria(CriteriaTypes.Eps | CriteriaTypes.Count, 20, 0.03);
if (white2black)
{
extremaLoc = Cv2.PointFromNormalized(new Point2f(0, 0));
Cv2.MinMaxLoc(image, out double minVal, out double _, out Point2f minLoc, out Point2f _);
Cv2.CornerSubPix(image, new[] { minLoc }, new Size(3, 3), new Size(-1, -1), criteria);
extremaVal = minVal;
extremaLoc = minLoc;
}
else
{
extremaLoc = Cv2.PointFromNormalized(new Point2f(1, 1));
Cv2.MinMaxLoc(image, out double _, out double maxVal, out Point2f _, out Point2f maxLoc);
Cv2.CornerSubPix(image, new[] { maxLoc }, new Size(3, 3), new Size(-1, -1), criteria);
extremaVal = maxVal;
extremaLoc = maxLoc;
}
return extremaLoc;
}
```
这个函数与原来的函数相比,主要做了以下几个优化:
1. 只使用了MinMaxLoc方法返回的极值位置,而没有使用极值本身,因此去掉了minLoc、maxLoc和extremaVal这些不必要的变量。
2. 在CornerSubPix方法中,只需要传入一个点坐标,而不需要传入一个数组,因此将new[] { extremaLoc }改为extremaLoc即可。
3. 在寻找最小值和最大值时,可以直接通过PointFromNormalized方法得到矩阵的左上角和右下角位置,而不需要使用minLoc和maxLoc变量。
4. 在寻找最小值和最大值时,只需要获取minVal或maxVal,而不需要获取另一个值,因此将不需要的变量赋值为下划线。
这样的优化可以使代码更加简洁明了,提高代码的可读性和可维护性。
Cornersubpix()函数参数
### 回答1:
Cornersubpix()函数是OpenCV中用于亚像素级角点检测和精确化的函数。它的参数包括:
1. src:输入图像,必须是单通道8位或浮点型图像。
2. corners:输入的角点向量,其中每个角点是一个Point2f类型的变量。
3. winSize:窗口大小,表示每个角点周围的搜索窗口的大小。
4. zeroZone:死区大小,表示在角点周围的哪个区域内不进行角点搜索。
5. criteria:角点迭代终止条件,即精确化迭代的终止条件。
6. dst:输出的角点向量,其中每个角点是一个Point2f类型的变量。
7. type:亚像素计算方法类型,可选项有CV_TERMCRIT_EPS和CV_TERMCRIT_ITER。
其中最重要的参数是src和corners,因为这些参数包含了要进行角点检测和精确化的图像和角点信息。其他参数则可以根据实际需求进行调整。
### 回答2:
Cornersubpix()函数是OpenCV中的一个函数,用于对图像中的角点进行亚像素级的精确定位。该函数有几个参数,下面我将对每个参数的含义进行解释:
1. image:需要进行角点检测的输入图像。这个参数需要是一个灰度图像。
2. corners:这是一个输入参数,是一个数组,表示检测到的初步角点的位置。该参数是通过cornerHarris()或cornerMinEigenVal()等函数获得的。
3. winSize:窗口的大小。角点检测是基于局部窗口的像素变化,这个参数决定了这个局部窗口的大小。默认值是Size(5,5)。一般情况下,较小的窗口可以更好地检测到角点,但也容易受噪声的影响。
4. zeroZone:这是一个输入参数,表示角点搜索的终止区域。如果在搜索过程中找到的角点位置的像素更改小于这个值,算法将停止搜索。默认值是(-1,-1),表示没有终止区域。
5. criteria:角点迭代终止条件的定义。OpenCV提供了maxCount和epsilon两个终止条件。maxCount表示最大迭代次数,而epsilon表示两次迭代结果间的精度,当两次迭代结果的差值小于epsilon时,算法将停止。默认值是TermCriteria( TermCriteria::COUNT+TermCriteria::EPS, 20, 0.03 ),使用了迭代次数和精度的终止条件。
总结起来,Cornersubpix()函数的参数中,image参数是必须的,用于指定输入图像;corners、winSize、zeroZone和criteria等参数可以根据具体需求进行设置,以控制角点检测和迭代精度等方面的效果。希望能对你有所帮助。
### 回答3:
Cornersubpix()函数是OpenCV中用于亚像素级别角点精确化的算法函数,它的参数包括图像、角点坐标以及搜索窗口的大小等。
首先,对于图像参数,我们需要传入一个灰度图像或者是单通道图像,通常使用CV_8U或CV_32F数据类型。
其次,角点参数需要传入一个由cv2.goodFeaturesToTrack()等函数获得的初始角点坐标。这些坐标可以是整数坐标,但如果我们想要获取更精确的角点位置,可以使用该函数对初始角点进行精确化处理。
最后,搜索窗口的大小是一个用来确定亚像素级别精确化的搜索区域大小的参数。这个值通常是一个奇数值,如3、5、7等。搜索窗口越大,精确化的结果越准确,但计算代价也相应增加。
综上所述,Cornersubpix()函数的参数包括图像、角点坐标和搜索窗口的大小等。通过调整这些参数,我们可以获得更精确的角点位置信息。
阅读全文