文章目录
  1. 1. 图像读取、显示及保存
  2. 2. Matplotlib绘图库
  3. 3. OpenCV中的绘图函数
    1. 3.1. 1.画线
    2. 3.2. 1.画矩形
    3. 3.3. 1.画圆
    4. 3.4. 1.画椭圆
  4. 4. 鼠标画笔
    1. 4.1. 1.双击左键画圆
    2. 4.2. 1.根据选择的模式画不同图形
    3. 4.3. 1.用滑动条做调色板
    4. 4.4. 1.创建一个画板

图像读取、显示及保存

使用工具Python3.6
库numpy;opencv
注意点:

  • 读取的文件名不能是汉字,否则无法读出
  • 指定文件位置时,应用‘\\’,而不是‘\’
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# -*- coding: utf-8 -*-

import numpy as np
import cv2

img = cv2.imread('C:\\Users\\Administrator\\Desktop\\softskillsillo.jpg',0) # 读入图像,0表示灰度

cv2.namedWindow('image',cv2.WINDOW_NORMAL) # 创建窗口
cv2.imshow('image',img) #显示图像,如果前面没有cv2.namedWindow,就自动先执行一个cv2.namedWindow。
k = cv2.waitKey(0)
if k == 27: # 如果按下ESC键则关闭窗口
cv2.destroyAllWindows()
elif k == ord('s'): # 如果按下s键就保存此灰度图,并退出(关闭窗口)
cv2.imwrite('111.png',img)
exit
cv2.destroyAllWindows()

关于cv2.namedWindow(‘窗口标题’,默认参数)
默认参数:cv2.WINDOW_AUTOSIZE+cv2.WINDOW_KEEPRATIO+cv2.WINDOW_GUI_EXPANDED)

  • 参数:
  • cv2.WINDOW_NORMAL 窗口大小可改变
  • cv2.WINDOW_AUTOSIZE 窗口大小不可改变
  • cv2.WINDOW_FREERATIO 自适应比例
  • cv2.WINDOW_KEEPRATIO 保持比例
  • cv2.WINDOW_GUI_NORMAL
  • cv2.WINDOW_GUI_EXPANDED

Matplotlib绘图库

matplotlib是python中强大的画图模块,按官网上的图例,基本能做出各种各样美观的图表,但python缺省并不带这个模块,需要自己安装。

  1. 首先进行pip安装,进入到CMD窗口下,执行python -m pip install -U pip setuptools进行升级。
  2. 接着键入python -m pip install matplotlib进行自动的安装,系统会自动下载安装包。
  3. 安装完成后,可以用python -m pip list查看本机的安装的所有模块,确保matplotlib已经安装成功。

以下代码可显示图像:

1
2
3
4
5
6
7
8
import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('C:\\Users\\Administrator\\Desktop\\softskillsillo.jpg',0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([])
plt.show()

OpenCV中的绘图函数

1.画线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*- coding: utf-8 -*-

import numpy as np
import cv2

img = np.zeros((512,512,3), np.uint8)
# np.zeros()有两个参数,一个是创建的图片矩阵大小,另一个是数据类型
# 512,512是指图片占像素为512x512,3则是指BGR三种颜色
# uint8就是每种颜色都是0到255

cv2.line(img, (0,0), (260,260), (255,0,0),5)
# cv2.line有五个参数,图片名称、起点坐标、终点坐标、颜色、线宽(不写默认为1)

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.resizeWindow('image', 512, 512)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

1.画矩形

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# -*- coding: utf-8 -*-

import numpy as np
import cv2

img = np.zeros((512,512,3), np.uint8)

cv2.rectangle(img, (25,25), (50,50), (0,255,0),3)
# cv2.rectangle(矩形)有五个参数,图片名称、左上角顶点坐标、右下角顶点坐标、颜色、线宽(不写默认为1)

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.resizeWindow('image', 512, 512)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

1.画圆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -*- coding: utf-8 -*-

import numpy as np
import cv2

img = np.zeros((512,512,3), np.uint8)

cv2.rectangle(img, (25,25), (75,75), (0,255,0), 3)

cv2.circle(img, (50,50), 25, (0,0,255), -1)
# cv2.cicle有五个参数,图片名称、圆心坐标、半径、颜色、线宽(不写默认为1,-1为向内填充)

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.resizeWindow('image', 512, 512)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

1.画椭圆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -*- coding: utf-8 -*-

import numpy as np
import cv2

img = np.zeros((512,512,3), np.uint8)

cv2.ellipse(img, (100,100), (50,25), 0, 45,180, (255,0,0), -1)
# cv2.ellipse有八个参数:
# 图片名称、中心坐标、长轴短轴、旋转角度、显示部分、颜色、线宽(不写默认为1,-1为向内填充)
# 显示部分为顺时针显示,0,360为全显。

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.resizeWindow('image', 512, 512)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

鼠标画笔

函数:cv2.setMouseCallback()

1.双击左键画圆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# -*- coding: utf-8 -*-

import numpy as np
import cv2

def draw_circle(event, x, y, flags, param): # 定义画圆事件
if event == cv2.EVENT_LBUTTONDBLCLK: # 若双击左键事件发生,则以双击的点画圆
cv2.circle(img, (x, y), 100, (255, 0, 0), -1)

img = np.zeros((500, 500, 3), np.uint8)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.resizeWindow('image', 512, 512)
cv2.setMouseCallback('image', draw_circle)

while (1):
cv2.imshow('image', img)
if cv2.waitKey(1)&0xFF == ord('q'):
break
cv2.destroyAllWindows()

1.根据选择的模式画不同图形

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# -*- coding: utf-8 -*-

"""
Created on 2018/5/9
@author: Maf
"""

import numpy as np
import cv2

# 当鼠标按下时变为 True
drawing = False

# 如果 mode 为 true 绘制矩形。按下‘m’变成绘制曲线。
mode = True
ix, iy = -1, -1

# 创建回调函数
def draw_circle(event, x, y, flags, param):
global ix, iy, drawing, mode
if event == cv2.EVENT_LBUTTONDOWN: # 当按下左键时返回起始位置坐标
drawing = True
ix, iy = x, y

# 当鼠标左键按下并移动时绘制图形。 event查看移动,flag查看是否按下
elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
if drawing == True:
if mode == True:
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
# 绘制圆圈,小圆点连在一起就成了线,3 代表了笔画的粗细
cv2.circle(img,(x,y),3,(0,0,255),-1)
# 下面注释掉的代码是起始点为圆心,起点到终点为半径的
# r=int(np.sqrt((x-ix)**2+(y-iy)**2))
# cv2.circle(img,(x,y),r,(0,0,255),-1)
# 当鼠标松开停止绘画。
elif event == cv2.EVENT_LBUTTONUP:
drawing == False

# 回调函数与窗口连接
img = np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
k = cv2.waitKey(1)&0xFF
if k == ord('m'):
mode = not mode
elif k == 27: # esc按下退出
break
cv2.destroyAllWindows()

1.用滑动条做调色板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# -*- coding: utf-8 -*-

"""
Created on 2018/5/9
@author: Maf
"""

import numpy as np
import cv2

def nothing(x):
pass
# 创建一副黑色图像
img=np.zeros((300,512,3),np.uint8)
cv2.namedWindow('image')

cv2.createTrackbar('R','image',0,255,nothing)
cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('B','image',0,255,nothing)

switch = '0:OFF\n1:ON'
cv2.createTrackbar(switch,'image',0,1,nothing)

while(1):
cv2.imshow('image',img)
k = cv2.waitKey(1)&0xFF
if k==27:
break
r=cv2.getTrackbarPos('R','image')
g=cv2.getTrackbarPos('G','image')
b=cv2.getTrackbarPos('B','image')
s=cv2.getTrackbarPos(switch,'image')
if s == 0:
img[:] = 0
else:
img[:] = [b,g,r]

cv2.destroyAllWindows()

1.创建一个画板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# -*- coding: utf-8 -*-

"""
Created on 2018/5/9
@author: Maf
"""

import cv2
import numpy as np

def nothing(x):
pass

# 当鼠标按下时变为True
drawing=False

# 如果mode 为true 绘制矩形。按下'm' 变成绘制曲线。
mode=True
ix,iy=-1,-1

# 创建回调函数
def draw_circle(event,x,y,flags,param):
r=cv2.getTrackbarPos('R','image')
g=cv2.getTrackbarPos('G','image')
b=cv2.getTrackbarPos('B','image')
color=(b,g,r)

global ix,iy,drawing,mode

# 当按下左键是返回起始位置坐标
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y

# 当鼠标左键按下并移动时绘制图形。event 可以查看移动,flag 查看是否按下
elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
if drawing == True:
if mode == True:
cv2.rectangle(img,(ix,iy),(x,y),color,-1)
else:
# 绘制圆圈,小圆点连在一起就成了线,3 代表了笔画的粗细
cv2.circle(img,(x,y),3,color,-1)

# 下面注释掉的代码是起始点为圆心,起点到终点为半径的
# r=int(np.sqrt((x-ix)**2+(y-iy)**2))
# cv2.circle(img,(x,y),r,(0,0,255),-1)
# 当鼠标松开停止绘画。
elif event == cv2.EVENT_LBUTTONUP:
drawing == False
# if mode==True:
# cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
# else:
# cv2.circle(img,(x,y),5,(0,0,255),-1)

img = np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.createTrackbar('R','image',0,255,nothing)
cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('B','image',0,255,nothing)
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)

k=cv2.waitKey(1)&0xFF
if k==ord('m'):
mode=not mode
elif k==27:
break
cv2.destroyAllWindows()
文章目录
  1. 1. 图像读取、显示及保存
  2. 2. Matplotlib绘图库
  3. 3. OpenCV中的绘图函数
    1. 3.1. 1.画线
    2. 3.2. 1.画矩形
    3. 3.3. 1.画圆
    4. 3.4. 1.画椭圆
  4. 4. 鼠标画笔
    1. 4.1. 1.双击左键画圆
    2. 4.2. 1.根据选择的模式画不同图形
    3. 4.3. 1.用滑动条做调色板
    4. 4.4. 1.创建一个画板