Python的OpenCV trackbar上只有奇数?

2024-09-30 10:38:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习如何在Python上使用OpenCV进行皮肤分割,现在我主要处于实验阶段,我正在使用高斯蓝来减少与Otsu的二值化得到的鲜明对比。在

在我的实验中,我发现一个非常有用的策略是使用显示窗口上的trackbar功能来更改各种参数,例如选择内核大小和高斯函数的标准偏差。当我改变std时,trackbar工作得很好,但是当我对内核大小做同样的操作时,我的程序崩溃了。在

原因是内核大小只接受奇数>;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()

Tags: theto轨迹feedcallbackcv2内核frame
1条回答
网友
1楼 · 发布于 2024-09-30 10:38:26

使用余数函数&为偶数加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

使用轨迹条时,您更容易观察图像。 但是每个函数的排列都会影响数据的结果。例如,在灰度之前模糊和在灰度之后模糊,结果会有所不同。 你必须在跑步前仔细安排。在

相关问题 更多 >

    热门问题