• opencv交互式调整视觉算法参数(一)-图像阈值参数


    交互式调整视觉算法参数(一)-图像阈值参数

    目标:

    • 使用trackbar对阈值的参数进行动态调整,确认较好的阈值参数
    • 使用交互式方式调参,直观感受算法参数的作用

    0.代码效果展示

    在这里插入图片描述

    动态效果gif查看

    1.代码详细说明

    首先导入需要的库,包括opencv-python库

    import cv2 as cv
    
    • 1

    接下来是trackbar的回调函数,这里什么都不需要做pass就可以了

    def nothing(x):
        pass
    
    • 1
    • 2

    然后设置一些全局参数,方便对经常改动参数进行修改:

    track_win_name = "trackbar window"
    pic_path = "wechat.png"
    
    • 1
    • 2

    读取图片,并将图片进行灰度化,并给窗口起个名字,方便后面使用:

    img = cv.imread(pic_path, 1)
    img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    cv.namedWindow(track_win_name)
    
    • 1
    • 2
    • 3

    接下来是代码的重点部分,使用函数cv.crateTrackbar(para1, para2, para3, para4, para5)创建两个trackbar,分别对应阈值的最小值和最大值,其中参数的详尽含义如下:

    • para1:trackbar前面会显示的名字
    • para2:trackbar会放到的窗口名字
    • para3:打开窗口滑块默认的起始位置
    • para4:该trackbar对应的参数能调节的范围(从0开始),如para4为255,表示该trackbar调参范围为0-255
    • para5:拖动滑块后的回调函数
    # create trackbars for threshold change
    cv.createTrackbar('thres_min', track_win_name, 0, 255, nothing)
    cv.createTrackbar('thres_max', track_win_name, 255, 255, nothing)
    
    • 1
    • 2
    • 3

    然后是一个while循环,根据滑块的移动动态刷新图像结果,按下esc键退出窗口。

    while(1):
    
        # your code is here
    
        k = cv.waitKey(1) & 0xFF
        if k == 27:
            break
    cv.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    最后是循环体中的主要代码:

        thres_min = cv.getTrackbarPos('thres_min', track_win_name)
        thres_max = cv.getTrackbarPos('thres_max', track_win_name)
        ret, img_after_interaction = cv.threshold(img, thres_min, thres_max, cv.THRESH_BINARY)
        cv.imshow(track_win_name, img_after_interaction)
    
    • 1
    • 2
    • 3
    • 4

    读取trackbar当前位置对应的数值,并将其作为参数传入到阈值函数中,然后用opencv显示调整后的图像结果。

    2.完整代码

    import cv2 as cv
    
    def nothing(x):
        pass
    
    # settings
    track_win_name = "trackbar window"
    pic_path = "wechat.png"
    
    # read picture
    img = cv.imread(pic_path, 1)
    img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    cv.namedWindow(track_win_name)
    
    # create trackbars for threshold change
    cv.createTrackbar('thres_min', track_win_name, 0, 255, nothing)
    cv.createTrackbar('thres_max', track_win_name, 255, 255, nothing)
    
    # dynamic update
    while(1):
        # get current positions of four trackbars
        thres_min = cv.getTrackbarPos('thres_min', track_win_name)
        thres_max = cv.getTrackbarPos('thres_max', track_win_name)
        ret, img_after_interaction = cv.threshold(img, thres_min, thres_max, cv.THRESH_BINARY)
        cv.imshow(track_win_name, img_after_interaction)
        k = cv.waitKey(1) & 0xFF
        if k == 27:
            break
    cv.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    公众号:www_cvtutorials_com,后台回复opencv-dynamic获取源代码及资源文件

  • 相关阅读:
    敲代码常用快捷键
    【JVM】图解垃圾收集器1
    CSS 选择器的常见用法
    (4)UART应用设计及仿真验证2 —— TX模块设计(无状态机)
    论文阅读: A Unified Sequence Interface for Vision Tasks
    回收站清空的文件能恢复吗?
    Laravel框架06:文件、迁移填充、会话、缓存
    机器学习、深度学习、自然语言处理学习 NLP-RoadMap-996station GitHub鉴赏官
    Jetson JetPack-5.1.2-L4T-R35.4.1 修复deskew algorithm的问题
    ipv6地址概述——配置ipv6
  • 原文地址:https://blog.csdn.net/qq_42322191/article/details/126052362