仅适用于Python的OpenCV跟踪栏上的奇数?

时间:2019-01-05 18:45:50

标签: python opencv

我正在学习如何在Python上使用OpenCV进行皮肤分割,现在我主要处于实验阶段,在该阶段我与高斯蓝一起玩,以减少与Otsu Binarization所形成的鲜明对比。

我发现在实验中非常有用的一种策略是使用显示窗口上的跟踪栏功能来更改各种参数,例如内核大小的选择和高斯函数的标准偏差。当我更改std时,轨迹栏效果很好,但是当我对内核大小进行相同操作时,程序崩溃。

这样做的原因是内核大小仅采用大于1的奇数作为两个值的元组。由于轨迹栏是连续的,因此当我移动轨迹栏并且轨迹栏读取偶数时,高斯函数会引发错误。

我希望您能为我提供一个解决方案,以在可能的情况下创建仅包含奇数或什至仅包含数组中数字的轨迹栏。谢谢!

# applying otsu binerization to video stream
feed = cv2.VideoCapture(0)

# create trackbars to control the amount of blur 
cv2.namedWindow('blur')
# callback function for trackbar
def blur_callback(trackbarPos):
    pass
# create the trackbar 
cv2.createTrackbar('Blur Value', 'blur', 1, 300, blur_callback)
# cv2.createTrackbar('Kernel Size', 'blur', 3, 51, blur_callback)

while True:
    vid_ret, frame = feed.read()
    # flip the frames 
    frame = cv2.flip(frame, flipCode=1)

    # convert the feed to grayscale
    frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # get blur value from trackbar and apply gaussian blur to frame_gray
    blurVal = cv2.getTrackbarPos('Blur Value', 'blur')
#     kernelSize = cv2.getTrackbarPos('Kernel Size', 'blur')
    frame_blur = cv2.GaussianBlur(frame_gray, (11, 11), blurVal)

    # apply Otsu binerization on vanilla grayscale
    otsu_ret, otsu = cv2.threshold(frame_gray, 0, 255, cv2.THRESH_OTSU)

    # apply Otsu binerization on blurred grayscale
    otsu_blue_ret, otsu_blur = cv2.threshold(frame_blur, 0, 255, cv2.THRESH_OTSU)


    # show the differnt images
    cv2.imshow('color', frame)
#     cv2.imshow('gray', frame_gray)
    cv2.imshow('blur', frame_blur)
    cv2.imshow('otsu', otsu)
    cv2.imshow('otsu_blur', otsu_blur)
    # exit key
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break

# release the feed and close all windows
feed.release()
cv2.destroyAllWindows()

3 个答案:

答案 0 :(得分:0)

使用余数功能并为偶数添加1值,这样就不会崩溃

您在这里:

cv2.createTrackbar('Blur Value', 'blur', 1, 20, blur_callback)

while True:

    gaus = cv2.getTrackbarPos('Blur Value', 'blur')

    if gaus == 0:
        ......
    else:
        count = gaus % 2 

        if (count == 0):
            gaus += 1
            frame_blur = cv2.GaussianBlur(frame_gray, (gaus, gaus), 0)
        else:
            frame_blur = cv2.GaussianBlur(frame_gray, (gaus, gaus), 0)

我一直在执行此功能,虽然不是很完美,但是可以运行。 请在我的Github上检查一下:https://github.com/jiasuan/opencv/blob/master/Trackbar.py

使用轨迹栏时,您更容易观察图像。 但是每个功能的安排都会影响您的数据结果。例如,灰度之前的模糊和灰度之后的模糊,结果将有所不同。 在运行之前,您必须仔细安排它。

答案 1 :(得分:0)

要添加到路易斯的答案中,您可以使用setTrackbarPos()将轨迹栏移动到奇数位置

请参阅:https://docs.opencv.org/trunk/d7/dfc/group__highgui.html#ga67d73c4c9430f13481fd58410d01bd8d

答案 2 :(得分:0)

尝试一下:

cv2.createTrackbar('Blur Value', 'blur', 1, 20, blur_callback)

while True:
    gaus = cv2.getTrackbarPos('Blur Value', 'blur')
    if gaus%2 == 0:
        gaus+=1 # here all even numbers will be converted to odd. Make range as 1-19 than 1-20