Opencv(图像处理)-基于Python-绘图功能

news2025/3/10 5:38:14

在这里插入图片描述

  • 1.介绍
  • 2. line()
  • 3.rectangle()
  • 4.circle()
  • 5. ellipse()
  • 6.polylines()
  • 7.fillPoly()
  • 8. putText()
  • 代码示例
  • 9.用鼠标在图片上作图

1.介绍

OpenCV为开发者还提供了绘图功能,我们可以通过函数来实现在图片上作图。

2. line()

画线
cv2.line(img,开始点,结束点,颜色,线宽,线型,shift)
参数:img:在选中的图片上画;
开始点/结束点:开始坐标和结束坐标(x,y);
颜色:(b,g,r),作为元组输入,如果是灰度图像,直接填数字。
线宽:线或圆等的粗细。如果对闭合图形(如圆)传递-1 ,它将填充形状。默认厚度= 1
线型:线的类型,是否为8连接线,抗锯齿线等。默认情况下,为8连接线。cv.LINE_AA给出了抗锯齿的线条,看起来非常适合曲线

3.rectangle()

画矩形
cv2.rectangle(img,起始坐标,中止坐标,颜色,线宽,线型)
img:在选中的图片上画;
起始坐标,中止坐标:从左上角坐标开始,到右下角结束。
颜色:(b,g,r),作为元组输入,如果是灰度图像,直接填数字。
线宽:线或圆等的粗细。如果对闭合图形(如圆)传递-1 ,它将填充形状。默认厚度= 1
线型:线的类型,是否为8连接线,抗锯齿线等。默认情况下,为8连接线。cv.LINE_AA给出了抗锯齿的线条,看起来非常适合曲线。

4.circle()

画圆
cv2.circle(img,中心坐标,半径,颜色,线宽,线型)
img:在选中的图片上画;
中心坐标和半径:圆的中心坐标,半径。
颜色:(b,g,r),作为元组输入,如果是灰度图像,直接填数字。
线宽:线或圆等的粗细。如果对闭合图形(如圆)传递-1 ,它将填充形状。默认厚度= 1
线型:线的类型,是否为8连接线,抗锯齿线等。默认情况下,为8连接线。cv.LINE_AA给出了抗锯齿的线条,看起来非常适合曲线。

5. ellipse()

画椭圆
cv2.ellipse(img,中心位置,(长轴长,短轴长),angle,stratAngle,endAngle,颜色,线宽,线型)
img:在选中的图片上画;
中心位置:中心坐标
(长轴长,短轴长):元组的形式输入轴的长度。
angle:椭圆沿顺时针方向旋转的角度。
startAngle和endAngle:从主轴沿顺时针方向测量的椭圆弧的开始和结束。即给出0和360给出完整的椭圆。

6.polylines()

画多边形
cv2.polylines(img,点集,是否闭环,颜色)
img:在选中的图片上画;
点集:点的集合,如:[[10,5],[20,30],[70,20],[50,10]],并且点集的数据格式必须为np.int32
是否闭环:True\false
颜色:(b,g,r),作为元组输入,如果是灰度图像,直接填数字

7.fillPoly()

画实心的多边形
cv2.fillPoly(img,点集,颜色)

8. putText()

将文本放入图像中
cv2.putText(img,放入文字,起始坐标,font,字体大小,颜色,线宽,线型)
img:在选中的图片上画
放入文字:是一个字符串
起始坐标:放入位置的左下角坐标
font:文字类型,什么字体
字体大小:填数字
颜色:(b,g,r),作为元组输入,如果是灰度图像,直接填数字。
线宽:线或圆等的粗细。如果对闭合图形(如圆)传递-1 ,它将填充形状。默认厚度= 1
线型:线的类型,是否为8连接线,抗锯齿线等。默认情况下,为8连接线。cv2.LINE_AA给出了抗锯齿的线条,看起来非常适合曲线,也适合文字。

字体的标志:
在这里插入图片描述

代码示例

import cv2
import numpy as np

# 创建一个黑色图片
img = np.zeros((480, 640, 3), np.uint8)
# 画直线
cv2.line(img, (10, 10), (300, 300), (255, 255, 255))

# 画一个矩形,填上-1,是画实心矩形
cv2.rectangle(img, (10, 10), (100, 40),(255, 255, 0), -1)

# 画一个实心圆
cv2.circle(img, (200, 200), 60, (0, 255, 255), -1, cv2.LINE_AA)

# 画一个椭圆
cv2.ellipse(img, (300, 200), (50, 20), 30, 0, 180, (255, 255, 255), -1)

# 画一个多边形
# 列表的形式创建一个数组
# 将数组以列表的形式传进去
arr = np.array([[100, 100], [100, 200], [300, 20], [400, 100]], np.int32)
arr.reshape((-1, 1, 2))
cv2.polylines(img, [arr], False, (255, 255, 255))

# 填充多边形
cv2.fillPoly(img, [arr], (255, 0, 255))


# 加入字体
cv2.putText(img, "OpenCV", (50, 350), cv2.FONT_HERSHEY_SIMPLEX, 3, (255, 255, 255),lineType = cv2.LINE_AA)


cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

9.用鼠标在图片上作图

"""
用鼠标在图片上直接作图
按住键盘L,拖动鼠标画直线
按住键盘r,拖动鼠标画矩形
按住键盘c,拖动鼠标画圆
"""
import cv2
import numpy as np

curshape = 0
startpos = [0, 0]

def mouse_callback(event, x, y, flags,userdata):
    global startpos, curshape
    if cv2.EVENT_LBUTTONDOWN == event: # 鼠标左键按下,获取起始坐标
        startpos = [x, y]
    elif event == cv2.EVENT_LBUTTONUP: # 鼠标左键抬起, 获得终点坐标
        if curshape == 0: # drawline
            cv2.line(img, startpos, (x, y), (255, 255, 255))
        elif curshape == 1: # drawrectangle
            cv2.rectangle(img, startpos, (x, y), (255, 255, 255))
        elif curshape == 2: # drawcircle
            a = (x - startpos[0])
            b = (y - startpos[1])
            r = int(((a**2)+(b**2))**0.5)  #结果要强转一下
            cv2.circle(img, startpos, r, (255, 255, 255))

# 创建窗口大小
cv2.namedWindow('drawing', cv2.WINDOW_NORMAL)
cv2.resizeWindow('drawing', 640, 480)

# 让该函数一直监听drawing界面,为了调用函数
cv2.setMouseCallback('drawing', mouse_callback)

# 创建全黑图片
img = np.zeros((480, 640, 3), np.uint8)

while True:
    cv2.imshow('drawing', img)
    key = cv2.waitKey(0)&0xff
    if key == ord('q'):
        print("退出成功")
        break
    elif key == ord('l'): # 线
        curshape = 0
    elif key == ord('r'): # 矩形
        curshape = 1
    elif key == ord('c'): # 圆
        curshape = 2
    else:
        print("输入错误,请重新输入")


cv2.destroyAllWindows()

在这里插入图片描述

鼠标的回调函数,一定要传五个参数!第五个参数可以随便用一个参数来占位!

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

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

相关文章

G0第23章:GORM基本示例、GORM Model定义、主键、表名、列名的约定

04 GORM基本示例 注意: 本文以MySQL数据库为例,讲解GORM各项功能的主要使用方法。 往下阅读本文前,你需要有一个能够成功连接上的MySQL数据库实例。 Docker快速创建MySQL实例 很多同学如果不会安装MySQL或者懒得安装MySQL,可以使用一下命令…

STL好难(3):vector的使用

目录 1.vector的介绍和使用 2.vector的常见构造: 3.vector的遍历方式 🍉[ ] 下标 🍉通过迭代器进行访问: 🍉范围for: 4.vector的迭代器 🍉begin 和 end 🍉rbegin 和 rend …

【论文阅读】Densenet:Densely Connected Convolutional Networks 密集连接的卷积网络

文章目录 前言一、摘要二、网络架构2.1. densenet2.2. dense block2.3 与resnet对比2.4 pytorch代码 三.实验结果四.结论 前言 从今天开始总结一下之前看的一些深度学习相关的论文。 今天的这篇还是比较经典的论文:密集连接网络。在很多国内的硕士毕业论文里都出现…

XDP入门--eBPF程序实现网桥/二层交换机转发功能

本文目录 1、试验环境2、eBPF字节码源代码实现3、用户态应用层管理与控制程序的源代码实现4、编译与运行5、测试结果 我们在此文的进阶部分 或者 此文中已经描述了如何设置Linux网桥,并将多个以太接口加入网桥后实现一个最基本的二层交换机的二层交换转发功能。Linu…

如何在华为OD机试B卷中获得满分?Java实现【食堂供餐】一文详解

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

【剑指offer】数据结构——链表

目录 数据结构——字符串直接解【剑指offer】06. 从尾到头打印链表牛客力扣 【剑指offer】24. 反转链表【剑指offer】25. 合并两个排序的链表【剑指offer】35. 复杂链表的复制【剑指offer】52. 两个链表的第一个公共结点 特殊解——双指针【剑指offer】18. 删除链表的节点【剑指…

六级备考23天|CET-6|翻译技巧4|2013年官方样题|新年|9:45~11:00

目录 1 PRACTICE ANSWER 2 PRACTICE ANSWER 3 ​ PRACTICE ANSWER 4 PRACTICE ANSWER 5 PRACTICE ANSWER 6 ​ PRACTICE ANSWER ​​​​​​​ 答案整合​​​​​​​ 1 PRACTICE Chinese new year is the Chinese most important traditional festival, wh…

2023上半年软考系统分析师科目一整理-02

2023上半年软考系统分析师科目一整理-02 1. 安全2. 知识产权 1. 安全 对称加密算法中,由于加密解密都使用同样的密钥,所以密钥需要进行共享,故也被称共享密钥算法。 三重DES加密是使用2个DES密钥,进行多次操作来完成的&#xff…

Redis相关

Redis基本概念 一、Redis的持久化方式二、Redis的单机、主从、哨兵、集群Redis主从复制的原理 三、Redis分布式锁的实现四、缓存穿透 击穿 雪崩 一、Redis的持久化方式 1)RDB方式 2)AOF方式 二、Redis的单机、主从、哨兵、集群 单机的问题&#xf…

机器学习 | SVD奇异值分解

本文整理自哔哩哔哩视频:什么是奇异值分解SVD–SVD如何分解时空矩阵 📚奇异值分解是什么? M是原始矩阵,它可以是任意的矩阵,奇异值分解就是将它分解为三个矩阵相乘。U和V是方阵,∑是不规则矩阵,…

django组件552

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…

618京东预售一般便宜多少?跟直接买有啥区别?

618京东预售一般便宜多少?跟直接买有啥区别? 京东作为消费者比较喜欢的电商购物平台之一,经常会推出促销打折的活动,以吸引用户到平台上购物。在这些大促活动中,平台会在预售环节设置专属的优惠,让消费者下单提前锁定这些折扣&a…

一、stable diffusion的发展史

一、stable diffusion的发展史 本文目标:学习交流 对于熟悉SD的同学,一起学习和交流使用过程中的技巧和心得。 帮助新手 帮助没有尝试过SD但又对它感兴趣的同学快速入门,并且能够独立生成以上效果图。 1.发展史介绍: 2015年的时候…

RepGhost 解析

paper:RepGhost: A Hardware-Efficient Ghost Module via Re-parameterization official implementation:https://github.com/chengpengchen/repghost 存在的问题 特征重用feature reuse是轻量网络设计中常用的一种技术,现有的方法通常使…

[元带你学: eMMC协议详解 10] Device 识别流程 与 中断模式

依JEDEC eMMC 5.1及经验辛苦整理,付费内容,禁止转载。 所在专栏 《元带你学: eMMC协议详解》 全文2700字,重点需掌握设备识别过程(CMD1 -> CMD2 -> CMD3), 这很常用, 也是最容易出现异常的地方。其他…

Git进阶之代码回滚、合并代码、从A分支选择N次提交,合并到B分支【revert、merge、rebase、cherry-pick】

B站视频地址: https://www.bilibili.com/video/BV1KX4y1a7N9 Git学习文档:https://d9bp4nr5ye.feishu.cn/wiki/PeDPw3mm3iFA36k9td9cVeignsZ 在很长一段时间里,我对Git的操作只限于:提交代码,拉取代码,合…

研报精选230528

目录 【行业230528华金证券】传媒行业深度研究:AIGC最新应用与场景研究 【行业230528国海证券】电动船舶行业深度报告:绿色智能大势已至,驶向电化百亿蓝海 【行业230528华西证券】纺织服装行业周报:5月增长放缓无碍中长期出清逻辑…

Linux下的yum和vim

目录 一、Linux软件包管理器yum1.1 何为软件包?1.2 rzsz工具1.3 如何安装和卸载软件?1.4 Linux的软件生态 二、vim文本编辑器 一、Linux软件包管理器yum 1.1 何为软件包? 软件包可以理解成是windows下别人提前编译好的安装包程序&#xff0…

任务7 课程信息管理系统

系列文章 任务7 课程信息管理系统 已知课程的信息包括:课程编号,课程名称,课程性质(必修、选修),课时,学分,考核方式(考试、考查课),开课学期&a…

day41_servlet

今日内容 零、 复习昨日 一、Cookie 二、Session 三、拦截器 四、登录认证、全局编码格式 零、 复习昨日 注解 热部署 请求转发 重定向 路径问题 总结使用经验: 无论请求路径是多层是单层,在写路径时都从/开始,即从根开始如果是服务器动作,从/开始直接写如果是浏览器动作,从/开…