首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何准确检测和定位汽车保险丝?

如何准确检测和定位汽车保险丝?
EN

Stack Overflow用户
提问于 2021-02-28 22:29:57
回答 1查看 70关注 0票数 0

目前我正在做一个项目,我需要测量汽车保险丝的宽度。为了实现这一点,我需要检测和定位图像上的保险丝。fuse_image

我的计划是用保险丝找到边界矩形区域,然后在该区域的固定位置搜索导线轮廓。fuse_contours

我已经尝试了ORB,基于快速特征的模板匹配,但结果是不可接受的。也许任何人都可以提出一些可能的方法来解决这个任务?

EN

回答 1

Stack Overflow用户

发布于 2021-03-01 01:30:15

我们可以通过应用Canny操作来查看图像的特征来开始解决问题。结果是:

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

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

我们如何找到基本特征坐标?

  • 蓝点是y坐标值最高的点

  • 红点是具有最高x坐标值的点

对于所有检测到的线坐标,我们需要找到具有相应x坐标值的最高y坐标值。我们需要找到最高的x坐标值和相应的y值。

对于检测线坐标,我们可以使用fast line detector。结果将是:

我们可以计算欧几里得距离,它将是: 146.49像素

这个想法是基于找到基,然后计算欧几里德距离。

更新

保险丝的方向可以是随机的。

首先,我们需要得到图像的熔丝部分。

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

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

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

我们会得到保险丝的大致长度。

那么我们如何找到保险丝的左右两部分呢?

  • 查找左侧部分:

代码语言:javascript
复制
-  1. From the current x1, x2 tuples 2. If min(x1, x2) < x\_min 3.     x\_min = min(x1, x2)

  • 查找正确的部分:

代码语言:javascript
复制
-  1. From the current x1, x2 tuples 2. If max(x1, x2) > x\_max 3.     x\_max = max(x1, x2)

这是我处理这个问题的想法。您可以进行修改以获得更好的结果。

代码:

代码语言:javascript
复制
# 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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66410108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档