OpenCV做个简单的画图板—变化画笔颜色,粗细

2023-10-28 02:20

本文主要是介绍OpenCV做个简单的画图板—变化画笔颜色,粗细,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OpenCV做个简单的画图板—变化画笔颜色,粗细

  • 前言
    • 实现的功能
    • 实现思路
    • 实现步骤
    • 运行结果

前言

最近在学习OpenCV,照着官网的教程学习,学习Gui Features in Opencv,其中主要内容参考这一章节的内容,鼠标事件部分对应前一章的学习内容,链接如下:opencv官网教程
看本博客内容基本就可以实现这个章节内容,如果还有问题可以下载链接:源程序

实现的功能

这一节主要实现的功能是,利用Trackbar相关命令,实现功能如下:

  1. 实现实时画图功能;
  2. 通过R,G,B三色的拖拽条,实现颜色改变,更新画笔颜色;
  3. 通过拖拽条改变画笔粗细;
  4. 通过拖拽条做成“开关”,实现橡皮擦功能;
  5. 通过键盘按钮切换,可是实现画线或画矩形;

实现思路

  1. 当按下鼠标左键开始画笔功能,移动鼠标并且左键拖拽时,画圆,从而连接成曲线;
  2. 当拖拽画笔粗细拖拽条,改变画圆的半径大小;
  3. 当切换开关为“橡皮擦”,改变画圆的颜色为窗口画图板的背景色,这里是白色;
  4. 键盘“m”键可以切换画线模式和画矩形模式;

实现步骤

  1. 建立画图板窗口。底色为白色,尺寸为350*512。#底色和尺寸可以根据自己喜好而定,但此方法的底色只有黑白灰三色。
#create a white image, a window
img = 255*np.ones((350,512,3),np.uint8)
  1. 建立窗口和鼠标回调函数,用于监听鼠标事件,做出回应。
cv.namedWindow('image')
cv.setMouseCallback('image',draw_mousepush)
  1. 创建各功能拖动条,用来更改画笔颜色、粗细以及橡皮擦开关功能,不设拖动条回调函数
#create trackbars for color change,switch of erase,painter thickness
cv.createTrackbar('R','image',0,255,nothing)
cv.createTrackbar('G','image',0,255,nothing)
cv.createTrackbar('B','image',0,255,nothing)cv.createTrackbar('thickness','image',1,8,nothing)switch = 'erase'
cv.createTrackbar(switch,'image',0,1,nothing)
  1. 获取画笔信息功能函数get_painter,返回画笔颜色、画笔粗细、橡皮擦开关状态
#get info painter function
def get_painter():# get current positions of four trackbarsr = cv.getTrackbarPos('R', 'image')g = cv.getTrackbarPos('G', 'image')b = cv.getTrackbarPos('B', 'image')thickness = cv.getTrackbarPos('thickness','image')s = cv.getTrackbarPos(switch,'image')color = (b,g,r) #color scalesreturn color,thickness,s
  1. 完成鼠标动作回调函数
# mouse callback function
#initialize初始化
drawing = False #painter is false,not beginning painting
mode = False #切换画线和画矩形功能
ix, iy = 0, 0
def draw_mousepush(event,x,y,flags,param):global ix,iy,drawing,mode #引入全局变量color,thickness,s = get_painter() #从get_painter函数引入参数
# moniter mouse event.When push leftbutton down,beginning paintingif event == cv.EVENT_LBUTTONDOWN:drawing = Trueix, iy = x, y
#按住左键滑动,则开始在鼠标所在位置画圆,从而连成曲线elif event == cv.EVENT_MOUSEMOVE and flags == cv.EVENT_FLAG_LBUTTON:if drawing == True:if s == 1: #打开橡皮擦功能cv.circle(img,(x,y),10,(255,255,255),-1)else:if mode == False: #画线cv.circle(img,(x,y),thickness,color,-1)else:cv.rectangle(img,(ix,iy),(x,y),color,-1)elif event == cv.EVENT_LBUTTONUP:drawing = False
  1. 建立主函数
# main function
while(1):color,thickness,_ = get_painter()cv.imshow('image',img)k = cv.waitKey(1) & 0xFFif k ==27: #ESC退出breakelif k == ord('m'):mode = not mode
  1. ESC键,清除所有窗口
cv.destroyAllWindows()

运行结果

请忽略我略丑的字体,哈哈
运行结果

这篇关于OpenCV做个简单的画图板—变化画笔颜色,粗细的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/290041

相关文章

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 10130 简单背包

题意: 背包和 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存