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

2022-12-07 10:20:05 浏览数 (1)

目标:

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

0.代码效果展示

1.代码详细说明

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

代码语言:javascript复制
import cv2 as cv

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

代码语言:javascript复制
def nothing(x):
    pass

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

代码语言:javascript复制
track_win_name = "trackbar window"
pic_path = "wechat.png"

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

代码语言:javascript复制
img = cv.imread(pic_path, 1)
img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.namedWindow(track_win_name)

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

  • • para1:trackbar前面会显示的名字
  • • para2:trackbar会放到的窗口名字
  • • para3:打开窗口滑块默认的起始位置
  • • para4:该trackbar对应的参数能调节的范围(从0开始),如para4为255,表示该trackbar调参范围为0-255
  • • para5:拖动滑块后的回调函数
代码语言:javascript复制
# 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)

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

代码语言:javascript复制
while(1):

    # your code is here

    k = cv.waitKey(1) & 0xFF
    if k == 27:
        break
cv.destroyAllWindows()

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

代码语言:javascript复制
    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)

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

2.完整代码

代码语言:javascript复制
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()

0 人点赞