openCV入门 Gui特性 5 滑动条做调色板

基础函数

cv2.creatTrackbar(trackbarname,winname,value,count,TrackbarCallback)
	#用于创建一个可以调整数值的滑动条,并将滑动条附加到指定的窗口上。
	#例:cv2.createTrackbar('R','image',0,255,nothing) 
	#trackbarname:滑动条的名字
	#winname:滑动条被放置窗口的名字
	#value:滑动条的默认位置
	#count:滑动条的最大值
	#TrackbarCallback:回调函数
	
a = cv2.getTrackbarPos(trackbarname,winname) 
	#得到滑动条的数值a
	
cv2.setTrackbarPos(trackbarname,winname, 100)
	#设置滑动条的默认值

滑动条改变窗口颜色

import cv2
import numpy as np
import math

def nothing (x) :
    pass
 
img = np.zeros((512, 1000, 3), np.uint8)
cv2.namedWindow('image', 0)
#绘图颜色R,G,B
cv2.createTrackbar('R', 'image', 0, 255, nothing)
cv2.createTrackbar('G', 'image', 0, 255, nothing)
cv2.createTrackbar('B', 'image', 0, 255, nothing)
#开关
switch='0:OFF\n1:ON' 
cv2.createTrackbar(switch,'image',0,1,nothing)
#设置滑动条的默认值
cv2.setTrackbarPos('R','image', 100)
cv2.setTrackbarPos('G','image', 100)
cv2.setTrackbarPos('B','image', 100)

while 1:
    cv2.imshow('image', img)
    r = cv2.getTrackbarPos('R', 'image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    # 窗口颜色设置
    img[:] = [b, g, r]
    k = cv2.waitKey(1) & 0XFF
    if k == 27:
        break
cv2.destroyAllWindows()
 

Gui小习题:
在一张白(255,255,255)的image中,利用滑动条选择颜色(rgb),用鼠标左键画圆,右键画矩形 (圆和矩形大小不固定)

思路

1.搞定画圆和画矩形
2.增加滑动条,并用来控制画笔颜色
3.设置白色image

画圆和画矩形

#左键拖拽时记录起始坐标,不画
    if event == cv2.EVENT_FLAG_LBUTTON:
        ix, iy = x, y

#当鼠标松开左键时记下坐标
#确定圆心和半径,用拖拽法画圆
    if event == cv2.EVENT_LBUTTONUP:

        #计算半径的长度
        xlm = (x - ix)
        ylm = (y - iy)
        le = math.sqrt(xlm * xlm + ylm * ylm)
        #转换数据类型
        le = int(le) 
        #画圆
        cv2.circle(img, (ix, iy), le, color, 8)

#两点法画矩形
      #右键单击,画第一个点
    if event == cv2.EVENT_RBUTTONDOWN:
      #n的作用:分开两个端点(起点和终点)
        if n == 0:   #第一次单击
            n += 1
            ix, iy = x, y
            #画第一个端点(起点)
            cv2.circle(img, (x, y), 2, color, -1)
        else:        #第二次单击
            n = 0 
            #根据第一个端点和第二个点画矩形
            cv2.rectangle(img, (ix, iy), (x, y), color, 5)

增加滑动条,并用来控制画笔颜色

cv2.createTrackbar('R', 'image', 0, 255, nothing)
cv2.createTrackbar('G', 'image', 0, 255, nothing)
cv2.createTrackbar('B', 'image', 0, 255, nothing)
color = (b,g,r)

#以下代码加入自定义函数
r = cv2.getTrackbarPos('R', 'image')
g = cv2.getTrackbarPos('G', 'image')
b = cv2.getTrackbarPos('B', 'image')
#img[:] = [b, g, r]

设置白色image

img[:] = 255
img.fill(255)
#两种方法任选一种

整体代码

import cv2
import numpy as np
import math

def nothing (x) :
    pass

n = 0
ix, iy = -1, -1
xl, yl, l = 0, 0, 0

#创建回调函数
def onMouse(event, x, y, flags, param):
    #获取滑动条R,G,B值
    r = cv2.getTrackbarPos('R', 'image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    color = (b, g, r)

    global ix, iy, n
#左键拖拽时记录起始坐标
    if event == cv2.EVENT_FLAG_LBUTTON:
        ix, iy = x, y

#当鼠标松开左键时停止绘画
#通过圆心和半径拖拽法画圆
    if event == cv2.EVENT_LBUTTONUP:

        #计算半径的长度
        xlm = (x - ix)
        ylm = (y - iy)
        le = math.sqrt(xlm * xlm + ylm * ylm)
        #转换数据类型
        le = int(le)
        #画圆
        cv2.circle(img, (ix, iy), le, color, 8)

#两点法画矩形
      #右键单击,画第一个点
    if event == cv2.EVENT_RBUTTONDOWN:
        if n == 0:
            n += 1
            ix, iy = x, y
            #画第一个端点
            cv2.circle(img, (x, y), 2, color, -1)
        else:
            n = 0
            #根据第一个端点和第二个点画矩形
            cv2.rectangle(img, (ix, iy), (x, y), color, 5)

#可调整image大小
img = np.zeros((512, 1000, 3), np.uint8)
cv2.namedWindow('image')
#绘图颜色R,G,B
cv2.createTrackbar('R', 'image', 0, 255, nothing)
cv2.createTrackbar('G', 'image', 0, 255, nothing)
cv2.createTrackbar('B', 'image', 0, 255, nothing)

cv2.setMouseCallback('image', onMouse)
# 把image改成白色
img[:] = 255
#img.fill(255)  
while 1:
    cv2.imshow('image', img)
    k = cv2.waitKey(1) & 0XFF
    if k == 27:
        break
cv2.destroyAllWindows()

效果如图
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@bwang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值