OpenCV入门4——实现图形的绘制

文章目录

  • OpenCV绘制直线
  • OpenCV绘制矩形和圆
    • 画矩形
    • 画圆
  • OpenCV椭圆的绘制
  • OpenCV绘制多边形
  • OpenCV绘制文本
  • 实现鼠标绘制基本图形

在这里插入图片描述
在这里插入图片描述

OpenCV绘制直线

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

img = np.zeros((480, 640, 3), np.uint8)
# 坐标点为(x, y)
cv2.line(img, (0, 0), (300, 400), (0, 255, 0), 1, 4)
cv2.line(img, (100, 0), (400, 600), (255, 0, 0), 5, 16)

cv2.imshow('draw', img)

key = cv2.waitKey(0)
if key & 0xff == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

OpenCV绘制矩形和圆

详情参看官方文档

画矩形

在这里插入图片描述
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

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

# 画线
# 坐标点为(x, y)
# cv2.line(img, (0, 0), (300, 400), (0, 255, 0), 1, 4)
# cv2.line(img, (100, 0), (400, 600), (255, 0, 0), 5, 16)

# 画矩形
# (10, 10)represents the top left corner of rectangle 
# (100, 100) represents the bottom right corner of rectangle 
cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0), 5)

cv2.imshow('draw', img)

key = cv2.waitKey(0)
if key & 0xff == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

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

# 画线
# 坐标点为(x, y)
# cv2.line(img, (0, 0), (300, 400), (0, 255, 0), 1, 4)
# cv2.line(img, (100, 0), (400, 600), (255, 0, 0), 5, 16)

# 画矩形
# (10, 10)represents the top left corner of rectangle 
# (100, 100) represents the bottom right corner of rectangle 
# cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0), 5)
# Thickness of -1 will fill the entire shape 
cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0), -1)

cv2.imshow('draw', img)

key = cv2.waitKey(0)
if key & 0xff == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

画圆

在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

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

# 画线
# 坐标点为(x, y)
# cv2.line(img, (0, 0), (300, 400), (0, 255, 0), 1, 4)
# cv2.line(img, (100, 0), (400, 600), (255, 0, 0), 5, 16)

# 画矩形
# (10, 10)represents the top left corner of rectangle 
# (100, 100) represents the bottom right corner of rectangle 
# cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0), 5)
# Thickness of -1 will fill the entire shape 
# cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0), -1)

# 画圆
cv2.circle(img, (320, 240), 30, (0, 255, 0), -1)

cv2.imshow('draw', img)

key = cv2.waitKey(0)
if key & 0xff == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

OpenCV椭圆的绘制

在这里插入图片描述
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

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

# 画线
# 坐标点为(x, y)
# cv2.line(img, (0, 0), (300, 400), (0, 255, 0), 1, 4)
# cv2.line(img, (100, 0), (400, 600), (255, 0, 0), 5, 16)

# 画矩形
# (10, 10)represents the top left corner of rectangle 
# (100, 100) represents the bottom right corner of rectangle 
# cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0), 5)
# Thickness of -1 will fill the entire shape 
# cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0), -1)

# 画圆
# cv2.circle(img, (320, 240), 30, (0, 255, 0), -1)
cv2.circle(img, (320, 240), 100, (0, 255, 0))
cv2.circle(img, (320, 240), 5, (255, 0, 0), -1)

# 画椭圆
# 长方形的度若为0则是从右侧x正轴开始的,顺时针旋转
cv2.ellipse(img, (320, 240), (100, 50), 0, 0, 360, (0, 255, 0))

cv2.imshow('draw', img)

key = cv2.waitKey(0)
if key & 0xff == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

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

# 画线
# 坐标点为(x, y)
# cv2.line(img, (0, 0), (300, 400), (0, 255, 0), 1, 4)
# cv2.line(img, (100, 0), (400, 600), (255, 0, 0), 5, 16)

# 画矩形
# (10, 10)represents the top left corner of rectangle 
# (100, 100) represents the bottom right corner of rectangle 
# cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0), 5)
# Thickness of -1 will fill the entire shape 
# cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0), -1)

# 画圆
# cv2.circle(img, (320, 240), 30, (0, 255, 0), -1)
cv2.circle(img, (320, 240), 100, (0, 255, 0))
cv2.circle(img, (320, 240), 5, (255, 0, 0), -1)

# 画椭圆
# 长方形的度若为0则是从右侧x正轴开始的,顺时针旋转
cv2.ellipse(img, (320, 240), (100, 50), 90, 45, 90, (0, 255, 0), -1)

cv2.imshow('draw', img)

key = cv2.waitKey(0)
if key & 0xff == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

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

# 画线
# 坐标点为(x, y)
# cv2.line(img, (0, 0), (300, 400), (0, 255, 0), 1, 4)
# cv2.line(img, (100, 0), (400, 600), (255, 0, 0), 5, 16)

# 画矩形
# (10, 10)represents the top left corner of rectangle 
# (100, 100) represents the bottom right corner of rectangle 
# cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0), 5)
# Thickness of -1 will fill the entire shape 
# cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0), -1)

# 画圆
# cv2.circle(img, (320, 240), 30, (0, 255, 0), -1)
cv2.circle(img, (320, 240), 100, (0, 255, 0))
cv2.circle(img, (320, 240), 5, (255, 0, 0), -1)

# 画椭圆
# 长方形的度若为0则是从右侧x正轴开始的,顺时针旋转
cv2.ellipse(img, (320, 240), (100, 50), 15, 0, 360, (0, 255, 0))

cv2.imshow('draw', img)

key = cv2.waitKey(0)
if key & 0xff == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

OpenCV绘制多边形

在这里插入图片描述
点集必须为32位
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

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

# 画线
# 坐标点为(x, y)
# cv2.line(img, (0, 0), (300, 400), (0, 255, 0), 1, 4)
# cv2.line(img, (100, 0), (400, 600), (255, 0, 0), 5, 16)

# 画矩形
# (10, 10)represents the top left corner of rectangle 
# (100, 100) represents the bottom right corner of rectangle 
# cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0), 5)
# Thickness of -1 will fill the entire shape 
# cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0), -1)

# 画圆
# cv2.circle(img, (320, 240), 30, (0, 255, 0), -1)
# cv2.circle(img, (320, 240), 100, (0, 255, 0))
# cv2.circle(img, (320, 240), 5, (255, 0, 0), -1)

# 画椭圆
# 长方形的度若为0则是从右侧x正轴开始的,顺时针旋转
# cv2.ellipse(img, (320, 240), (100, 50), 15, 0, 360, (0, 255, 0))

# 画多边形
pts = np.array([(300, 10), (150, 100), (450, 100)], np.int32)
cv2.polylines(img, [pts], True, (0, 255, 0))

cv2.imshow('draw', img)

key = cv2.waitKey(0)
if key & 0xff == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

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

# 画线
# 坐标点为(x, y)
# cv2.line(img, (0, 0), (300, 400), (0, 255, 0), 1, 4)
# cv2.line(img, (100, 0), (400, 600), (255, 0, 0), 5, 16)

# 画矩形
# (10, 10)represents the top left corner of rectangle 
# (100, 100) represents the bottom right corner of rectangle 
# cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0), 5)
# Thickness of -1 will fill the entire shape 
# cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0), -1)

# 画圆
# cv2.circle(img, (320, 240), 30, (0, 255, 0), -1)
# cv2.circle(img, (320, 240), 100, (0, 255, 0))
# cv2.circle(img, (320, 240), 5, (255, 0, 0), -1)

# 画椭圆
# 长方形的度若为0则是从右侧x正轴开始的,顺时针旋转
# cv2.ellipse(img, (320, 240), (100, 50), 15, 0, 360, (0, 255, 0))

# 画多边形
pts = np.array([(300, 10), (150, 100), (450, 100)], np.int32)
cv2.polylines(img, [pts], True, (0, 255, 0))

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

cv2.imshow('draw', img)

key = cv2.waitKey(0)
if key & 0xff == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

OpenCV绘制文本

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

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

# 画线
# 坐标点为(x, y)
# cv2.line(img, (0, 0), (300, 400), (0, 255, 0), 1, 4)
# cv2.line(img, (100, 0), (400, 600), (255, 0, 0), 5, 16)

# 画矩形
# (10, 10)represents the top left corner of rectangle 
# (100, 100) represents the bottom right corner of rectangle 
# cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0), 5)
# Thickness of -1 will fill the entire shape 
# cv2.rectangle(img, (10, 10), (100, 100), (0, 255, 0), -1)

# 画圆
# cv2.circle(img, (320, 240), 30, (0, 255, 0), -1)
# cv2.circle(img, (320, 240), 100, (0, 255, 0))
# cv2.circle(img, (320, 240), 5, (255, 0, 0), -1)

# 画椭圆
# 长方形的度若为0则是从右侧x正轴开始的,顺时针旋转
# cv2.ellipse(img, (320, 240), (100, 50), 15, 0, 360, (0, 255, 0))

# 画多边形
# pts = np.array([(300, 10), (150, 100), (450, 100)], np.int32)
# cv2.polylines(img, [pts], True, (0, 255, 0))

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

# 绘制文本
cv2.putText(img, "ILoveFS", (10, 400), cv2.FONT_HERSHEY_DUPLEX, 3, (0, 255, 0))

cv2.imshow('draw', img)

key = cv2.waitKey(0)
if key & 0xff == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

实现鼠标绘制基本图形

# -*- coding: utf-8 -*-
import cv2
import numpy as np
 
# 基本功能:
# 可以通过鼠标进行基本图形的绘制
# 1. 可以画线: 当用户按下l键, 即选择了画线。 此时, 滑动鼠标即可画线。
# 2. 可以画矩形: 当用户按下r键, 即可选择画矩形。 此时, 滑动鼠标即可画矩形。
# 3. 可以画圆: 当用户按下c键,即可选择画圆。 此时, 滑动鼠标即可画圆。

# curshape: 0-drawline, 1-drawrectangle, 2-drawcircle

# 显示窗口和背景
img = np.zeros((480, 640, 3), np.uint8)

curshape = 0
startpos = (0, 0)

# 创建窗口
cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)

# 鼠标回调函数
def mouse_callback(event, x, y, flags, userdata):
    global startpos, curshape
    # print(event, x, y, flags, userdata)
    if(event & cv2.EVENT_LBUTTONDOWN == cv2.EVENT_LBUTTONDOWN):
        startpos = (x, y)
    elif(event & cv2.EVENT_LBUTTONUP == cv2.EVENT_LBUTTONUP):
        if curshape == 0:
            cv2.line(img, startpos, (x, y), (0, 255, 0))
        elif curshape == 1:
            cv2.rectangle(img, startpos, (x, y), (0, 255, 0))
        elif curshape == 2:
            a = (x - startpos[0])
            b = (y - startpos[1])
            r = int((a ** 2 + b ** 2) ** 0.5)
            cv2.circle(img, startpos, r, (0, 0, 255))
        else:
            print('error: no shape')
    
# 设置鼠标回调
cv2.setMouseCallback('mouse', mouse_callback, "666")

while True:
    cv2.imshow('mouse', img)
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        break
    elif key == ord('l'):
        curshape = 0
    elif key == ord('r'):
        curshape = 1
    elif key == ord('c'):
        curshape = 2

cv2.destroyAllWindows()

在这里插入图片描述

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

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

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

相关文章

Unity | 运行时显示调试信息

「公众号:游戏开发手记」 1 简介 在 Unity 编辑器中,我们可以通过点击 Stats 按钮来查看 Statistics 面板,这个面板显示了许多关于游戏渲染的信息,如每帧的渲染时间、Tris 和 Verts 的数量、SetPass Calls 的数量等。但在其他运…

Java设计模式-结构型模式-装饰模式

装饰模式 装饰模式角色案例装饰模式与静态代理的区别 装饰模式 允许向一个现有的对象动态地添加新的功能,同时不改变其结构。它是继承的一种替代方案,可以动态地扩展对象。有点像静态代理 角色 装饰者模式有四种角色 抽象被装饰者,被装饰者…

基于单片机的自动循迹小车(论文+源码)

1.系统设计 此次基于单片机的自动循迹小车的设计系统,结合循迹模块来共同完成本次设计,实现小车的循迹功能,其其整体框架如图2.1所示。其中,采用STC89C52单片机来作为核心控制器,负责将各个传感器等模块链接起来&…

23款奔驰GLC260L升级小柏林音响 全新15个扬声器

2023年款奔驰GLC260 GLC300升级小柏林之声 3D音效系统 升级小柏林之声音响之后,全车一共有15个喇叭,1台功放,每一首音乐都能在车内掀起激情的音浪,感受纯粹的音乐享受,低频震撼澎湃,让你的心跳与音乐完美契…

js的数组

js js 的数组数组是什么为什么要使用数组数组的简单使用数组是按照顺序保存的,所以每个数据都有自己的编号数组的取值方法遍历数组数组的元素求和数组的最大值和最小值数组的增删改查操作数组的增加数组的筛选数组的删除 案例: 九九乘法表 数组是什么 数…

内置升压的单声道D类音频功率放大器:HT81293

HT81293是一款内置升压的单声道D类音频功率放大器,由锂电池供电时, THDN10%, 能连续输出18W功率(4Ω负载)。 HT81293A内置可动态调节的升压,可以提供一个适应不同输出功率的电压给D类功放,其可大…

Swagger使用

Swagger使用 1. Swagger UI 按以下步骤配置&#xff0c;项目启动后访问&#xff1a; http://localhost:8080/swagger-ui.html 1.1 添加依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><ve…

2023 年 数维杯(B题)国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2021年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看数维杯&#xff08;B题&#xff09;&#xff01; …

JSP在Scriptlet中编写java代码的形式

我们想在jsp界面中去写java代码&#xff0c;就需要将java代码写在Scriptlet中 虽然说 有这种方式 但是 目前 大部分都会不建议你往jsp中去写java代码 因为 目前都在推广前后端分离 这也是jsp使用面有没有少的原因 jsp也建议解耦 不要让你的程序耦合性太高 还是前端是前端 后端是…

【Ubuntu·系统·的Linux环境变量配置方法最全】

文章目录 概要读取环境变量的方法小技巧 概要 在Linux环境中&#xff0c;配置环境变量是一种常见的操作&#xff0c;用于指定系统或用户环境中可执行程序的搜索路径。 读取环境变量的方法 在Linux中&#xff0c;可以使用以下两个命令来读取环境变量&#xff1a; export 命令…

JVM——运行时数据区(程序计数器+栈)

目录 1.程序计数器2.栈Java虚拟机栈 - 栈帧的组成1.Java虚拟机栈-局部变量表3.Java虚拟机栈-操作数栈3.Java虚拟机栈-帧数据 3.Java虚拟机栈-栈内存溢出4.本地方法栈 ⚫ Java虚拟机在运行Java程序过程中管理的内存区域&#xff0c;称之为运行时数据区。 ⚫ 《Java虚拟机规范》中…

栈和队列的实现及相关面试题

栈和队列 栈概念与结构栈的功能栈的实现头文件Stack.h栈的结构体 Stack 源文件Stack.c初始化 void StackInit(Stack* ps)压栈 void StackPush(Stack* ps, STDataType data)出栈 void StackPop(Stack* ps)返回栈顶的值 STDataType StackTop(Stack* ps)返回栈中元素的个数 int St…

HTML5+CSS3小实例:悬停放大图片的旅游画廊

实例:悬停放大图片的旅游画廊 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&…

2、24 个常见的 Docker 疑难杂症处理技巧(二)

7Docker 容器中文异常 容器存在问题话&#xff0c;记得优先在官网查询 [问题起因] 今天登陆之前部署的 MySQL 数据库查询&#xff0c;发现使用 SQL 语句无法查询中文字段&#xff0c;即使直接输入中文都没有办法显示。 # 查看容器支持的字符集 rootb18f56aa1e15:# locale -a …

局部指令和全局指令的注册和使用

全局指令 先写一个js文件 import store from /store const directivePlugin {install(Vue) {Vue.directive(checkBtn, {inserted(el, binding) {// el: 指令绑定的那个元素对象 dom// binding.value: 指令等于号后面绑定的表达式的值 v-if"xxx"// 拿到el 拿到v…

gbase8a 认证培训课后题(一)

gbase8a 第一阶段练习题 第一次练习&#xff08;4选4&#xff09;1234 第二次练习&#xff08;5选5&#xff09;12345 第三次练习&#xff08;5选3&#xff09;12345 第四次练习&#xff08;6选4&#xff09;123456 第五次练习&#xff08;7选4&#xff09;1234567 第六次练习&…

解决requests库中UnicodeError异常的问题

摘要&#xff1a;本文介绍了使用requests库时可能遇到的UnicodeError异常&#xff0c;并提供了两种解决方法&#xff0c;以确保你的代码能够正常处理URL。 问题背景 在使用requests库时&#xff0c;当尝试获取类似’http://.example.com’这样的URL时&#xff0c;可能会遇到Un…

使用requests库下载文件的技术解析

目录 一、引言 二、使用requests库下载文件的基本流程 三、请求设置和响应处理 1、请求头部设置 2、跟随重定向 3、处理HTTP认证 4、响应状态码检查 5、响应头处理 6、响应体处理 四、异常处理 1、网络连接问题 2、HTTP请求错误 3、文件写入错误 总结 一、引言 …

【PHP】医院麻醉临床信息系统源码

麻醉临床信息系统以服务围术期临床业务工作的开展为核心&#xff0c;为医护人员、业务管理人员、院级领导提供流程化、信息化、自动化、智能化的临床业务综合管理平台。 麻醉信息系统处理的数据包含病人的手术信息、麻醉信息、病人手术过程中从监护仪上采集到的数据和病人情况等…

【第2章 Node.js基础】2.7 Node.js 的流

2.7 Node.js 的流 什么是流 流不是 Node.js 特有的概念。它们是几十年前在 Unix 操作系统中引入的。 我们可以把流看作这些数据的集合&#xff0c;就像液体一样&#xff0c;我们先把这些液体保存在一个容器里&#xff08;流的内部缓冲区 BufferList&#xff09;&#xff0c;…