在Opencv Python中创建多个跟踪栏



尝试为 1 个窗口创建 3 个轨道栏。

我正在拍照。 将其覆盖为灰色。 使用非本地手段,即模糊它。 通过一个称为bino的阈值。 对其进行边缘检测。 使用边缘检测查找轮廓。 按面积对此等高线进行排序。 仅取最大的轮廓。 并最好将其显示在精明或阈值图像上。

我需要在同一张图像上为 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()

另一种更简单的方法是忽略传递给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)

让跟踪栏调用更新相关(全局(变量的单独函数,然后调用处理图像的函数。

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()

最新更新