opencv 学习(3)

文章目录

    • 画直线
    • 画圆
    • 画矩形
    • 画多边形
    • 文字绘制
    • 画板

本部分图形绘制

本节内容比较简单 直接上代码

画直线

import cv2 
import numpy as np

## 本节画直线

## line 参数介绍 
## image 在那个图像上面 画线
##  开始点借宿点 指定先的开始和结束的位置
## 颜色 线宽 线性
## shift 坐标轴缩放比例

image =np.zeros((480,640,3),np.uint8)

cv2.line(image,(10,10),(300,400),(0,0,255),5,4)

cv2.imshow("demo",image)

cv2.waitKey(0)

在这里插入图片描述

画圆

import cv2
import numpy as np

# 创建一个黑色的图像
image = np.zeros((500, 500, 3), dtype=np.uint8)

# 椭圆的中心坐标 (x, y)
center = (250, 250)

# 椭圆的长轴和短轴半径
axes = (200, 100)

# 椭圆的旋转角度(以度为单位)
angle = 0

# 椭圆的开始角度和结束角度(以度为单位),0到360度表示完整的椭圆
start_angle = 0
end_angle = 360

# 椭圆的颜色 (B, G, R) 和线型
color = (0, 255, 0)  # 绿色
thickness = 2  # 线宽

# 使用 cv2.ellipse 函数绘制椭圆
cv2.ellipse(image, center, axes, angle, start_angle, end_angle, color, thickness)

# 显示图像
cv2.imshow('Ellipse', image)

# 等待按键事件然后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

画矩形

import cv2
import numpy as np

# 创建一个黑色的图像
image = np.zeros((500, 500, 3), dtype=np.uint8)

# 矩形的左上角坐标 (x1, y1) 和右下角坐标 (x2, y2)
top_left_corner = (50, 50)
bottom_right_corner = (450, 450)

# 矩形的颜色 (B, G, R) 和线型
color = (0, 0, 255)  # 红色
thickness = 2  # 线宽

# 使用 cv2.rectangle 函数绘制矩形
cv2.rectangle(image, top_left_corner, bottom_right_corner, color, thickness)

# 显示图像
cv2.imshow('Rectangle', image)

# 等待按键事件然后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

画多边形

#绘制多边形


import cv2
import numpy as np

# 创建一个黑色的图像
image = np.zeros((500, 500, 3), dtype=np.uint8)

# 六边形的中心坐标和半径
center = (250, 250)
radius = 100

# 计算六边形的顶点(每60度一个顶点)
angles = np.linspace(0, 2 * np.pi, 7, endpoint=False)
vertices = np.round(np.vstack([radius * np.cos(angles) + center[0], radius * np.sin(angles) + center[1]]).T).astype(int)

# 将顶点转换为适合polylines的格式:[N, 1, 2],其中N是点的数量
vertices = [vertices.reshape((-1, 1, 2))]

# 六边形的颜色 (B, G, R) 和线型
color = (0, 255, 0)  # 绿色
thickness = 2  # 线宽
isClosed = True  # 表示多边形是闭合的

# 使用 cv2.polylines 函数绘制六边形
cv2.polylines(image, vertices, isClosed, color, thickness)

# 添加注释文本
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 0.5
color_text = (255, 255, 255)  # 白色文本
thickness_text = 1

# 在图像上添加文本注释
cv2.putText(image, 'Hexagon', (center[0] - 20, center[1] - 20), font, font_scale, color_text, thickness_text, cv2.LINE_AA)

# 显示图像
cv2.imshow('Hexagon', image)

# 等待按键事件然后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

文字绘制

import cv2
import numpy as np

# 创建一个空白的图像(例如,黑色背景)
image_width, image_height = 800, 600  # 你可以根据需要调整大小
image = np.zeros((image_height, image_width, 3), dtype=np.uint8)  # 3通道用于彩色图像

# 要绘制的文本
text = "MAN what can i say"

# 设置文本参数
font = cv2.FONT_HERSHEY_SIMPLEX  # 字体类型
font_scale = 1.5  # 字体大小比例,可以根据需要调整
thickness = 2  # 文本线条粗细
color = (255, 255, 255)  # 白色文本

# 获取文本的边界框大小(宽度和高度)
(text_width, text_height), baseline = cv2.getTextSize(text, font, font_scale, thickness)

# 计算文本在图像中心的位置
# 注意:getTextSize返回的是文本的底部边界,所以我们需要从中心高度中减去文本高度的一半再加上基线偏移
center_x = image_width // 2
center_y = image_height // 2 + text_height // 2 - baseline

# 在图像中心绘制文本
cv2.putText(image, text, (center_x - text_width // 2, center_y), font, font_scale, color, thickness, cv2.LINE_AA)

# 显示图像
cv2.imshow('Text in Center', image)
cv2.waitKey(0)  # 等待按键
cv2.destroyAllWindows()  # 关闭窗口

在这里插入图片描述

画板

import cv2
import numpy as np

# 初始化一个空白的图像(黑色背景)
image_width, image_height = 800, 600
image = np.zeros((image_height, image_width, 3), dtype=np.uint8)
trajectory = []  # 存储鼠标移动的轨迹点
drawing = False  # 标记是否正在绘图

# 鼠标回调函数
def draw_line(event, x, y, flags, param):
    global drawing, trajectory
    if event == cv2.EVENT_MOUSEMOVE:
        if drawing:
            trajectory.append((x, y))  # 添加当前点到轨迹列表中
    elif event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        trajectory.clear()  # 清空轨迹列表
        trajectory.append((x, y))  # 添加起始点到轨迹列表中
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False

# 创建窗口并设置鼠标回调函数
cv2.namedWindow('Drawing Board')
cv2.setMouseCallback('Drawing Board', draw_line)

# 显示循环
while True:
    # 清空图像(每次循环都重新绘制轨迹)
    image.fill(0)
    print("111111111111111")
    # 如果正在绘图且有轨迹点,则绘制轨迹
    if drawing and trajectory:
        for i in range(1, len(trajectory)):
            x1, y1 = trajectory[i-1]
            x2, y2 = trajectory[i]
            cv2.line(image, (x1, y1), (x2, y2), (255, 255, 255), 5)  # 白色线条,线宽为5
    print("222222")
    # 显示当前图像
    cv2.imshow('Drawing Board', image)
    print("3333333")
    # 检查是否按下ESC键以退出循环
    if cv2.waitKey(1) & 0xFF == 27:
        break

# 释放窗口并销毁所有OpenCV窗口
cv2.destroyAllWindows()

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java-数据结构-栈与队列(StackQueue)

一、栈(Stack) ① 栈的概念 栈是一种特殊的线性表,它只允许固定一端进行"插入元素"和"删除元素"的操作,这固定的一端被称作"栈顶",对应的另一端就被称做"栈底"。 📚 栈中的元素遵循后…

带格式 pdf 翻译

支持 openAI 接口,国内 deepseek 接口兼容 openAI 接口, deepseek api 又非常便宜 https://pdf2zh.com/ https://github.com/Byaidu/PDFMathTranslate

【如何从0到1设计测试用例使用Fiddler完成弱网测试】

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 ⭐⭐⭐测试用…

基础项目实战——贪吃蛇(c++)

目录 前言一、 游戏总体框架二、地图绘制三、光标隐藏四、地图定义五、蛇体定义六、蛇体绘制七、蛇体移动八、频率控制九、边界检测十、游戏失败十一、蛇体转向十二、食物生成十三、食物碰撞十四、整体代码十五、结语 前言 各位小伙伴们好久不见,前段时间非常的忙很…

排序:插入、选择、交换、归并排序

排序 :所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,…

Windows service运行Django项目

系统:Windows Service 软件:nssm,nginx 配置Django项目 1、把Django项目的静态文件整理到staticfiles文件夹中 注:settings中的设置 STATIC_URL /static/ STATIC_ROOT os.path.join(BASE_DIR, staticfiles/) STATICFILES_DI…

comfyui精准作图之gligen

简介 在 Stable Diffusion(SD)中,GLIGEN 是一种用于增强文本到图像生成模型可控性的技术。它通过在现有的预训练扩散模型(如 Stable Diffusion)基础上,引入额外的定位输入(如边界框、关键点或参…

【学习资源】MBSE和工业软件

工业软件从业者,需要学习与应用MBSE方法论,解决复杂问题的有效手段。笔者做一个简单介绍。 1 什么是MBSE? MBSE(Model-Based Systems Engineering,基于模型的系统工程)是一种系统工程方法论,其…

ue5 蒙太奇,即上半身动画和下半身组合在一起,并使用。学习b站库得科技

本文核心 正常跑步动画端枪动画跑起来也端枪 正常跑步动画 端枪动画的上半身 跑起来也端枪 三步走: 第一步制作动画蒙太奇和插槽 第二步动画蓝图选择使用上半身动画还是全身动画,将上半身端枪和下半身走路结合 第三步使用动画蒙太奇 1.开始把&a…

【Docker】docker compose 安装 Redis Stack

注:整理不易,请不要吝啬你的赞和收藏。 前文 Redis Stack 什么是? 简单来说,Redis Stack 是增强版的 Redis ,它在传统的 Redis 数据库基础上增加了一些高级功能和模块,以支持更多的使用场景和需求。Redis…

视频转码对画质有影响吗?视频融合平台EasyCVR支持哪些转码格式?

视频转码过程是将视频文件从一种编码格式转换为另一种格式的过程,这一过程在现代数字媒体中扮演着至关重要的角色。众所周知,视频转码不仅仅是简单的格式转换,它涉及多个关键参数的改变,例如视频编码格式、比特率、分辨率以及帧率…

vscode开启调试模式,结合Delve调试器调试golang项目详细步骤

1.前期准备 (1).在vs code中的扩展程序中搜索并安装Go扩展程序 (2).安装 Delve 调试器 go install github.com/go-delve/delve/cmd/dlvlatest (3).打开vs code的命令面板,输入Go: Install/Update Tools,并单击该命令执行,安装或更新Go语…

springboot和vue配置https请求

项目场景: 代码发布到线上使用https请求需要配置ssl证书,前后端都需要修改。 问题描述 如图,我们在调用接口时报如下错误,这就是未配置ssl但是用https请求产生的问题。 解决方案: 前端:在vite.config.js文…

每日学习30分轻松掌握CursorAI:Cursor基础设置与配置

Cursor基础设置与配置 一、基础设置概览 1. 设置项分类表 设置类别主要功能重要程度语言设置界面及AI交互语言配置★★★★★快捷键配置自定义操作快捷键★★★★☆外观设置主题、字体、颜色方案★★★☆☆编辑器设置缩进、换行、代码风格★★★★☆AI功能设置AI响应灵敏度、…

设计模式(观察者模式)

设计模式(观察者模式) 第三章 设计模式之观察者模式 观察者模式介绍 观察者模式(Observer Design Pattern) 也被称为发布订阅模式 。模式定义:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候…

QT 下拉菜单设置参数 起始端口/结束端口/线程数量 端口扫描4

上篇文章QT实现 端口扫描暂停和继续功能 3-CSDN博客 双击 添加对话框类 界面设计 由于主体代码已经写完,只需要更改参数的获取即可 获取起始端口结束端口的输入 槽函数 给主界面类添加调用对话框类的功能 实现功能:点击菜单项可以弹出对话框窗体 增加槽…

Unity自定义编辑器:基于枚举类型动态显示属性

1.参考链接 2.应用 target并设置多选编辑 添加[CanEditMultipleObjects] using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;[CustomEditor(typeof(LightsState))] [CanEditMultipleObjects] public class TestInspector :…

《代码随想录》Day31打卡!

《代码随想录》贪心算法:合并区间 本题的完整题目如下所示: 本题的完整思路如下所示: 1.本题依然是先对数组的左边界进行排序。将数组的第一个元素赋值给current。 2.遍历数组,判断current中的右边界和当前元素的左边界是否有重叠…

灵活运用事务回滚,快捷处理多张数据表格

各位编程宝子们(尤其是对MySQL了解不多的宝子们)在使用关系表处理时,有时候会希望简单一次性解决多张表的数据处理,但又有时候无从下手。其实有时候掌握数据的事务和回滚便可以简单解决这些事情,接下来我将以一个学生信…

Github提交Pull Request教程 Git基础扫盲(零基础易懂)

1 PR是什么? PR,全称Pull Request(拉取请求),是一种非常重要的协作机制,它是 Git 和 GitHub 等代码托管平台中常见的功能,被广泛用于参与社区贡献,从而促进项目的发展。 PR的整个过…