int createTrackbar(
const String &trackbarname, #轨迹条的名字
const String &winname, #窗口名字。窗口得存在才能创建滑动条
int* value, #滑块的初始值
int count, #滑块的最大值(最小位置的值始终为0)
TrackbarCallback onChange=0, #回调函数
void* userdata=0 #用户传给回调函数的数据
);
setTrackbarPos (
const String &trackbarname, #需要设置trackbar的名称,与创建的名称相对应
const String &winname, #trackbar所在窗体的名称
int pos #该trackbar的值
);
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):
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
每日“大饼”:
愿每个人都能遵循自己的时钟 做不后悔的选择