介绍cv2.goodFeaturesToTrack
时间: 2023-07-02 07:20:31 浏览: 176
`cv2.goodFeaturesToTrack` 是 OpenCV 中用于检测图像中角点的函数,它实现了 Shi-Tomasi 角点检测算法。与传统的 Harris 角点检测算法相比,Shi-Tomasi 算法在保持较高的检测精度的同时,计算速度更快,因此在实际应用中更加常用。
`cv2.goodFeaturesToTrack` 的输入参数包括:
- `image`:待检测的灰度图像。
- `maxCorners`:检测到的角点数量的最大值。
- `qualityLevel`:角点的最低质量,取值在 0 到 1 之间。
- `minDistance`:检测到的角点之间的最小距离。
- `corners`:初始角点位置的估计值,可以为 None。
- `mask`:掩膜图像,用于指定检测区域,可以为 None。
- `blockSize`:角点检测中使用的窗口大小。
- `useHarrisDetector`:是否使用 Harris 角点检测算法。
- `k`:Harris 角点检测算法中的自由参数。
`cv2.goodFeaturesToTrack` 的输出结果是一个二维数组,每一行表示一个检测到的角点的坐标。可以通过绘制圆圈或者矩形来显示检测到的角点。
相关问题
import cv2 import numpy as np img = cv2.imread('021.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) corners = cv2.goodFeaturesToTrack(gray, 200, 0.01, 20) corners = np.round(corners).astype(int) print(corners)如何对corners进行排序
你可以根据corners的坐标进行排序,按照x坐标或者y坐标进行升序或降序排序。下面是一个按照x坐标升序排序的示例代码:
```
sorted_corners = sorted(corners, key=lambda x: x[0])
```
这里使用了Python的内置函数sorted(),并且通过lambda表达式指定了按照x坐标进行排序。如果你想按照其他方式进行排序,只需要修改lambda表达式即可。
改进下面代码使其输出特征点连线图和拼接图import cv2 # 读取图片 img1 = cv2.imread("qiao1.jpg") img2 = cv2.imread("qiao2.jpg") # 转换为灰度图像 gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) # Shi-Tomasi角点检测 corners1 = cv2.goodFeaturesToTrack(gray1, 25, 0.01, 10) corners2 = cv2.goodFeaturesToTrack(gray2, 25, 0.01, 10) # 计算光流 lk_params = dict(winSize=(15, 15), maxLevel=2, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)) p1, st, err = cv2.calcOpticalFlowPyrLK(gray1, gray2, corners1, None, **lk_params) # 筛选匹配点 good_new = p1[st == 1] good_old = corners1[st == 1] # 计算变换矩阵 M, _ = cv2.findHomography(good_new, good_old, cv2.RANSAC) # 进行透视变换 result = cv2.warpPerspective(img2, M, (img1.shape[1] + img2.shape[1], img2.shape[0])) result[0:img1.shape[0], 0:img1.shape[1]] = img1 # 保存拼接结果 cv2.imwrite("result.jpg", result)
可以改进代码如下:
```python
import cv2
# 读取图片
img1 = cv2.imread("qiao1.jpg")
img2 = cv2.imread("qiao2.jpg")
# 转换为灰度图像
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# Shi-Tomasi角点检测
corners1 = cv2.goodFeaturesToTrack(gray1, 25, 0.01, 10)
corners2 = cv2.goodFeaturesToTrack(gray2, 25, 0.01, 10)
# 计算光流
lk_params = dict(winSize=(15, 15), maxLevel=2,
criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
p1, st, err = cv2.calcOpticalFlowPyrLK(gray1, gray2, corners1, None, **lk_params)
# 筛选匹配点
good_new = p1[st == 1]
good_old = corners1[st == 1]
# 计算变换矩阵
M, _ = cv2.findHomography(good_new, good_old, cv2.RANSAC)
# 进行透视变换
result = cv2.warpPerspective(img2, M, (img1.shape[1] + img2.shape[1], img2.shape[0]))
result[0:img1.shape[0], 0:img1.shape[1]] = img1
# 画出特征点连线图
for i, (new, old) in enumerate(zip(good_new, good_old)):
a, b = new.ravel()
c, d = old.ravel()
cv2.line(result, (a, b), (c, d), (0, 0, 255), 2)
# 拼接图
cv2.imwrite("result.jpg", result)
```
在原有的代码基础上,我们新增了以下代码:
1. 画出特征点连线图
```python
for i, (new, old) in enumerate(zip(good_new, good_old)):
a, b = new.ravel()
c, d = old.ravel()
cv2.line(result, (a, b), (c, d), (0, 0, 255), 2)
```
这段代码使用 `cv2.line()` 函数画出了特征点的连线,并将其绘制在拼接图上。其中,`good_new` 和 `good_old` 分别是筛选出的匹配点的新旧坐标,`ravel()` 函数用于将其展平为一维数组,然后使用 `cv2.line()` 函数连接两个点。
2. 输出拼接图
```python
cv2.imwrite("result.jpg", result)
```
这段代码使用 `cv2.imwrite()` 函数输出拼接图。
阅读全文