小白学python(opencv滑动条创建和使用)

小白学python(opencv滑动条创建和使用)

  • createTrackbar()
  • getTrackbarPos()
    • 使用
      • 1.创建可变颜色的画布:
      • 画图
    • 图像调整对比度与亮度
      • 图像调整对比度与亮度(不用滑动条)
      • 图像调整对比度与亮度(用滑动条)

createTrackbar()

createTrackbar() 这个函数用于创建一个可以调整数值的滑动条,并将滑动条附加到指定的窗口上。
滑动条(Trackbar)是一种可以动态调节参数的工具,它依附于窗口而存在。
函数参数:

def createTrackbar(trackbarName, windowName, value, count, onChange)

具体含义为:
1.trackbarname:跟踪栏名称,创建的轨迹栏的名称。
2,Winname:窗口的名字
3.value 该变量的值反映滑块的初始位置。
4.count 表示滑块可以达到的最大位置的值
5.onChange:回调函数,每次滑动都会调用回调函数。

getTrackbarPos()

cv2.getTrackbarPos(trackbarname, winname) → retval

参数:

第一个:滑动条名
第二个:窗口名

返回值:指定窗口上指定滑动条的当前位置

使用

方法一:即先定义createTrackbar() 滑动条,再调用getTrackbarPos获取createTrackbar的返回值用变量储存,进行这样的交互操作。
方法二:也可直接调用createTrackbar() 函数,直接就运行函数,进而反复调用createTrackbar()的第五个参数——自定义函数中进行操作也可。在自定义函数中调用getTrackbarPos获取createTrackbar的返回值用变量储存,再进行交互操作。
即一个不用reateTrackbar()的第五个参数,一个用。

方法1,2只是形式不一样,完全可以互换。
下面1和2用法一写,3用法二写。

1.创建可变颜色的画布:

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

小白学python(opencv滑动条创建和使用)_第1张图片
小白学python(opencv滑动条创建和使用)_第2张图片

画图

既然返回了我们的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()

小白学python(opencv滑动条创建和使用)_第3张图片
这里本来想改变画布颜色和画笔的,但必须建两个图层或线性叠加,要不然就会不停覆盖,不太会操作。。

图像调整对比度与亮度

这个写起来有些难度了,我们先看看如何调整对比度与亮度(先不用滑动条)

图像调整对比度与亮度(不用滑动条)

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

小白学python(opencv滑动条创建和使用)_第4张图片
小白学python(opencv滑动条创建和使用)_第5张图片
1.这里稍微参考下大佬的代码
2.用
cv.namedWindow(windowName,cv.WINDOW_NORMAL)
cv.resizeWindow(windowName, 640, 480)
可以调整窗口大小
以前的cv.WINDOW_AUTOSIZE为固定窗口大小

就先到这里叭

你可能感兴趣的:(小白python,opencv,python,计算机视觉)