OpenCV快速入门四:TrackBar控件(滑动条)

一:函数API

1:createTrackbar

int createTrackbar(
					const String &trackbarname,    #轨迹条的名字
					const String &winname,         #窗口名字。窗口得存在才能创建滑动条
					int* value,                    #滑块的初始值
					int count,                     #滑块的最大值(最小位置的值始终为0)
					TrackbarCallback onChange=0,   #回调函数
					void* userdata=0               #用户传给回调函数的数据
);

2:setTrackbarPos

setTrackbarPos	(
				 const String &trackbarname,   	  #需要设置trackbar的名称,与创建的名称相对应
				 const String &winname,       	  #trackbar所在窗体的名称
				 int pos                      	  #该trackbar的值
);	

二:代码演示

1:BGR调色盘

import cv2
import numpy as np

#鼠标回调函数
def mcallback(event,x,y,flags,userdata):
    pass

cv2.namedWindow('trackbar', cv2.WINDOW_AUTOSIZE)
cv2.resizeWindow('trackbar', 640, 480)

#设置鼠标回调
cv2.createTrackbar('R',"trackbar",0,255,mcallback)
cv2.createTrackbar('G',"trackbar",0,255,mcallback)
cv2.createTrackbar('B',"trackbar",0,255,mcallback)

img=np.zeros((480,640,3),np.uint8)#全黑图片
while True:

    r=cv2.getTrackbarPos('R','trackbar')
    b=cv2.getTrackbarPos('B','trackbar')
    g=cv2.getTrackbarPos('G','trackbar')
    #改变颜色
    img[:]=[b,g,r]
    cv2.imshow('trackbar',img)
    key=cv2.waitKey(10)#为0则只显示一帧
    if(key&0xff==ord('q')):
        break

cv2.destroyAllWindows()

如果觉得终端有标红不好看,可以将回调函数改成: def mcallback(event):

输出
在这里插入图片描述

2:特定颜色区域提取

import cv2
import numpy as np


def mcallback(x):
    pass


cv2.namedWindow("Tracking")
#绿色的HSV:可能不是很准
#l_g = np.array([35, 43, 46]) # 下限
#u_g = np.array([77,255,255]) # 上限
cv2.createTrackbar("LH", "Tracking", 35, 255, mcallback)
cv2.createTrackbar("LS", "Tracking", 43, 255, mcallback)
cv2.createTrackbar("LV", "Tracking", 46, 255, mcallback)
cv2.createTrackbar("UH", "Tracking", 77, 255, mcallback)
cv2.createTrackbar("US", "Tracking", 255, 255, mcallback)
cv2.createTrackbar("UV", "Tracking", 255, 255, mcallback)

while True:
    img = cv2.imread(r"C:\Users\DMr\Pictures\text\book.jpg")
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    l_h = cv2.getTrackbarPos("LH", "Tracking")
    l_s = cv2.getTrackbarPos("LS", "Tracking")
    l_v = cv2.getTrackbarPos("LV", "Tracking")

    u_h = cv2.getTrackbarPos("UH", "Tracking")
    u_s = cv2.getTrackbarPos("US", "Tracking")
    u_v = cv2.getTrackbarPos("UV", "Tracking")

    l_g = np.array([l_h, l_s, l_v])  # lower green value
    u_g = np.array([u_h, u_s, u_v])

    mask = cv2.inRange(hsv, l_g, u_g)

    res = cv2.bitwise_and(img, img, mask=mask)  # src1,src2

    cv2.imshow("img", img)
    cv2.imshow("mask", mask)
    cv2.imshow("res", res)
    key = cv2.waitKey(10)
    if(key & 0xff == ord('q')):
        break

cv2.destroyAllWindows()

输出
颜色分割

为什么分离出的通道都是黑白灰,而不是红绿蓝?
原因是分离后为单通道,相当于分离通道的同时把其他两个通道填充了相同的数值。比如红色通道,分离出红色通道的同时,绿色和蓝色被填充为和红色相同的数值,这样一来就只有黑白灰了。
那么绿色体现在哪呢?可以进行观察,会发现原图中颜色越接近绿色的地方在绿色通道越接近白色。
在纯绿的地方在绿色通道会出现纯白。
G值为255 ->BGR(255,255,255),为纯白

抽空会把hsv的学习笔记会给大家补上,最近在实习
OpenCV学习五:色彩空间转换
补上了2022/8/2 15:51

每日“大饼”:
愿每个人都能遵循自己的时钟 做不后悔的选择

猜你喜欢

转载自blog.csdn.net/weixin_52051554/article/details/126018160
今日推荐