opencv-python进行识别(下)

继续上一节中对仪表盘的识别,这篇文章将继续讲解用opencv-python库对仪表盘的识别;

对于表盘区域的识别以及确定表盘中心,我采用了霍夫圈变换方法,该方法通过获取图片的角度边缘信息得到Hough梯度,进而确定图片中所显示的圈以及圈的中心。HoughCircles()接受多个参数输入,我将依次为你讲述😝😝,使你运用代码时能更好地调整参数,进而找到目标区域;

python 复制代码
HoughCircles(imgplus, cv2.HOUGH_GRADIENT, dp, minDist, param1=100, param2=50, minRadius=400, maxRadius=700)

imgplus:待处理图像(已使用cv2.imread()读入的变量);

cv2.HOUGH_GRADIENT:检测方法,目前支持的算子有HOUGH_GRADIENT以及HOUGH_GRADIENT_ALT两种;

dp:累加器图像分辨率的反比,是图像像素分辨率与参数空间分辨率的比值。当dp为1时,累加器中图像分辨率与原图像一致,dp为2时,累加器中图像分辨率为原图像一半(是不是觉得累加器听着就像一个计数器,但是累加器听起来level层次就高很多,官方解释是经过处理图像像素的累加);

minDist:检测到的圆集合中两圆心之间的最小距离;

param1:为canny算子中参数的高阈值,canny算子为边缘检测的流行算法,它接受两个阈值调节:minVal和maxVal,分别代表强度梯度大于maxVal的任何边缘必定是边缘,而小于minVal的那些边缘必定是非边缘,param1只需设置一个参数即可,低阈值默认为高阈值的一半;

param2:圆心阈值参数。圆心是通过投票得出的,那么多少票才算是圆心呢?这个值就是确定这个问题的;

minRadius:检测到的圆的最小半径;

maxRadius:检测到的圆的最大半径;

对于表盘指针识别,我采用的是霍夫线变换,该方法常被应用于自动驾驶领域,车机通过识别行车道上的直线来控制车的直线行驶。指针同样具有直线特征,但指针具有两个直线特征,这个需要进行均值计算一下;

python 复制代码
HoughLinesP(edges, 0.9, np.pi / 180, threshold, minLineLength=45, maxLineGap=50)

edges:表示经过canny处理后的图像

rho:参数的分辨率 r ,以像素为单位。我们使用 0.9个像素。

theta:参数的分辨率 θ ,以弧度为单位。我们使用 1 度 (np.pi / 180)

threshold:检测一条线的最小交叉点数

minLineLength,maxLineGap:线段的最大以及最小像素值

下面源码附上,仅需添加img路径即可获得仪表盘区域以及指针😝😝

python 复制代码
    import cv2
    img = cv2.imread('   ')
    # 图像进一步处理
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    imgplus=cv2.medianBlur(gray, 5)

    # 检测圆
    circle = cv2.HoughCircles(imgplus, cv2.HOUGH_GRADIENT, 1, 500, param1=100, param2=50, minRadius=400, maxRadius=700)
    if circle is not None:
        circle = np.around(circle).astype(np.uint16)

    if circle is not None:
        for i in circle[0, :]:
            cv2.circle(img, (i[0], i[1]), i[2], (0, 0, 255), 1)
            imgplus = cv2.GaussianBlur(gray, (3, 3), 0)
            cropped = imgplus[i[1] - i[2] :i[1] + i[2], i[0] - i[2]:i[0] + i[2] ]
            edges = cv2.Canny(cropped, 120, 130, apertureSize=3)
            cv2.circle(img, (i[0]-20, i[1]+30), 5, (0, 0, 255), -1)
    # 检测线段
    lines = cv2.HoughLinesP(edges, 0.9, np.pi / 180, 100, minLineLength=45, maxLineGap=50)

    if lines is not None:
        x1_sum, y1_sum, x2_sum, y2_sum = 0, 0, 0, 0
        count = 0
        for line in lines:
            x1,y1,x2,y2 = line[0]
            cv2.line(img,(x1+i[0] - i[2],y1+i[1] - i[2]),(x2+i[0] - i[2],y2+i[1] - i[2]),(0,255,0),2)
        for line in lines:
            x1, y1, x2, y2 = line[0]
            x1_sum += x1 + i[0] - i[2] 
            y1_sum += y1 + i[1] - i[2] 
            x2_sum += x2 + i[0] - i[2] 
            y2_sum += y2 + i[1] - i[2] 
            count += 1
            if(count>=2):
                break
        if count > 0:
            center = (int(x1_sum / count), int(y1_sum / count))
            center2 = (int(x2_sum / count), int(y2_sum / count))
            cv2.circle(img, center, 5, (0, 0, 255), -1)
            cv2.circle(img, center2, 5, (0, 0, 255), -1)
     cv2.imshow('result',img)
     cv2.waitKey(0)
相关推荐
Mephisto.java24 分钟前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode
robin_suli25 分钟前
滑动窗口->dd爱框框
算法
丶Darling.26 分钟前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
labuladuo52037 分钟前
Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)
数据结构·c++·算法
jiyisuifeng19911 小时前
代码随想录训练营第54天|单调栈+双指针
数据结构·算法
꧁༺❀氯ྀൢ躅ྀൢ❀༻꧂1 小时前
实验4 循环结构
c语言·算法·基础题
新晓·故知1 小时前
<基于递归实现线索二叉树的构造及遍历算法探讨>
数据结构·经验分享·笔记·算法·链表
总裁余(余登武)2 小时前
算法竞赛(Python)-万变中的不变“随机算法”
开发语言·python·算法
Eric.Lee20212 小时前
音频文件重采样 - python 实现
人工智能·python·深度学习·算法·audio·音频重采样
huapiaoy2 小时前
Redis中数据类型的使用(hash和list)
redis·算法·哈希算法