[python opencv 计算机视觉零基础到实战] 十八、用鼠标进行画画

一、学习目标

  1. 了解如何在图片中加入文字
  2. 了解如何使用鼠标进行图像绘制

二、了解如何通过鼠标进行图像绘制

2.1 了解putText方法的使用

putText方法接收图像,文字内容, 坐标 ,字体,大小,颜色,字体厚度这几个参数,我们用中文的函数原型说明如下:

putText(图像,文字内容, 坐标 ,字体,大小,颜色,字体厚度)

我们可以首先自定义一张纯黑图片,代码如下:

import cv2
import numpy as npimg=np.zeros((800,800,3), np.uint8)

随后定义一个字体:

font = cv2.FONT_HERSHEY_SIMPLEX

以上是一个黑色简体,并且赋值到font变量中。接着我们使用putText参数,使用putText参数传入,代码如下:

cv2.putText(img,'Blog 1_bit @ebaina @csdn',(0,300), font,1,(255,255,255),1)

以上代码使用了putText方法,传入了img参数,为所需要绘制的图像,第二个参数为需要显示的内容,第三个是显示的其实坐标为(0,300),font表示为字体,1表示为字体的大小,(255,255,255)为字体的颜色,1为字体的厚度。我们接下来查看一下显示效果如何,完整代码如下:

import cv2
import numpy as npimg=np.zeros((800,800,3), np.uint8)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'Blog 1_bit @ebaina @csdn',(0,300), font,1,(255,255,255),1)
cv2.imshow("Image", img)
cv2.waitKey (0)
cv2.destroyAllWindows()

结果如下:
我们可以移动其实坐标查看绘制效果,例如改成100,300,结果如下:

更改字体大小以及更改字体厚度为2:

相比来说在图片上绘制颜色还是比较简单的。
我们也可以通过绘制出好看的图片文字,例如:

这种图片绘制起来很简单,只需要添加一个for循环并且每次改变颜色和大小就可以完成,首先我们引入随机库;

import random

随后定义一个字体大小变量以及bgr三通道的变量值:

fsize=2
b,g,r=255,255,255

接下来使用一个for循环,每次循环都改变大小以及bgr三通道值:

fsize+=0.05
b=random.uniform(0,255)
g=random.uniform(0,255)
r=random.uniform(0,255)

所有的完整代码如下:

import cv2
import numpy as np
import randomimg=np.zeros((800,800,3), np.uint8)
font=cv2.FONT_HERSHEY_SIMPLEXfsize=2
b,g,r=255,255,255
for i in range(5):fsize+=0.05b=random.uniform(0,255)g=random.uniform(0,255)r=random.uniform(0,255)cv2.putText(img,'Blog 1_bit',(100,300), font,fsize,(b,g,r),2)
cv2.imshow("Image", img)
cv2.waitKey (0)
cv2.destroyAllWindows()

这样就绘制出来了这种略带动感的图片,其实可以通过图片位置的不同变化让文字显示的更有梯度和层次。如改变x的值,每次使这个x坐标值向右移动,大小不变,代码如下:

xpoint=100
for i in range(5):b=random.uniform(0,255)g=random.uniform(0,255)r=random.uniform(0,255)xpoint+=1cv2.putText(img,'Blog 1_bit',(xpoint,300), font,2,(b,g,r),2)

结果如下:
再或者移动x轴,同理可得,不再赘述代码,结果如下:
这些效果都是可以移动上下左右坐标去进行位置的变换,从而达到不一样的肉眼视觉效果。

2.2 了解setMouseCallback方法的使用

其实setMouseCallback方法就是一个鼠标的回调函数,这个函数涉及到事件这个概念。我们可以把事件理解成一种响应触发,例如小明吃苹果时、小丽喝奶茶时、小杨唱歌时;这些事件可以有一个对应的动作进行处理。例如小明吃苹果时他会开心地手舞足蹈、小丽喝奶茶时会吐掉珍珠、小杨唱歌时他的舍友会说他唱的难听,这些事件触发了之后的响应。

setMouseCallback方法就是一个鼠标的事件回调函数。在我们在图片上进行双击时,我们若想在双击点进行绘制一个圆形,这个时候就需要这个setMouseCallback方法。

setMouseCallback方法接收两个参数,一个是要显示的窗口名称,还有一个是响应的处理函数。

首先我们创建一个窗口和一张图片:

img=np.zeros((800,800,3), np.uint8)
cv2.namedWindow('image')

随后使用setMouseCallback方法响应我们的鼠标事件:

cv2.setMouseCallback('image',draw_circle)

以上传入的第一个参数是image,表示窗口名为image,第二个参数是一个方法名,当我们鼠标进行操作后,我们需要一个函数对这个操作进行后续的响应。这个函数是需要进行创建的,我们可以创建出来,并且需要传入指定的参数:

def draw_circle(event,x,y,flags,param):if event==cv2.EVENT_LBUTTONDBLCLK:cv2.circle(img,(x,y),10,(255,0,0),1)

以上函数draw_circle中参数event会直接被setMouseCallback函数进行值的传递x,y,flags,param也是如此。我们先看event,event是表示你的鼠标进行了那些操作,例如event==cv2.EVENT_LBUTTONDBLCLK就表示判断event是否进行了双击事件;x与y是当前事件点的鼠标x与y坐标。
在draw_circle函数中,使用if语句判断了事件是否是双击事件,如果是,那么就绘制一个圆,圆中心就在双击的x与y坐标处。
最后使用循环以及显示图片显示内容,完整代码如下:

import cv2
import numpy as npdef draw_circle(event,x,y,flags,param):if event==cv2.EVENT_LBUTTONDBLCLK:cv2.circle(img,(x,y),10,(255,0,0),1)img=np.zeros((800,800,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):cv2.imshow('image',img)if cv2.waitKey(20)&0xFF==27:break
cv2.destroyAllWindows()

为什么不把setMouseCallback放到循环当中?那是因为以及指定了窗口名后就会使这个监听生效于这个窗口之中。运行结果如下:

该系列首发于ebaina

三、总结

  1. 了解在图片中加入文字使用putText方法,并且可以通过位移或者改变大小、颜色增加字体的观感效果
  2. 了解使用鼠标进行图像绘制使用setMouseCallback方法,并且了解了事件是什么

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287471.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【测绘程序设计】坐标正算神器V1.0(附C/C#/VB源程序)

坐标正算,就是根据直线的边长、坐标方位角和一个端点的坐标,计算直线另一个端点的坐标的工作。本文用C#语言和VB语言实现坐标正算,编写坐标正算神器。 计算实例: 实例1,设直线AB的边长DAB和一个端点A的坐标XA、YA为已知,则直线另一个端点B的坐标为: XB=XA+ΔXAB YB=YA+…

2.2 PostgreSQL 概念

PostgreSQL 是一种关系型数据库管理系统(RDBMS)。这意味着它是一种用于管理那些以关系形式存储数据的系统。关系实际上是表的数学称呼。今天,把数据存储在表里的概念已经快成固有的常识了,但是还有其它一些方法用于组织数据库。在类 Unix 操作系统上的文…

Blazor University (22)路由 —— 定义路由

原文链接:https://blazor-university.com/routing/路由与标准 ASP.NET MVC 一样,Blazor 路由是一种用于检查浏览器 URL 并将其匹配到要呈现的页面的技术。路由比简单地将 URL 匹配到页面更灵活。它允许我们根据文本模式进行匹配,例如&#xf…

Linux文件I/O编程(二)lseek函数

文件I/O编程处理open、read、write、close,等必要函数对文件进行读写操作外,lseek、fcntl也是I/O编程很重要的函数。lseek函数lseek函数主要用来移动当前读写位置,第一个参数是文件描述符fd,第二个参数是偏移距离,第三…

[python opencv 计算机视觉零基础到实战] 十九、简易绘画板制作

一、学习目标 了解事件编写一个简易绘画板 二、了解如何制作简易绘画板 2.1 了解鼠标多种事件 上一节我们简单的使用opencv的图形绘制方法,用鼠标绘制了一些内容。上一节所响应的是简单的双击事件EVENT_LBUTTONDBLCLK,在OpenCV的鼠标事件中还有很多。…

Web App 和 Native App,哪个是趋势?

2019独角兽企业重金招聘Python工程师标准>>> Web App 和 Native App,哪个是趋势? https://www.zhihu.com/question/19558750 WebAPP与原生APP的交互设计区别 http://www.woshipm.com/ucd/132869.html Web App 开发使用哪种框架比较好&#xf…

基于天地图的应用服务系统设计开发—以甘肃高校招生服务为例

“天地图”是国家测绘地理信息局建设的地理信息综合服务网站。它是“数字中国”的重要组成部分,是国家地理信息公共服务平台的公众版。“天地图”的目的在于促进地理信息资源共享和高效利用,提高测绘地理信息公共服务能力和水平,改进测绘地理信息成果的服务方式,更好地满足…

查缺补漏系统学习 EF Core 6 - 修改实体数据

推荐关注「码侠江湖」加星标,时刻不忘江湖事这是 EF Core 系列的第六篇文章,上一篇文章讲述了 EF Core 中的原始 SQL 语句查询。这篇文章讲一讲 EF Core 如何修改实体数据。点击上方或后方蓝字,阅读 EF Core 系列合集。实体状态在开始学习 EF…

在AngularJS的controller外部直接获取$scope

为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/SJQ。 http://www.cnblogs.com/shijiaqi1066/p/5560843.html 以前利用webqq的写过一个自动发消息的脚本,由于那时webqq还直接使用类似jQuery操作DOM的技术&#x…

js pug 代码_pug模版学习(一)

标签按照html的缩进格式doctype htmlhtmlheadtitlebody编译结果:文本p 这是文本| 这是文本p.这是文本编译结果:这是文本这是文本这是文本属性设置class名跟id名(默认是div)p.foop#foop#foo.foo.foo#foo编译结果:其他属性:a(href&q…

Upgrade Hole puncher Mathematical Modeling

// AntColony.cpp : 定义控制台应用程序的入口点。 //#include<iostream> #include<math.h> #include<time.h> #include<stdio.h> #include <fstream> #include <string> #include <iostream> #include <vector>using n…

Android之提示Cannot call this method while RecyclerView is computing a layout or scrolling

1 问题 java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling androidx.recyclerview.widget.RecyclerView{24d6f3b VFED.V... ......ID 0,657-1074,1911 #7f090143 app:id/recyclerView}, adapter:com.appsinno…

Java8新的异步编程方式 CompletableFuture(三)

前面两篇文章已经整理了CompletableFuture大部分的特性&#xff0c;本文会整理完CompletableFuture余下的特性&#xff0c;以及将它跟RxJava进行比较。 3.6 Either Either 表示的是两个CompletableFuture&#xff0c;当其中任意一个CompletableFuture计算完成的时候就会执行。 …

情人节,我表白了CSDN小姐姐后,竟然...【为表白写了一个绘图工具,让我不再手残】

情人节&#xff0c;我表白了CSDN小姐姐后&#xff0c;竟然…竟然有人看了这篇文。 以下图片素材由一个还没写完的工具绘制&#xff0c;稍后会放在CSDN的代码仓库&#xff08;现在能用了&#xff0c;还没时间改&#xff0c;颜色填充算法还没写&#xff0c;有能力的朋友可以修改一…

【小程序】刘一哥课堂随机点名提问神器V1.0(附源程序)

为了能让我们的孩子们尽量来教室上课,增强课堂的参与度,激发课堂激情,提高学习效率,一哥也是煞费苦心,于是开发出了这么一款课堂点名提问神器,跟大家分享一下。 打开神器,看到的界面是这样子的,我很感激有勇气按时起床并能到教室的每一位有志之士。 点击【开始】按钮,…

org.hibernate.HibernateException: No Session found for current thread

spring、springmvc和hibernate整合 在sessionFactory.getCurrentSession()时&#xff0c;出现以下异常 No Session found for current thread但使用sessionFactory.openSession()是没有任何问题的 严重: Servlet.service() for servlet [springDispatcherServlet] in context w…

java mysbatis select_MyBatis SELECT基本查询实现方法详解

1、返回一个LISTselect * from tbl_employee where last_name like #{lastName}2、将查询记录封装为一个Mapselect * from tbl_employee where id#{id}返回一条记录的map&#xff1b;key就是列名&#xff0c;值就是对应的值。3、多条记录封装为一个mapMapKey("id")pu…

Git之怎么通过命令修改前面几次提交的记录

1 问题 我们平时用gitlab,github发现提交代码上库记录写错了&#xff0c;需要修改回来。 2 解决办法

Git客户端TortoiseGit(Windows系统)的使用方法

本文环境&#xff1a; 操作系统&#xff1a;Windows XP SP3 Git客户端&#xff1a;TortoiseGit-1.8.8.0-32bit 一、安装Git客户端 全部安装均采用默认&#xff01; 1. 安装支撑软件 msysgit: https://code.google.com/p/msysgit/downloads/list?qfullinstallerofficialgit 当前…