Создание нескольких трекбаров в Opencv Python

Пытаюсь создать 3 трекбара для 1 окна.

Я делаю снимок. Покрытие до серого. Использование нелокальных средств, иначе говоря, размытие. Прохождение через порог, называемый бино. Обнаружение края на нем. Использование обнаружения кромок для поиска контуров. Сортировка контуров по площади. Берем только самый большой контур. И отображать его предпочтительно поверх хитрого или порогового изображения.

Мне нужна дорожка для размытия nlm, порога и хитрых линий на одном изображении, но я не знаю, как это сделать, и не могу понять. Пожалуйста, моя единственная надежда!

import numpy as np
import cv2 as cv

def thresh_callback(val):
    nlm_thresh = val
    bino_thresh = val
    canny_thresh = val

    img = cv.imread('test.jpg')
    imgray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    nlm = cv.fastNlMeansDenoising(imgray,nlm_thresh,nlm_thresh,11,21)
    bino = cv.adaptiveThreshold(nlm,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,\
                             cv.THRESH_BINARY,bino_thresh,8)
    canny_output = cv.Canny(bino, canny_thresh, canny_thresh * 2)
    _, contours, hierarchy = cv.findContours(canny_output,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
    cnt = sorted(contours, key=cv.contourArea, reverse=True)
    cnts = cnt[0]
    area = cv.contourArea(cnts)
    print (area)

    drawing = cv.drawContours(img, cnt, 0, (0,255,0), 3)

    cv.imshow('Contours2', canny_output)
    cv.imshow(source_window, drawing)


source_window = 'Source'
cv.namedWindow(source_window)
max_thresh = 255
thresh = 100 # initial threshold
cv.createTrackbar('nlm_thresh:', source_window, thresh, max_thresh, thresh_callback)
cv.createTrackbar('bino_thresh:', source_window, thresh, max_thresh, thresh_callback)
cv.createTrackbar('canny_thresh:', source_window, thresh, max_thresh, thresh_callback)

thresh_callback(thresh)

cv.waitKey(0) & 0xFF  
cv.destroyAllWindows()

person Mogarbobac    schedule 18.08.2019    source источник


Ответы (2)


Другой более простой способ сделать это - игнорировать параметр, переданный вашему thresh_callback, и просто получить значение трекбара для каждой трекбара отдельно с помощью getTrackbarPos ()

def thresh_callback(val):
    nlm_thresh = cv.getTrackbarPos('nlm_thresh:', source_window)
    bino_thresh = cv.getTrackbarPos('bino_thresh:', source_window)
    canny_thresh = cv.getTrackbarPos('canny_thresh:', source_window)
person abhigdeal    schedule 03.05.2020

Пусть трекбары вызывают отдельные функции, которые обновляют соответствующую (глобальную) переменную, а затем вызывают функцию, обрабатывающую изображение.

import numpy as np
import cv2 as cv

#initialise variables with a default
nlm_thresh = 5
bino_thresh = 5
canny_thresh = 5

# functions that update a variable, 
# then call image processing function
def change_nlm(val):
    global nlm_thresh
    nlm_thresh = val
    thresh_callback()

def change_bino(val):
    global bino_thresh
    bino_thresh = val
    thresh_callback()

def change_canny(val):
    global canny_thresh
    canny_thresh = val
    thresh_callback()

# your function that processes the image
def thresh_callback():
    img = cv.imread('test.jpg')
    imgray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    nlm = cv.fastNlMeansDenoising(imgray,nlm_thresh,nlm_thresh,11,21)
    bino = cv.adaptiveThreshold(nlm,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,          cv.THRESH_BINARY,bino_thresh,8)
    canny_output = cv.Canny(bino, canny_thresh, canny_thresh * 2)
    _, contours, hierarchy = cv.findContours(canny_output,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
    cnt = sorted(contours, key=cv.contourArea, reverse=True)
    cnts = cnt[0]
    area = cv.contourArea(cnts)
    print (area)

    drawing = cv.drawContours(img, cnt, 0, (0,255,0), 3)

    cv.imshow('Contours2', canny_output)
    cv.imshow(source_window, drawing)


source_window = 'Source'
cv.namedWindow(source_window)
max_thresh = 255
thresh = 100
# create trackbars
cv.createTrackbar('nlm_thresh:', source_window, thresh, max_thresh, change_nlm)
cv.createTrackbar('bino_thresh:', source_window, thresh, max_thresh, change_bino)
cv.createTrackbar('canny_thresh:', source_window, thresh, max_thresh, change_canny)

thresh_callback()

cv.waitKey(0) & 0xFF  
cv.destroyAllWindows()
person J.D.    schedule 18.08.2019