python学opencv|读取图像(十八)使用cv2.line创造线段

devtools/2024/12/23 22:56:06/

【1】引言

前序已经完成了opencv基础知识的学习,我们已经掌握了处理视频和图像的基本操作。相关文章包括且不限于:

python学opencv|读取图像(三)放大和缩小图像_python(1)使用opencv读取并显示图像;(2)使用opencv对图像进行缩放;(3)使用o-CSDN博客

python学opencv|读取视频(一)灰度视频制作和保存_python opencv读取视频-CSDN博客 

python学opencv|读取视频(二)制作gif_python opencv 动态照片-CSDN博客 

在此基础上,我们尝试使用opencv创造自己的图像,从最简单的画线段开始。

【2】官网教程

点击下方链接,直达官网教程:

OpenCV: Drawing Functions

 在官网教程页面,我们会看到如下介绍:

图 1

由图1可见,cv2.line()函数的功能是:画线段连接两个点。

然后解释这个函数就非常顺理成章:

void cv::line    (    InputOutputArray    img,   #这是要被画线段的图像,需要提前准备
Point    pt1, #这是线段的第一个点
Point    pt2, #这是线段的第二个点
const Scalar &    color, #这是线段的颜色属性
int    thickness = 1, #这是线段的粗细属性
int    lineType = LINE_8, #这是线段的存储类型
int    shift = 0 ) #点坐标的小数位数,暂无需关注

【3】代码测试

从这里,我们开始测试代码。

首先是要引入必要的模块:

python">import numpy as np #引入numpy模块
import cv2 as cv #引入cv模块

然后就要先准备一块画布,这块画布就是之后画线段的基础:

python">canvas=np.zeros((580,580,3),np.uint8) #绘制一个580*580大小的画布,3代表有3个通道,unit8为图像存储格式

然后准备几根线段:

python">canvas=cv.line(canvas,(50,50),(550,50),(155,120,60),5) #线段
canvas=cv.line(canvas,(50,300),(550,300),(55,190,30),10) #线段
canvas=cv.line(canvas,(50,550),(550,550),(58,50,150),15) #线段
canvas=cv.line(canvas,(300,50),(300,550),(120,150,25),20) #线段

之后把图像展示出来:

python">cv.imshow('lines',canvas) #在屏幕展示你画线段的效果
cv.waitKey() #图像不会自动关闭
cv.destroyAllWindows() #释放所有窗口

程序运行后的图像为:

图 2

此时的完整代码为:

python">import numpy as np #引入numpy模块
import cv2 as cv #引入cv模块canvas=np.zeros((580,580,3),np.uint8) #绘制一个580*580大小的画布,3代表有3个通道,unit8为图像存储格式
canvas=cv.line(canvas,(50,50),(550,50),(155,120,60),5) #线段
canvas=cv.line(canvas,(50,300),(550,300),(55,190,30),10) #线段
canvas=cv.line(canvas,(50,550),(550,550),(58,50,150),15) #线段
canvas=cv.line(canvas,(300,50),(300,550),(120,150,25),20) #线段cv.imshow('lines',canvas) #在屏幕展示你画线段的效果
cv.imwrite('line.png',canvas) #保存图像
cv.waitKey() #图像不会自动关闭
cv.destroyAllWindows() #释放所有窗口

 在这里使用了四次cv2.line()函数,绘制了四条线段,线段的颜色和粗细是随机分配的:

canvas=cv.line(canvas,(50,50),(550,50),(155,120,60),5) #以(50,50)和(550,50)为端点的线段
canvas=cv.line(canvas,(50,300),(550,300),(55,190,30),10) #以(50,300)和(550,300)为端点的线段
canvas=cv.line(canvas,(50,550),(550,550),(58,50,150),15) #以(50,550)和(550,550)为端点的线段
canvas=cv.line(canvas,(300,50),(300,550),(120,150,25),20) #以(300,50)和(300,550)为端点的线段

【4】画布颜色设置

在前述学习过程中,我们曾经掌握灰度图的创造:

python学opencv|读取图像(九)用numpy创建黑白相间灰度图_numpy 创建一张灰度图-CSDN博客

从这里,我们把全1矩阵对应的部分数据改为非0,就实现了黑白灰的过度。

但我们在绘制初始画布的时候,使用了全0矩阵,所以这里稍微改一改,给不同的区域赋不同值,就会有不同颜色的画布:

python">for i in range(80,500,10):for j in range(80,500,20):canvas[i:i+15,j:j+15]=(i+j)/2 #设置动态像素

这里是在横纵像素坐标80到500的区域,按照[i:i+15,j:j+15]的范围均取值(i+j)/2的形式,改变画布的颜色。

此时获得的图像为:

图 3

【5】总结

掌握了使用python+opencv+cv2.line()函数绘制线段的操作技巧。


http://www.ppmy.cn/devtools/144822.html

相关文章

Git进阶:本地或远程仓库如何回滚到之前的某个commit

在Git的使用过程中,我们经常会遇到需要回滚到之前某个commit的情况。无论是为了修复错误、撤销更改,还是为了重新组织代码,回滚到特定commit都是一个非常有用的技能。本文将介绍几种常用的回滚方法,帮助读者更好地掌握Git版本控制…

libilibi项目总结(18)FFmpeg 的使用

FFmpeg工具类 import com.easylive.entity.config.AppConfig; import com.easylive.entity.constants.Constants; import org.springframework.stereotype.Component;import javax.annotation.Resource; import java.io.File; import java.math.BigDecimal;Component public c…

梯度(Gradient)和 雅各比矩阵(Jacobian Matrix)的区别和联系:中英双语

雅各比矩阵与梯度:区别与联系 在数学与机器学习中,梯度(Gradient) 和 雅各比矩阵(Jacobian Matrix) 是两个核心概念。虽然它们都描述了函数的变化率,但应用场景和具体形式有所不同。本文将通过…

【Spring】探秘 SpringBoot 配置文件:解锁验证码背后的实现逻辑

前言 🌟🌟本期讲解关于Spring IOC&DI的详细介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么…

数据结构---------二叉树前序遍历中序遍历后序遍历

以下是用C语言实现二叉树的前序遍历、中序遍历和后序遍历的代码示例&#xff0c;包括递归和非递归&#xff08;借助栈实现&#xff09;两种方式&#xff1a; 1. 二叉树节点结构体定义 #include <stdio.h> #include <stdlib.h>// 二叉树节点结构体 typedef struct…

使用Redis实现限流

使用Redis实现限流的三种方式 目录 概述基于计数器的固定窗口限流 实现原理适用场景实现步骤代码实现缺点 基于滑动窗口的限流 实现原理适用场景实现步骤代码实现优点缺点 基于令牌桶算法的限流 实现原理适用场景实现步骤Lua脚本实现Java实现优点缺点 总结 概述 在分布式系统…

45.跳跃游戏Ⅱ python

跳跃游戏Ⅱ 题目题目描述示例 1:示例 2:提示: 题解解决方案&#xff1a;贪心算法提交结果 题目 题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&…

黑客如何找到App中的源IP:原理与防范

在移动互联网时代&#xff0c;应用程序&#xff08;App&#xff09;已经成为人们生活中不可或缺的一部分。然而&#xff0c;随着App的广泛应用&#xff0c;安全问题也日益受到关注。其中&#xff0c;源IP泄露是一个潜在的安全风险&#xff0c;可能导致服务器遭受攻击、敏感信息…