• 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获取源代码及资源文件

  • 相关阅读:
    微服务低代码 Serverless 平台 (星链) 的应用实践
    BCC源码内容概览(3)
    vue生命周期钩子函数
    cookie和session
    【C语言中缀转后缀】
    opencv编解码base64字符串
    字符串匹配_KMP算法_C语言
    在portacle中获取EMACS Lisp帮助文档的方法(Win11)
    Spring Initializr方式构建Spring Boot项目
    模型训练时loss震荡严重的几个解决方案
  • 原文地址:https://blog.csdn.net/qq_42322191/article/details/126052362