【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()函数绘制线段的操作技巧。