目前我正在做一个项目,我需要测量汽车保险丝的宽度。为了实现这一点,我需要检测和定位图像上的保险丝。fuse_image
我的计划是用保险丝找到边界矩形区域,然后在该区域的固定位置搜索导线轮廓。fuse_contours
我已经尝试了ORB,基于快速特征的模板匹配,但结果是不可接受的。也许任何人都可以提出一些可能的方法来解决这个任务?
发布于 2021-03-01 01:30:15
我们可以通过应用Canny操作来查看图像的特征来开始解决问题。结果是:

目的是计算宽度。因此,我们只需要图像的左边和右边的外部长度。我们不需要内线。为了去除图像的内部特征,我们可以对图像进行smooth。

我们如何准确地计算宽度?我们可以参考这些特性的哪些部分?如果我们考虑基数呢?基本功能包括:

我们如何找到基本特征坐标?
对于所有检测到的线坐标,我们需要找到具有相应x坐标值的最高y坐标值。我们需要找到最高的x坐标值和相应的y值。
对于检测线坐标,我们可以使用fast line detector。结果将是:

我们可以计算欧几里得距离,它将是: 146.49像素
这个想法是基于找到基,然后计算欧几里德距离。
更新
保险丝的方向可以是随机的。
首先,我们需要得到图像的熔丝部分。

其次,我们需要获取canny特性(或任何其他过滤方法)

此时,我们需要找到保险丝的左侧(蓝点)和右侧(红点)部分:

如果我们把它们连接起来:

我们会得到保险丝的大致长度。
那么我们如何找到保险丝的左右两部分呢?
- 1. From the current x1, x2 tuples 2. If min(x1, x2) < x\_min 3. x\_min = min(x1, x2)- 1. From the current x1, x2 tuples 2. If max(x1, x2) > x\_max 3. x\_max = max(x1, x2)这是我处理这个问题的想法。您可以进行修改以获得更好的结果。
代码:
# Load libraries
import cv2
import numpy as np
# Load the image
img = cv2.imread("E8XlZ.jpg")
# Get the image dimension
(h, w) = img.shape[:2]
# Convert to hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# Get the binary-mask
msk = cv2.inRange(hsv, np.array([0, 24, 161]), np.array([77, 255, 217]))
# Display the mask
cv2.imshow("msk", msk)
cv2.waitKey(0)
# Smooth the image
gauss = cv2.GaussianBlur(msk, (21, 21), 0)
# Canny features
cny = cv2.Canny(gauss, 50, 200)
# Display canny features
cv2.imshow("cny", cny)
cv2.waitKey(0)
# Initialize line-detector
lns = cv2.ximgproc.createFastLineDetector().detect(cny)
# Initialize temporary variables
x_min, x_max, y_min, y_max = w, 0, 0, 0
# Detect the lines
for line in lns:
# Get current coordinates
x1 = int(line[0][0])
y1 = int(line[0][1])
x2 = int(line[0][2])
y2 = int(line[0][3])
# Get maximum coordinates
if max(x1, x2) > x_max:
x_max = max(x1, x2)
y_max = y1 if x_max == x1 else y2
if min(x1, x2) < x_min:
x_min = min(x1, x2)
y_min = y1 if x_min == x1 else y2
# Draw the points
cv2.circle(img, (x_min, int((y_min + y_max)/2)), 3, (255, 0, 0), 5)
cv2.circle(img, (x_max, int((y_min + y_max)/2)), 3, (0, 0, 255), 5)
# Write coordinates to the console
print("Coordinates: ({}, {})->({}, {})".format(x_min, int((y_min + y_max)/2), x_max, int((y_min + y_max)/2)))
# Draw the minimum and maximum coordinates
cv2.line(img, (x_min, int((y_min + y_max)/2)), (x_max, int((y_min + y_max)/2)), (0, 255, 0), 5)
# Calculate the euclidean distance
pt1 = np.array((x_min, int((y_min + y_max)/2)))
pt2 = np.array((x_max, int((y_min + y_max)/2)))
dist = np.linalg.norm(pt1 - pt2)
print("Result: %.2f pixel" % dist)
# Display the result
cv2.imshow("img", img)
cv2.waitKey(0)https://stackoverflow.com/questions/66410108
复制相似问题