createTrackbar() 这个函数用于创建一个可以调整数值的滑动条,并将滑动条附加到指定的窗口上。
滑动条(Trackbar)是一种可以动态调节参数的工具,它依附于窗口而存在。
函数参数:
def createTrackbar(trackbarName, windowName, value, count, onChange)
具体含义为:
1.trackbarname:跟踪栏名称,创建的轨迹栏的名称。
2,Winname:窗口的名字
3.value 该变量的值反映滑块的初始位置。
4.count 表示滑块可以达到的最大位置的值
5.onChange:回调函数,每次滑动都会调用回调函数。
cv2.getTrackbarPos(trackbarname, winname) → retval
参数:
第一个:滑动条名
第二个:窗口名
返回值:指定窗口上指定滑动条的当前位置
方法一:即先定义createTrackbar() 滑动条,再调用getTrackbarPos获取createTrackbar的返回值用变量储存,进行这样的交互操作。
方法二:也可直接调用createTrackbar() 函数,直接就运行函数,进而反复调用createTrackbar()的第五个参数——自定义函数中进行操作也可。在自定义函数中调用getTrackbarPos获取createTrackbar的返回值用变量储存,再进行交互操作。
即一个不用reateTrackbar()的第五个参数,一个用。
方法1,2只是形式不一样,完全可以互换。
下面1和2用法一写,3用法二写。
# -*- encoding: utf-8 -*-
import cv2
import numpy as np
def main():
global img
img = np.zeros((300, 400, 3), np.uint8) #创建初始画布大小
cv2.namedWindow('image', cv2.WINDOW_AUTOSIZE) #创建窗口
img[:] = [255, 255, 255] #初始化画布颜色
# 创建一个开关滑动条,只有两个值,起开关按钮作用
switch = '0:OFF\n1:ON'
cv2.createTrackbar(switch, 'image', 0, 1, callback)
#创建3个滑动条来返回r,g,b的值
cv2.createTrackbar('R', 'image', 0, 255, callback)
cv2.createTrackbar('B', 'image', 0, 255, callback)
cv2.createTrackbar('G', 'image', 0, 255, callback)
while (True):
global r ,g,b
r = cv2.getTrackbarPos('R', 'image') #得到滑动条返回值,用名字即可获取某个滑动条
g = cv2.getTrackbarPos('G', 'image')
b = cv2.getTrackbarPos('B', 'image')
if cv2.getTrackbarPos(switch, 'image') == 1: #为1则画
img[:] = [b,r,g]
else: #为0则清除为白色
img[:] = [255, 255, 255]
if cv2.waitKey(10) & 0xFF == 27: #按esc退出
break
cv2.imshow('image', img)
cv2.destroyAllWindows()
# 定义回调函数,此程序无需回调,所以Pass即可
def callback(object): #注意这里createTrackbar会向其传入参数即滑动条地址(几乎用不到),所以必须写一个参数
pass
if __name__ =="__main__":
main()
既然返回了我们的r,g,b,我们还可以用学到的setMouseCallback来进行鼠标操作,来进行画图。
import cv2
import numpy as np
def main():
global img
img = np.zeros((300, 400, 3), np.uint8) #创建初始画布大小
cv2.namedWindow('image', cv2.WINDOW_AUTOSIZE) #创建窗口
img[:] = [255, 255, 255] #初始化画布颜色
# 创建一个开关滑动条,只有两个值,起开关按钮作用
switch = '0:OFF\n1:ON'
cv2.createTrackbar(switch, 'image', 0, 1, callback)
#创建3个滑动条来返回r,g,b的值
cv2.createTrackbar('R', 'image', 0, 255, callback)
cv2.createTrackbar('B', 'image', 0, 255, callback)
cv2.createTrackbar('G', 'image', 0, 255, callback)
# cv2.createTrackbar('RMAP', 'image', 0, 255, callback)
# cv2.createTrackbar('BMAP', 'image', 0, 255, callback)
# cv2.createTrackbar('GMAP', 'image', 0, 255, callback)
while (True):
global r ,g,b,rmap,gmap,bmap
r = cv2.getTrackbarPos('R', 'image') #得到滑动条返回值(滑动条)
g = cv2.getTrackbarPos('G', 'image')
b = cv2.getTrackbarPos('B', 'image')
rmap = cv2.getTrackbarPos('RMAP', 'image') # 得到滑动条返回值(画布)
gmap = cv2.getTrackbarPos('GMAP', 'image')
bmap = cv2.getTrackbarPos('BMAP', 'image')
if cv2.getTrackbarPos(switch, 'image') == 1: #为1则画
cv2.setMouseCallback('image', Mouseback)
#img[:] = [bmap, rmap, gmap] #注意为b,r,g
else: #为0则清除为白色
img[:] = [255, 255, 255]
if cv2.waitKey(10) & 0xFF == 27: #按esc退出
break
cv2.imshow('image', img)
cv2.destroyAllWindows()
# 定义回调函数,此程序无需回调,所以Pass即可
def callback(object):
pass
def Mouseback(event, x, y, flags, param): #鼠标操作(此函数是回调函数,为setMouseCallback的一个参数而已)
if flags == cv2.EVENT_FLAG_LBUTTON and event == cv2.EVENT_MOUSEMOVE: #摁下而且移动则进行下一步操作
cv2.circle(img, (x, y), 1, [b, g, r], 1)
if __name__ =="__main__":
main()
这里本来想改变画布颜色和画笔的,但必须建两个图层或线性叠加,要不然就会不停覆盖,不太会操作。。
这个写起来有些难度了,我们先看看如何调整对比度与亮度(先不用滑动条)
import cv2 as cv
import numpy as np
def main():
pitcurepath = "C:/Users/POG/Pictures/Autumn is coming WallPack/Timon Studler Mod.jpg"
srcImage4 = cv.imread(pitcurepath)
#cv.imshow("Saber", srcImage4)
contrast_Ratio_brightness(srcImage4, 1.8, 10) #图像调整对比度与亮度
cv.waitKey(0)
cv.destroyAllWindows()
def contrast_Ratio_brightness(image, a, g): #图像调整对比度与亮度
# a为对比度,g为亮度
h, w, c = image.shape #得到原图的大小与通道数
# 创建一个全白色图像。
mask = np.zeros([h, w, c], image.dtype)
# cv.addWeighted函数对两张图片线性加权叠加
dstImage = cv.addWeighted(image, a, mask, 1 - a, g)
cv.imshow("dstImage", dstImage)
if __name__ =="__main__":
main()
这样用到了线性叠加函数,创建一个和图片一样大小的白色图片,再用addWeighted函数线性加权叠加得到新图。
import cv2 as cv
import numpy as np
def main():
global trackbarName1, trackbarName2, a, g, count1, count2, windowName,image
image = cv.imread("C:/Users/POG/Desktop/IMG_20210120_195433(1).jpg")
# cv.imshow("Saber", image)
trackbarName1= "Ratio_a" #创建滑动条名称
trackbarName2 = "Bright_g"
windowName = "dstImage"
a = 1 # 设置a的初值。
g = 10 # 设置g的初值。
count1 = 20 # 设置a的最大值
count2 = 50 # 设置g的最大值
# 给滑动窗口命名,该步骤不能缺少!而且必须和需要显示的滑动条窗口名称一致。
cv.namedWindow(windowName,cv.WINDOW_NORMAL)
cv.resizeWindow(windowName, 640, 480)
# 第一个参数为滑动条名称,第二个参数为窗口名称,
# 第三个参数为滑动条参数,第四个为其最大值,第五个为需要调用的函数名称。
cv.createTrackbar(trackbarName1, windowName, a, count1, contrast_Ratio_brightness)
cv.createTrackbar(trackbarName2, windowName, g, count2, contrast_Ratio_brightness)
# 下面这步调用函数,也不能缺少。
contrast_Ratio_brightness(0)
cv.waitKey(0)
cv.destroyAllWindows()
def contrast_Ratio_brightness(arg):
#arg参数:为接收新变量地址
#a为对比度,g为亮度
#cv.getTrackbarPos获取滑动条位置处的值
#第一个参数为滑动条1的名称,第二个参数为窗口的名称。
a = cv.getTrackbarPos(trackbarName1, windowName)
g = cv.getTrackbarPos(trackbarName2, windowName)
h,w,c=image.shape
mask=np.zeros([h,w,c],image.dtype)
#cv.addWeighted函数对两张图片线性加权叠加
dstImage=cv.addWeighted(image,a,mask,1-a,g)
cv.imshow("dstImage",dstImage)
if __name__ =="__main__":
main()
1.这里稍微参考下大佬的代码
2.用
cv.namedWindow(windowName,cv.WINDOW_NORMAL)
cv.resizeWindow(windowName, 640, 480)
可以调整窗口大小
以前的cv.WINDOW_AUTOSIZE为固定窗口大小
就先到这里叭