Practical Python and OpenCV,3rd Edition 03

代码

import numpy as np 
import cv2
canvas = np.zeros((300,300,3),dtype="uint8")

解释:

前两个是导入python库,接着就构造一个Numpy数组,使用.zeros方法初始化一个300 rows 和 300 columns的矩阵(也就是说画布的大小为300x300=90000个像素大小),同时还分配了3个channels,one for Red,Green,and Blue,respectively。同时需要注意的是数据类型,dtype。由于我们将图像表示为像素在[0,255]范围内的RGB图像,因此我们使用8位无符号整数或uint8。

green = (0,255,0)
cv2.line(canvas,(0,0),(300,300),green)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
red = (0,0,255)
cv2.line(canvas,(300,0),(0,300),red,3)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

解释:

前面我们初始化了我们的画布,接下来我们开始画直线,首先我们定义了一个元组(tuple)来定义画笔的颜色,这里是绿色,然后我们调用.line方法,该方法的第一个参数是我们绘制的画布,第二个参数是该line的起点,我们设置开始点为(0,0),我们还需要为该line提供一个结束点(第三个参数)。我们将结束点设置为(300,300),最后一个参数是我们画笔的颜色,我们设置为绿色。接着将我们的图像显示出来,并且wait for a keypress.

第二段代码的.line方法的最后一个参数3就是我们画笔的thickness了,也就是画笔的厚度了。

显示效果为:

Practical Python and OpenCV,3rd Edition 03

cv2.rectangle(canvas,(10,10),(60,60),green)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
cv2.rectangle(canvas,(50,200),(200,225),red,5)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
blue = (255,0,0)
cv2.rectangle(canvas,(200,50),(225,125),blue,-1)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

解释:

第一段代码我们使用了.rectangle方法,该方法的第一个参数是我们要画的画布,第二个参数是我们的rectangle的starting(x,y)位置,这里我们设置我们rectangle的开始point为(10,10),然后我们还得设置我们矩形的结束点为(60,60),这个时候我们定义了一个(60-10,60-10)=(50,50)大小的像素区域。最后一个就是我们矩形的颜色了。第二段代码的第一行的最后一个参数是画笔的厚度,第三段代码的最后一个参数表示绘制一个solid(实心)的矩形。

显示效果为:

Practical Python and OpenCV,3rd Edition 03

canvas = np.zeros((300,300,3),dtype="uint8")
(centerX,centerY) = (canvas.shape[1] // 2 , canvas.shape[0] // 2)
white = (255,255,255)
for r in range(0,175,25):
cv2.circle(canvas,(centerX,centerY),r,white)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

解释:

我们首先初始化我们的画布,然后我们计算两个变量:centerX和centerY。这两个变量代表图像中心的(x,y)的坐标。我们首先获取图像的宽度(也就是列),通过.shape[1]获取,然后获取图像的高度(也就是行),通过.shape[0]获取,最后用//(取C语言的除法,不保留小数)除以2获取中心位置。获取了圆心的位置,接下来,用一个for循环,starting from 0 and ending at 150,每一次增加25的半径来画圆。.circle方法的第一个参数是我们的画布,然后我们将圆心坐标传给第二个参数,第三个参数是我们的半径大小r,最后一个是我们的圆的颜色。

显示效果为:

Practical Python and OpenCV,3rd Edition 03

for i in range(0,25):
radius = np.random.randint(5, high = 200)
color = np.random.randint(0, high = 256 , size = (3,)).tolist()
pt = np.random.randint(0, high = 300, size=(2,))
cv2.circle(canvas,tuple(pt),radius,color,-1)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

解释:

接下来我们画25个圆,用一个for循环来实现。首先是半径,我们使用Numpy的.random.randint方法生成[5,200)范围内的半径值,接着用该方法生成RGB颜色,范围是[0,255],为了得到三个随机的整数,而不是一个整数,我们传递关键字参数size=(3,),数字3表示有3个数据,这样我们就获取了由3个值为[0,255]的随机数组成的元组来表示我们的RGB颜色了。接着哦我们需要一个圆心的point,我们也设置pt为[0,300)的值,但是圆心只需要两个数字,即(x,y)即可,因此,size=(2,)。最后我们调用.circle方法来画我们的圆。

显示效果为:

Practical Python and OpenCV,3rd Edition 03

运行程序

Practical Python and OpenCV,3rd Edition 03

点击图片部分,按键盘任意键结束脚本。

完整的代码

import numpy as np 
import cv2
canvas = np.zeros((300,300,3),dtype="uint8")
green = (0,255,0)
cv2.line(canvas,(0,0),(300,300),green)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
red = (0,0,255)
cv2.line(canvas,(300,0),(0,300),red,3)

cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
cv2.rectangle(canvas,(10,10),(60,60),green)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
cv2.rectangle(canvas,(50,200),(200,225),red,5)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
blue = (255,0,0)
cv2.rectangle(canvas,(200,50),(225,125),blue,-1)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
canvas = np.zeros((300,300,3),dtype="uint8")
(centerX,centerY) = (canvas.shape[1] // 2 , canvas.shape[0] // 2)
white = (255,255,255)
for r in range(0,175,25):
cv2.circle(canvas,(centerX,centerY),r,white)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
for i in range(0,25):
radius = np.random.randint(5, high = 200)
color = np.random.randint(0, high = 256 , size = (3,)).tolist()
pt = np.random.randint(0, high = 300, size=(2,))
cv2.circle(canvas,tuple(pt),radius,color,-1)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

用到的函数

cv2.line

cv2.rectangle

cv2.circle

更多的参考:

https://ppao.pyimagesearch.com/lessons/ppao-chapter-5-drawing/

小测验:

请实现下图效果,尽可能用少的代码。

Practical Python and OpenCV,3rd Edition 03

答案下载地址(参考我的博客):https://0leo0.github.io/2018/OpenCV_python3_03.html


分享到:


相關文章: