Opencv+Python检测两红外线末端的距离(采用inRange和小技巧完成)

  • 开始检测前首先对图像进行处理
    • 处理的思路有很多种:
  1.         深度学习获得红线的位置, 这个没时间就不展示了
  2.         为了能快速进行图像的处理,这里采用了TrackBar滑动条提取图像红线的信息, 这里讲一下一些关于的用法,要注意的是这个方法鲁棒性特别差。
    1. TrackBar:         cv2.的一个滑动条函数,能够使变量通过滑动的方式调整。   
    2. 首先就是在本文中的用法, 利用TrackBar提取图像特定的颜色。
    3. 第二种,利用TrackBar调整Canny的值,可以快速得到图像的想要的轮廓。
    4. 第三种, 利用TrackBar调整二值化的值,获得想要的信息。
    5. 还能调整滤波​​​​​​​​,获得自已想要的前景和背景。
    6. 本文通过TrackBar调整Hsv的代码会放在后面.
  3. 经过图像处理后,我们以及获取到我们想要的图像了,之后就可以利用cv2的函数进行获取距离, 大概简单的思路
    1. ​​​​​​通过简单的Canny获取激光的轮廓
    2. 霍夫变换,鲁棒性也是比较差的有时间的话最好还是通过深度学习的方式来获取坐标
    3. 获取到一条直线坐标(x1, y1, x2, y2)后   [要注意的是,这里X1 == X2]
    4. 将所有直线的x坐标输出来,你会发现检测了很多条没用的直线,这是因为图像的激光并不是直的所以这个检测出很多直线,那我们只要将X坐标偏差一点点的全都取平均数就好了,这里我是直接取一个用了,然后X坐标差值大的自然就是宁外一段激光了,
      1. ​​​​​​​这里还有一种比较好的办法就是对两条线段取外接矩形获取那个矩形末端的两个坐标取​​​​​​​平均值来算距离

开始上测试图和代码

                                        目标图像(素材图)

                

 Hsv图像处理

不同的图像Hsv都要重新调整,因为光照因素的都不一样,这也就是为什么鲁棒性差

这是测试的图像 

 最终处理的结果

                 看到抗揍云的代码都没什么人下, 我就直接放出来了

TrackBar代码,在这里调整好数值去最后的测试代码上Hsv的最大值和最小值

import cv2
import numpy as np
import numpy as py
img = cv2.imread("01.jpg")

def empyt(sum):
    pass

cv2.namedWindow('TrackBar')
cv2.resizeWindow('TrackBar', 640, 320)

cv2.createTrackbar("Hue Min", 'TrackBar', 0, 179, empyt)
cv2.createTrackbar("Hue Max", 'TrackBar', 179, 179, empyt)
cv2.createTrackbar("Sat Min", 'TrackBar', 0, 255, empyt)
cv2.createTrackbar("Sat Max", 'TrackBar', 255, 255, empyt)
cv2.createTrackbar("Val Min", 'TrackBar', 0, 255, empyt)
cv2.createTrackbar("Val Max", 'TrackBar', 255, 255, empyt)

hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
while 1:
    h_min = cv2.getTrackbarPos("Hue Min", 'TrackBar')
    h_max = cv2.getTrackbarPos("Hue Max", 'TrackBar')
    s_min = cv2.getTrackbarPos("Sat Min", 'TrackBar')
    s_max = cv2.getTrackbarPos("Sat Max", 'TrackBar')
    v_min = cv2.getTrackbarPos("Val Min", 'TrackBar')
    v_max = cv2.getTrackbarPos("Val Max", 'TrackBar')
    print(h_min, h_max, s_min, s_max, v_min, v_max)

    lower = np.array([h_min, s_min, v_min])
    upper = np.array([h_max, s_max, v_max])

    mask = cv2.inRange(hsv_img, lower, upper)
    result = cv2.bitwise_and(img, img, mask=mask)

    cv2.namedWindow('mask', 0)
    cv2.resizeWindow('mask',  (405, 394))
    cv2.namedWindow('img', 0)
    cv2.resizeWindow('img', (405, 394))
    cv2.namedWindow('hsv_img', 0)
    cv2.resizeWindow('hsv_img', (405, 394))
    cv2.namedWindow('result', 0)
    cv2.resizeWindow('result', (405, 394))
    cv2.imshow("mask", mask)
    cv2.imshow("img", img)
    cv2.imshow("hsv_img", hsv_img)
    cv2.imshow("result", result)
    cv2.waitKey(1)


cv2.waitKey()

Text的代码

import numpy as np
import cv2


def findLine(img):
    hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    lower = np.array([0, 0, 242])
    upper = np.array([38, 48, 255])

    mask = cv2.inRange(hsv_img, lower, upper)
    result = cv2.bitwise_and(img, img, mask=mask)
    # cv2.imshow("result", result)
    return result

def HoughLine(img):
    img = cv2.medianBlur(img, 5)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img = cv2.Canny(img, 150, 200)
    cv2.namedWindow('Canny', 0)
    cv2.resizeWindow('Canny', (405, 394))
    cv2.imshow("Canny", img)


    lines = cv2.HoughLinesP(img, 1,  np.pi/180,  7,  20,  20)
    i = 0

    for line in lines:

        x1, y1, x2, y2 = line[0]
        i+=1
        print('This  Line',i, x1)
        cv2.line(img, (x1, y1), (x2, y2), (255,22,255), 3)

        if i == 4:
            print('This  Line', i, x1,y1)
            cv2.line(img, (x1, y1), (165, y1), (255,20,25), 5)
            return x1, y1
    cv2.imshow("HoughLine", img)
def Result(img, x1, y1):
    cv2.line(img, (x1, y1), (165, y1), (255, 20, 25), 5)
    print('两激光线长', x1 - 165)
    cv2.namedWindow('Result', 0)
    cv2.resizeWindow('Result',  (405, 394))
    cv2.imshow("Result", img)


while True:
        img = cv2.imread("01.jpg")
        imgResult = img.copy()
        cv2.resize(img, (405, 394))

        img = findLine(img)

        x1, y1 =  HoughLine(img)
        Result(imgResult, x1, y1)
        cv2.waitKey()

 有什么代码上有不懂的(毕竟里边都是没打注释的[doge])都可以来群954736632

        欢迎在线打扰

最后如果你Opencv学完基础了,可以尝试借用mediapipe的库完成一些基于谷歌开源的模型进行一些练习, 你也可以尝试一些学习深度学习,比较有用的教程

  • CvZone的一个官网(一些小项目里边都有教学,可惜后边比较进阶的都要钱)

        

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值