opencv图形绘制2

目录

制作宣传语(中文)

制作宣传语(英文)

绘制标记

鼠标交互绘制十字线

鼠标交互绘制图形

鼠标交互制作几何画板

滚动条控制

鼠标事件练习


制作宣传语(中文)

import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont  # Pillow库(由Image,ImageDraw,ImageFont模块组成),用于图像处理def add_text(img, text, left, top, color=(0, 255, 0), size=20):#  该函数接受图像、文字、起始位置、颜色和字体大小作为输入参数。# isinstance()函数来判断一个对象是否是一个已知的类型,类似type()。if isinstance(img, np.ndarray):  # 检查输入的图像是否是一个NumPy数组。img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))#  如果输入的图像是一个NumPy数组,那么这行代码将把BGR图像(OpenCV默认的格式)转换为RGB图像(Pillow库需要的格式)。draw = ImageDraw.Draw(img)# 使用Pillow的ImageDraw模块在给定的图像上创建一个可以绘制的位置。font_text = ImageFont.truetype("font/simsun.ttc", size, encoding="utf-8")# 加载了一个TrueType字体文件(“simsun.ttc”),并设定字体大小。draw.text((left, top), text, color, font=font_text)# draw.text()在指定的位置上以给定的颜色和字体绘制文字。return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)# 将Pillow的图像对象转换回NumPy数组,然后将颜色空间从RGB转换回BGR。img = np.ones((300, 512, 3), np.uint8) * 255
img = add_text(img, "普天同庆  爱我中华", 30, 120, (255, 0, 0), 50)  # 白色cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

制作宣传语(英文)

# cv2.putText函数在图像上添加文本
# cv2.putText(img, text, org, font, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
'''
    img:图像
    text:要写入的文本
    org:文本的左下角坐标 (x, y)
    font:字体类型
    fontScale:字体大小
    color:字体颜色
    thickness:线条的粗细
    lineType:线条类型
    bottomLeftOrigin:这个参数是False,坐标系统是从左上角到右下角(默认),如果设置为True,坐标系统将从左下角到右上角。

'''

# encoding=utf-8
import cv2
import numpy as npimg = np.zeros((512, 512, 3), np.uint8)# cv2.FONT_HERSHEY_SIMPLEX是cv2库内置的一种等宽字体,无需加载外部字体文件,因此使用起来更为方便。
# fontScale=2是字体的大小比例,这个值越大,字体就越大
# thickness=2是文本的线条宽度。这个值越大,文本就越粗。
# lineType=cv2.LINE_AA是线条的类型。这里使用的是抗锯齿线型,这种线型可以使得文本的边缘更加平滑。cv2.putText(img, " HELLO OPENCV", (0, 300), cv2.FONT_HERSHEY_SIMPLEX, fontScale=2, color=(105, 219, 64), thickness=2,lineType=cv2.LINE_AA)cv2.imshow("putText ", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制标记

# encoding=utf-8
import numpy as np
import cv2img = np.ones((320, 320, 3), np.uint8) * 255# cv2.drawMarker()函数在图像上绘制不同类型的标记
'''
markerType(标记类型):指定标记的类型。这里使用的标记类型分别为:0:普通的黑色标记2:叉号3:圆圈4:四边形5:五边形6:六边形1:倒三角形7:自定义形状(需要提供额外的参数)这里没有给出具体的形状参数,所以会显示一个默认的自定义形状。
'''cv2.drawMarker(img, (30, 30), (0, 0, 255), 0)
cv2.drawMarker(img, (60, 60), (0, 0, 255), 2)
cv2.drawMarker(img, (90, 90), (0, 0, 255), 3)
cv2.drawMarker(img, (120, 120), (0, 0, 255), 4)
cv2.drawMarker(img, (150, 150), (0, 0, 255), 5)
cv2.drawMarker(img, (180, 180), (0, 0, 255), 6)
cv2.drawMarker(img, (210, 210), (0, 0, 255), 1)
cv2.drawMarker(img, (240, 240), (0, 0, 255), 7)cv2.imshow('drawMarker', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

鼠标交互绘制十字线

# encoding=utf-8
import cv2
import numpy as np# 回调函数
def onmouse_pick_points(event, x, y, flags, param):if event == cv2.EVENT_LBUTTONDOWN:  # cv2.EVENT_LBUTTONDOWN 鼠标左键print("x=%d,y=%d" % (x, y))# 图像上绘制标记cv2.drawMarker(param, (x, y), (0, 0, 255))  # 图像 坐标 颜色# 新建画布
image = np.ones((256, 256, 3), np.uint8) * 255
# 新建窗口
cv2.namedWindow("pick_points",0)
# 使用setMouseCallback函数为图像窗口绑定鼠标回调函数
cv2.setMouseCallback("pick_points", onmouse_pick_points, image)# 循环,按下ESC键退出循环
while True:cv2.imshow("pick_points", image)key = cv2.waitKey(30)if key == 27:break# 销毁窗口
cv2.destroyAllWindows()

鼠标交互绘制图形

import cv2
import numpy as npdef draw_rectangle(event, x, y, flags, param):global ix, iy   # 设置全局变量ix和iy为鼠标左键按下时的x和y坐标if event == cv2.EVENT_LBUTTONDOWN:  # 鼠标左键ix, iy = x, yprint("point1:=", x, y)elif event == cv2.EVENT_LBUTTONUP:  # 鼠标左键释放# 打印出第二个点的坐标以及矩形的宽度和高度,并在图像上绘制矩形。print("point2:=", x, y)print("width=", x - ix)print("height=", y - iy)cv2.rectangle(img, (ix, iy), (x, y), (0, 0, 255), 2)img = np.ones((512, 512, 3), np.uint8) * 255
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_rectangle)while True:cv2.imshow('image', img)key = cv2.waitKey(30)if key == 27:breakcv2.destroyAllWindows()

鼠标交互制作几何画板

import numpy as np
import cv2# 定义一个函数draw_circle,它接受五个参数:事件类型,x坐标,y坐标,标志和参数。
def draw_circle(event, x, y, flags, param):# 声明全局变量ix和iy,这两个变量被用来存储鼠标左键按下时的位置。  global ix, iy# 声明全局变量drawing,这个变量被用来标记是否正在绘制图形。  global drawing# 如果事件是鼠标左键按下:  if event == cv2.EVENT_LBUTTONDOWN:# 将drawing设为True,表示开始绘制图形。  drawing = True# 将鼠标左键按下的x和y坐标赋值给ix和iy。  ix, iy = x, y# 如果事件是鼠标移动:elif event == cv2.EVENT_MOUSEMOVE:# 如果drawing为True,表示正在绘制图形:  if drawing:# 如果mode为True,则绘制一个矩形。这里的矩形的颜色是绿色(RGB值为(0,255,0))。  if mode:cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)# 如果mode为False,则绘制一个圆。这里的圆的直径是5个像素。else:cv2.circle(img, (x, y), 5, (0, 0, 255), -1)# 如果事件是鼠标左键松开:elif event == cv2.EVENT_LBUTTONUP:# 将drawing设为False,表示停止绘制图形。  drawing = False# 如果mode为True,则绘制一个矩形。  if mode:cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)# 如果mode为False,则绘制一个圆。这里的圆的直径是5个像素的随机值。颜色是红色和绿色(RGB值为(0,随机值,随机值))的混合。else:cv2.circle(img, (x, y), 5 * np.random.randint(5, 15),(0, np.random.randint(200, 255), np.random.randint(200, 255)), -1)# 设置drawing为False,表示开始时没有正在绘制图形。drawing = False
# 设置mode为True,表示开始时默认绘制矩形。  
mode = True
# 将ix和iy初始化为-1,表示开始时没有鼠标左键被按下的位置。  
ix, iy = -1, -1# 创建一个512x512的黑色图像。注意这个图像是三通道的,每个通道的像素值都是0(也就是黑色)。  
img = np.zeros((512, 512, 3), np.uint8)
# 创建一个名为'image'的窗口,并设置鼠标回调函数为draw_circle。这样当鼠标在窗口内移动或者点击时,就会调用draw_circle函数。  
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)# 进入一个无限循环,显示图像并等待按键输入。  
while True:# 在'image'窗口中显示图像。  cv2.imshow('image', img)# 等待按键输入,按键的ASCII值在返回之前会被过滤掉(只保留一个字节)。这里等待的时间是无限长,所以只会返回有效的ASCII值或者ESC键的值(ASCII值为27)。  k = cv2.waitKey(1) & 0xFF# 如果按键是'm':  if k == ord('m'):# 将mode取反,也就是切换绘制矩形和圆形的模式。  mode = not mode# 如果按键是ESC键(ASCII值为27):elif k == 27:# 跳出无限循环,结束程序。  break# 销毁所有创建的窗口。

滚动条控制

# 导入cv2库,这是一个开源的计算机视觉库
import cv2
# 导入numpy库,这是一个用于进行数组操作的库
import numpy as np# 定义一个名为update_alpha的函数,函数功能为更新alpha值
def update_alpha(x):# 全局变量alpha,储存alpha值global alpha, img, img2# 获取alpha的当前位置alpha = cv2.getTrackbarPos('Alpha', 'hehua')# 将alpha值乘以0.01,可能是为了将其缩放到一个合适的范围alpha = alpha * 0.01# 更新img的值,此处的img2可能未定义,或者定义在函数外部img = np.uint8(np.clip((alpha * img2 + beta), 0, 255))# 定义一个名为update_beta的函数,功能为更新beta值
def update_beta(x):# 全局变量beta,储存beta值global beta, img, img2# 获取beta的当前位置beta = cv2.getTrackbarPos('Beta', 'hehua')# 更新img的值img = np.uint8(np.clip((alpha * img2 + beta), 0, 255))# 初始化alpha的值为0.1
alpha = 0.1
# 初始化beta的值为60
beta = 60
# 定义图片的路径,此处的路径似乎不完整,通常应该是一个完整的文件路径如'path/to/your/image.jpg'
img_path = "hehua..jpg"
# 通过cv2.imread读取图片路径的图片,将图片存储在img变量中
img = cv2.imread(img_path)
# 再次读取同一图片路径的图片,将图片存储在img2变量中,此处可能img2未被使用或未被初始化
img2 = cv2.imread(img_path)
# 创建一个名为'hehua'的窗口,如果窗口已存在则会被重绘
cv2.namedWindow('hehua')
# 创建一个名为'Alpha'的滑动条,当滑动条的位置改变时,会调用update_alpha函数
cv2.createTrackbar('Alpha', 'hehua', 0, 300, update_alpha)
# 创建一个名为'Beta'的滑动条,当滑动条的位置改变时,会调用update_beta函数
cv2.createTrackbar('Beta', 'hehua', 0, 255, update_beta)
# 设置滑动条'Alpha'的初始位置为100
cv2.setTrackbarPos('Alpha', 'hehua', 100)
# 设置滑动条'Beta'的初始位置为10
cv2.setTrackbarPos('Beta', 'hehua', 10)# 进入无限循环,每次循环都会显示图片,直到遇到退出条件
while True:# 在'hehua'窗口显示图片cv2.imshow('hehua', img)# 等待30毫秒,如果没有键按下则继续等待,如果有键按下则获取该键的ASCII码并赋值给keykey = cv2.waitKey(30)# 如果key的值为27(ASCII码对应于ESC键),则退出循环if key == 27:break# 销毁所有创建的窗口并退出程序
cv2.destroyAllWindows()

鼠标事件练习

请编写一个程序,建立一个200*300的白色画布,在该画布上双击鼠标左键时以鼠标双击的位置为圆心画一个半径为20的蓝色圆形,
鼠标右键双击时在鼠标双击的位置画一个边长为20的红色正方形(矩形的宽和高都为20),当单击ESC键时可以退出程序。
# encoding=utf-8
import numpy as np
import cv2
img = np.zeros((200, 320, 3), np.uint8) + 255  # 创建一幅白色图像
def draw(event, x, y, flag, param):if event == cv2.EVENT_LBUTTONDBLCLK:cv2.circle(img, (x, y), 20, (255, 0, 0), -1)  # 双击鼠标左键时画圆elif event == cv2.EVENT_RBUTTONDBLCLK:cv2.rectangle(img, (x, y), (x + 20, y + 20), (0, 0, 255), -1)  # 双击鼠标右键时画矩形
cv2.namedWindow('drawing')
cv2.setMouseCallback('drawing', draw)while (True):cv2.imshow('drawing', img)  # 显示图像k = cv2.waitKey(1)if k == 27:  # 按【Esc】键时结束循环break
cv2.destroyAllWindows()

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

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

相关文章

实现Element Select选择器滚动加载

<template><el-selectpopper-class"more-tag-data"v-model"tagId"filterableplaceholder"请选择"focus"focusTag"><el-optionv-for"(item, index) in taskTagLists":key"index":label"item.n…

互联网Java工程师面试题·Java 并发编程篇·第七弹

目录 16、CAS 的问题 17、什么是 Future&#xff1f; 18、什么是 AQS 19、AQS 支持两种同步方式&#xff1a; 20、ReadWriteLock 是什么 21、FutureTask 是什么 22、synchronized 和 ReentrantLock 的区别 23、什么是乐观锁和悲观锁 24、线程 B 怎么知道线程 A 修改了…

蓝桥杯 枚举算法 (c++)

枚举就是根据提出的问题&#xff0c;——列出该问题的所有可能的解&#xff0c;并在逐一列出的过程中&#xff0c;检验每个可能解是否是问题的真正解&#xff0c; 如果是就采纳这个解&#xff0c;如果不是就继续判断下一个。 枚举法一般比较直观&#xff0c;容易理解&#xff0…

完美解决lftp遇到put: Access failed: 553 Could not create file.

目录 一、问题 二、原因 三、解决方法 一、问题 put: Access failed: 553 Could not create file. 二、原因 &#xff08;1&#xff09;没有关闭SeLinux &#xff08;2&#xff09;linux默认安装vsftp服务之后只允许匿名用户的访问和下载&#xff0c;不支持上传。 三、解决方…

matlab 图像均值滤波

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠翻译,放入付费专栏只为防不要脸的爬虫。专栏值钱的不是本文,切勿因本文而订阅。 一、算法原理 均值滤波是一种常用的线性滤波方法,用于平滑图像并减少噪声。它的实现过程如下: 确定滤波器的大小:选择一个固定的…

P1443 马的遍历

#include <iostream> #include <queue> using namespace std; #define M 400 int arr[M 5][M 5]; typedef struct Node {int x, y; } Node; //将马能走的8个方向封装成一个二维数组 int dir[8][2] {{2, 1}, {2, -1}, {-2, 1}, {-2, -1},{1, 2}, {-1, 2}, {1, -2…

nginx的location的优先级和匹配方式

nginx的location的优先级和匹配方式 在http模块中有server&#xff0c;server模块中有location&#xff0c;location匹配的是uri 在一个server中&#xff0c;会有多个location&#xff0c;如何来确定匹配哪个location niginx的正则表达式 ^ 字符串的起始位置 $ 字符串的…

IDEA中查看整个项目代码行数

近期正在手撸Spring源码&#xff0c;想要看下自己写了多少行代码。记录下如何查看项目的代码行数&#xff0c;方便日后查阅

Hadoop3教程(六):HDFS中的DataNode

文章目录 &#xff08;63&#xff09;DataNode工作机制&#xff08;64&#xff09;数据完整性&#xff08;65&#xff09;掉线时限参数设置参考文献 &#xff08;63&#xff09;DataNode工作机制 DataNode内部存储了一个又一个Block&#xff0c;每个block由数据和数据元数据组…

【云计算】相关解决方案介绍

文章目录 1.1 云服务环境 Eucalyptus1.1.1 介绍1.1.2 开源协议及语言1.1.3 官方网站 1.2 开源云计算平台 abiCloud1.2.1 开源协议及语言1.2.2 官方网站 1.3 分布式文件系统 Hadoop1.3.1 开源协议及语言1.3.2 官方网站 1.4 JBoss云计算项目集 StormGrind1.4.1 开源协议及语言1.4…

【数据库——MySQL(实战项目1)】(3)图书借阅系统——存储函数

目录 1. 简述2. 功能代码2.1 创建存储函数&#xff0c;根据图书编号查借阅人姓名&#xff0c;并调用该函数查询‘ **小邓在森林** ’已借未还的图书情况&#xff1b;2.2 创建存储函数&#xff0c;计算某借阅人还能借阅的图书数目&#xff0c;学生限额 5 本&#xff0c;教师限额…

Vue3 + Nodejs 实战 ,文件上传项目--实现文件批量上传(显示实时上传进度)

目录 技术栈 1.后端接口实现 2.前端实现 2.1 实现静态结构 2.2 整合上传文件的数据 2.3 实现一键上传文件 2.4 取消上传 博客主页&#xff1a;専心_前端,javascript,mysql-CSDN博客 系列专栏&#xff1a;vue3nodejs 实战--文件上传 前端代码仓库&#xff1a;jiangjunjie…

树莓派部署.net core网站程序

1、发布你的项目 使用mobaxterm上传程序 回到mobaxterm,f进入目录输入&#xff1a; cd webpublish 运行程序&#xff1a;dotnet WebApplication1.dll 访问地址为&#xff1a;http://localhost:5000,尝访问如下&#xff1a; 已经出现 返回的json&#xff0c;证明是可以访问的…

MyBatis的缓存,一级缓存,二级缓存

10、MyBatis的缓存 10.1、MyBatis的一级缓存 一级缓存是SqlSession级别的&#xff0c;通过同一个SqlSession对象 查询的结果数据会被缓存&#xff0c;下次执行相同的查询语句&#xff0c;就 会从缓存中&#xff08;缓存在内存里&#xff09;直接获取&#xff0c;不会重新访问…

软件架构设计(业务架构、应用架构、数据架构、技术架构)

一、架构相关概念 1、系统 系统&#xff1a;由一群有关联的个体组成&#xff0c;根据某种规则运作&#xff0c;能完成个别原件不能独立完成的工作的群体。大的系统可以嵌套小系统&#xff0c;被嵌套的小系统往往称为大系统的子系统。 2、模块 模块是从逻辑上将系统分解&#…

Java也能做OCR!SpringBoot 整合 Tess4J 实现图片文字识别

前言 今天给大家分享一个SpringBoot整合Tess4j库实现图片文字识别的小案例&#xff0c;希望xdm喜欢。 文末有案例代码的Git地址&#xff0c;可以自己下载了去玩玩儿或继续扩展也行。 话不多说&#xff0c;开整吧。 什么是Tess4j库 先简单给没听过的xdm解释下&#xff0c;这里要…

风储联合系统的仿真模型研究

摘要 风能是目前国内外应用较为广泛的一种绿色可再生能源&#xff0c;近几年我国风电产业的发展十分迅速。然后&#xff0c;越来越多的风力发电系统建并网&#xff0c;风力发电产生的电能受外界因素影响较大&#xff0c;具有一定的随机性和波动性&#xff0c;给并网后的电力系统…

铜死亡+机器学习+WGCNA+分型生信思路

今天给同学们分享一篇单基因泛癌免疫实验生信文章“IGF2BP3 overexpression predicts poor prognosis and correlates with immune infiltration in bladder cancer”&#xff0c;这篇文章于2023年2月3日发表在BMC Cancer期刊上&#xff0c;影响因子为3.8。 膀胱癌是全球最常见…

【环境】Ubuntu20.04 安装 Anaconda 顺顺利利

ubuntu里面安装的Anaconda也是顺顺利利 别忘了source source一下 参考链接 中间遇到了一个问题&#xff0c;用下面的链接轻松解决了 关于修改anaconda安装路径的问题

Stable Diffusion 动画SD-Animatediff V2

AI不仅可以生成令人惊叹的图片,还能给这些图片注入生命,让它们动起来。 这就是AnimateDiff要做的事情,一个神奇的工具,能将静态的AI生成图像转换成动画。 本次介绍基于SD如何实现这个神奇的方法。 文章目录 插件安装使用方法参数调整文生动图/视频Controlnet方法SD API方…