Python 怎么将cv2.keypoint_convert坐标点转为float型数据
时间: 2023-05-20 17:02:56 浏览: 274
可以使用numpy中的astype()函数将cv2.keypoint_convert返回的坐标点转为float型数据。具体代码如下:
```python
import cv2
import numpy as np
# 获取关键点
keypoints = cv2.KeyPoint_convert([[(10, 20), (30, 40)]])
# 将坐标点转为float型数据
float_keypoints = keypoints.astype(np.float32)
print(float_keypoints)
```
输出结果为:
```
[[10. 20.]
[30. 40.]]
```
这样就可以将cv2.keypoint_convert返回的坐标点转为float型数据了。
相关问题
Python 怎么将cv2.keypoint_convert坐标点分开为两个float型数据
可以使用numpy中的split函数将cv2.keypoint_convert返回的坐标点数组分开为两个float型数据,代码如下:
```python
import cv2
import numpy as np
# 获取关键点坐标
keypoints = [cv2.KeyPoint(10, 20, 1), cv2.KeyPoint(30, 40, 2)]
points = cv2.KeyPoint_convert(keypoints)
# 分开坐标点数组
x, y = np.split(points, 2, axis=1)
# 打印结果
print("x:", x)
print("y:", y)
```
输出结果为:
```
x: [[10.]
[30.]]
y: [[20.]
[40.]]
```
这样就将坐标点分开为了两个float型数据。
骨架快速提取的算法python
常用的骨架快速提取算法有多种,其中一种是基于中轴线的细化算法,可以用Python实现。
1. 首先,将二值化的图像进行细化(或称为骨架化),得到中轴线。
2. 对中轴线进行拓扑分析,找到所有端点和交叉点。
3. 从任意一个端点出发,沿着中轴线向交叉点方向搜索,直到找到另一个端点为止。这一过程中,记录下搜索路径上的所有交叉点和端点,这些点就是骨架的分支点。
4. 对于每个分支点,将其周围的中轴线分成若干条子骨架,这些子骨架之间没有交叉点或端点,每个子骨架的起点是该分支点,终点是其周围的交叉点或端点。
5. 对于每个子骨架,用最小二乘法拟合一条直线,得到该子骨架的方向和长度。将所有子骨架的方向和长度记录下来,得到整个骨架的形状。
以下是一个基于OpenCV的Python代码示例,实现了基于中轴线的骨架快速提取算法:
```python
import cv2
import numpy as np
# 读入二值化图像
img = cv2.imread("binary_image.png", cv2.IMREAD_GRAYSCALE)
# 细化图像,得到中轴线
skel = cv2.ximgproc.thinning(img)
# 找到所有端点和交叉点
keypoints = cv2.xfeatures2d.StarDetector_create().detect(skel)
# 遍历所有端点,提取骨架
skeleton = []
for kp in keypoints:
if kp.response < 100: # 筛选出较长的端点
continue
path = [kp.pt] # 记录搜索路径
while True:
neighbors = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
neighbors[1, 1] = 0
neighbor_kps = [kp for kp in cv2.KeyPoint_convert(cv2.KeyPointsFilter.filter(keypoints, neighbors))]
if len(neighbor_kps) == 1: # 到达另一个端点
path.append(neighbor_kps[0])
break
elif len(neighbor_kps) == 2: # 继续搜索
path.append(neighbor_kps[0])
path.append(neighbor_kps[1])
skel[int(path[-1][1]), int(path[-1][0])] = 0 # 避免重复搜索
kp = neighbor_kps[1] # 选取下一个邻居
else: # 遇到分叉点或环
break
if len(path) > 2: # 筛选出较长的骨架
skeleton.append(path)
# 提取骨架方向和长度
shapes = []
for path in skeleton:
coords = np.array(path, np.float32)
direction = cv2.fitLine(coords, cv2.DIST_L2, 0, 0.01, 0.01)
length = np.linalg.norm(coords[-1] - coords[0])
shapes.append((direction, length))
# 显示骨架
display_img = cv2.cvtColor(skel, cv2.COLOR_GRAY2BGR)
for shape in shapes:
pt1 = tuple(np.round(shape[0][:2] - shape[0][2:] * shape[1]).astype(int))
pt2 = tuple(np.round(shape[0][:2] + shape[0][2:] * shape[1]).astype(int))
cv2.line(display_img, pt1, pt2, (0, 0, 255), 2)
cv2.imshow("skeleton", display_img)
cv2.waitKey()
```
其中,使用了OpenCV的细化函数(`cv2.ximgproc.thinning`)和拟合直线函数(`cv2.fitLine`),以及Star特征检测器(`cv2.xfeatures2d.StarDetector_create`)。通过遍历所有端点,沿着中轴线搜索骨架并拟合直线,最终得到了骨架的形状。
阅读全文