opencv图形绘制2

news2024/11/24 16:33:10

目录

制作宣传语(中文)

制作宣传语(英文)

绘制标记

鼠标交互绘制十字线

鼠标交互绘制图形

鼠标交互制作几何画板

滚动条控制


制作宣传语(中文)

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 np

img = 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 cv2

img = 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 np


def draw_rectangle(event, x, y, flags, param):
    global ix, iy   # 设置全局变量ix和iy为鼠标左键按下时的x和y坐标
    if event == cv2.EVENT_LBUTTONDOWN:  # 鼠标左键
        ix, iy = x, y
        print("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:
        break

cv2.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码并赋值给key
    key = cv2.waitKey(30)
    # 如果key的值为27(ASCII码对应于ESC键),则退出循环
    if key == 27:
        break
    # 销毁所有创建的窗口并退出程序
cv2.destroyAllWindows()

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

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

相关文章

pytest+allure生成测试报告

pytest框架使用 一、安装插件 #常用安装插件 pytest pytest-html (生成html格式的自动化测试报告) pytest-xdist (测试用例分布式执行,多cpu分发) pytest-ordering(用于改变测试用例的执行顺序&#xff0…

有趣的 scanf()

限制接收内容 这里的意思是直接收a、b、c作为ch的内容,遇到其它字符放入缓冲区中。 【scanf("%[...]",ch);只接收[]中的内容作为字符串的内容,将其它的内容放入缓冲区中】 这里将aaa后面的h放入缓冲区,但是没有抛弃掉,故而无法接收…

实现手机号码中间四位显示为*号方法

实现手机号码中间四位显示为*号方法: substring使用方法: 开始位置,结束位置(不包括结束) 下面的示例就是 截取0到3不包含3,中间4个*,从第7开始截取到最后 // 转换用户手机号let telephone t…

GPU -- 图形处理器(显卡)

目录 GPUGPU 的主要信息和功能显存位宽接口v-sync散热 GPU 显卡(Graphics Processing Unit,GPU)是计算机中的一种专门用于处理图形和图像相关任务的硬件设备。它是计算机图形和图像处理的关键组成部分,通常用于加速图形渲染、视频…

手把手教你基于windows系统使用GNVM进行node切换版本

GNVM是什么? GNVM 是一个简单的 Windows 下 Node.js 多版本管理器,类似的 nvm nvmw nodist 。 安装 进入官网,下载你所需要的包,直达链接 下载完成 放到我们的node环境包下,点击运行 请注意区分: 不存在 Node.js 环…

创意营销:初期推广的多种策略!

文章目录 🍊 预热🎉 制定预热计划和目标🎉 利用社交媒体传播🎉 创造独特的体验🎉 利用口碑营销🎉 定期发布更新信息🎉 案例说明 🍊 小范围推广🎉 明确目标用户群体&#…

[C++随想录] 继承

继承 继承的引言基类和子类的赋值转换继承中的作用域派生类中的默认成员函数继承与友元继承与静态成员多继承的结构棱形继承的结构棱形虚拟继承的结构继承与组合 继承的引言 概念 继承(inheritance)机制是面向对象程序设计使代码可以 复用的最重要的手段,它允许程序…

反弹Shell方法论

反弹Shell方法论 1.bash反弹shell2.Python 脚本反弹shell3.php反弹shell4.Java反弹shell5.perl 反弹shell6.Ruby脚本反弹shell7.利用nc反弹shell8.powershell反弹shell9.Socat反弹shell10.使用OpenSSL反弹加密shell11.反弹shell的本质 反弹shell命令查询 如果可以,尽…

2023年中国玉米淀粉糖市场现状及行业需求前景分析[图]

玉米淀粉糖是一种优良的可生物降解的天然高分子材料,也是近年来发展最快的淀粉深加工产品,淀粉糖是利用含淀粉质的农产品为原料,经过酸法、酸酶法或者双酶法水解制取的糖的统称,玉米淀粉糖的产品形式多种多样,目前&…

智能警用装备管理系统-科技赋能警务

警用物资装备管理系统(智装备DW-S304)是依托互云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对警用装备进行统一管理、分析的信息化、智能化、规范化的系统。 (1)感知智能化 装备感知是整个方案的基础,本方…

python基于django的留学生服务管理平台

留学服务管理平台的用户是系统最根本使用者,按需要分析系统包括三类用户:学生、教师、管理员。这三类用户对系统的需求简要如下。技术栈 后端:pythondjango 前端:vueCSSJavaScriptjQueryelementui 开发语言:Python 框架…

向量数据库与传统数据库向量检索插件的区别?

向量数据库与传统数据库向量检索插件的区别 越来越多的传统关系型数据库和检索系统(如 Clickhouse、Elasticsearch等)开始提供内置的向量检索插件。 例如,Elasticsearch 8.0 支持通过 Restful API 来插入向量和开展 ANN 检索。但是,向量检索插件的问题显而易见——无法提供…

资源共享共赢系统应用

1.访问地址 http://www.gxcode.top/code 2.收益功能说明 上传共享收益资源信息,审核通过后获取收益。 3.具体操作如下图

更健康的不粘锅,用料扎实疏油疏水,帝伯朗零氟系列氧吧锅上手

做饭时,平底锅、汤锅、炒锅等锅具都经常用到,为了方便清理,很多人会选择不粘锅。不过在市面上的不粘锅质量良莠不齐,实际做饭的时候,因为要长时间高温使用,所以劣质的不粘锅很容易析出重金属、特氟龙等有害…

量子风险现在是真实存在的:如何应对不断变化的数据收集威胁

在数据安全至关重要的时代,清楚地提醒人们不断变化的威胁形势。黑客正在渗透路由器以及联网设备,以获得对国家网络的不可检测的后门访问权限。 这一事件凸显了数字基础设施中的漏洞,特别是数据在未知且通常是敌对的网络上传输时所面临的风险…

Vue鼠标右键画矩形和Ctrl按键多选组件

效果图 说明 下面会贴出组件代码以及一个Demo&#xff0c;上面的效果图即为Demo的效果&#xff0c;建议直接将两份代码拷贝到自己的开发环境直接运行调试。 组件代码 <template><!-- 鼠标画矩形选择对象 --><div class"objects" ref"objectsR…

【AI视野·今日NLP 自然语言处理论文速览 第五十二期】Wed, 11 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 11 Oct 2023 Totally 81 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers LongLLMLingua: Accelerating and Enhancing LLMs in Long Context Scenarios via Prompt Compression Author…

Web3 招聘 | Bitget、MyShell、imToken、Arweave 多项目招聘中

「Web3 招聘」是 TinTinLand 为 Web3 项目和求职者创建的一个招聘信息汇集专栏。本栏目将持续更新区块链行业招聘信息&#xff0c;满足不同求职者与项目方的多样需求。欢迎各项目方联系 TinTinLand 发布职位需求&#xff0c;欢迎求职者关注 TinTinLand 获取最新招聘信息。 此外…

python(自5)scrapy下载安装 基本使用

一&#xff0c;安装下载 (1)安装步骤 ​ //安装包下载&#xff1a;Archived: Python Extension Packages for Windows - Christoph Gohlke (uci.edu) ​// 先下载对应的 twisted 然后 pip install 拖进twisted//例如&#xff1a; twisted_iocpsupport‑1.0.2‑cp311‑cp31…

人机交互中的信息数量与信息质量

在人机交互中&#xff0c;信息数量和信息质量是影响人机交互效果的两个重要因素。信息数量指的是系统向用户提供的信息总量&#xff0c;包括输入信息、反馈信息、展示信息、错误信息等&#xff0c;在合适的情况下越少越好&#xff1b;信息质量则是指信息的准确性、有效性、清晰…