参考:https://www.cnblogs.com/zlel/p/9267629.html
一、python-OpenCV的简介与安装
opencv 是用于快速处理图像、计算机视觉问题的工具,支持多种语言进行开发,如c++、python、java等。
安装opencv-python: pip install opencv-python
安装完opencv-python后命令行打开python交互式环境:import cv2 成功,便说明成功安装了opencv-python
二、opencv-python读取、展示和存储图像
1、图片的加载、显示和保存
说明:
- cv2.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都将被忽略。它是默认标志
- cv2.IMREAD_GRAYSCALE:以灰度模式加载图像
- cv2.IMREAD_UNCHANGED:保留读取图片原有的颜色通道
1 :等同于cv2.IMREAD_COLOR
0 :等同于cv2.IMREAD_GRAYSCALE
-1 :等同于cv2.IMREAD_UNCHANGED
import cv2
# 读取图片
img = cv2.imread(r'fengjing1.jpg')
print(img)
# 生成灰色图片
img_grey = cv2.imread(r'shanghai1.jpg',0)
print(img_grey)
'''
1、建议像素不要太低,至少以前以上吧,否则质量太差会显示不出来图片
2、生成的图片为numpy数组的形式
'''
# 展示原图
cv2.imshow('scene',img)
# 展示灰度图片
cv2.imshow('img1',img_grey)
cv2.waitKey() # 等待
# 保存灰度图片
cv2.imwrite('img_grey1.jpg',img_grey)
cv2.imwrite('img_grey2.jpg',img)
2、图像显示窗口创建与销毁
当我们使用imshow函数展示图像时,最后需要在程序中对图像展示窗口进行销毁,否则程序将无法正常终止,常用的销毁窗口的函数有下面两个:
(1)cv2.destroyWindow(windows_name) #销毁单个特定窗口
参数: 将要销毁的窗口的名字
(2)cv2.destroyAllWindows() #销毁全部窗口,无参数
- cv2.namedWindow(窗口名,属性) 创建一个窗口属性—指定窗口大小模式:
- cv2.WINDOW_AUTOSIZE:根据图像大小自动创建大小
- cv2.WINDOW_NORMAL:窗口大小可调整
- cv2.destoryAllWindows(窗口名) 删除任何建立的窗口
那我们合适销毁窗口,肯定不能图片窗口一出现我们就将窗口销毁,这样便没法观看窗口,试想有两种方式:
(1) 让窗口停留一段时间然后自动销毁;
(2) 接收指定的命令,如接收指定的键盘敲击然后结束我们想要结束的窗口
以上两种情况都将使用cv2.waitKey函数, 首先产看函数定义:
cv2.waitKey(time_of_milliseconds)
唯一参数 time_of_milliseconds是整数,可正可负也可是零,含义和操作也不同,分别对应上面说的两种情况
(1) time_of_milliseconds > 0 :此时time_of_milliseconds表示时间,单位是毫秒,含义表示等待 time_of_milliseconds毫秒后图像将自动销毁
#表示等待1秒后,将销毁所有图像
if cv2.waitKey(1000):
cv2.destroyAllWindows()
#表示等待1秒,将销毁窗口名称为’fengjing1’的图像窗口
if cv2.waitKey(1000):
cv2.destroyWindow(‘fengjing1’)
(2) time_of_milliseconds <= 0 : 此时图像窗口将等待一个键盘敲击,接收到指定的键盘敲击便会进行窗口销毁。我们可以自定义等待敲击的键盘,通过下面的例子进行更好的解释
#当接收到键盘敲击A时,便销毁名称为’origin image’的图像窗口
if cv2.waitKey(-1) == ord(‘A’):
cv2.destroyWindow(‘origin image’)
img = cv2.imread('fengjing1.jpg')
cv2.namedWindow('tu_1',cv2.WINDOW_NORMAL)
cv2.imshow('fnegjing_1',img)
# if cv2.waitKey(5000):
# cv2.destroyAllWindows()
if cv2.waitKey(-1) == ord('A'):
cv2.destroyAllWindows()
3、图片宽、高、通道数获取
'''
img.shape 返回图像高(图像矩阵的行数)、宽(图像矩阵的列数)和通道数3个属性组成的元组,若图像是非彩色图,则只返回高和宽组成的元组。
'''
img = cv2.imread('fengjing1.jpg')
imgGrey = cv2.imread('fengjing1.jpg',0)
sp1 = img.shape
sp2 = imgGrey.shape # 注意不用加括号了
# 返回高和宽以及通道数
print(sp1,sp2) # (1200, 1920, 3) (1200, 1920)
4、图像像素数目和图像数据类型的获取
# 图像矩阵img的size属性和dtype分别对应图像的像素总数目和图像数据类型。一般情况下,图像的数据类型是uint8。
imgSize = img.size
print(imgSize) # 6912000
ty = img.dtype
print(ty) # uint8
5、生成指定大小的空图像
import cv2
import numpy as np
img = cv2.imread('fengjing1.jpg')
imgZero = np.zeros(img.shape,np.uint8)
# print(imgZero) # 三重0的列表
imgFix = np.zeros((300,500,3),np.uint8)
cv2.imshow('img',img)
cv2.imshow('imgZero',imgZero)
cv2.imshow('imgFix',imgFix)
cv2.waitKey()
生成的三个图像窗口中,只有img是有图像的,其余两个都是只要空图像
6、访问和操作图像像素
'''
OpenCV中图像矩阵的顺序是B、G、R。可以直接通过坐标位置访问和操作图像像素。
'''
import cv2
img = cv2.imread('fengjing1.jpg')
numb = img[50,100] # 访问像素
# print(numb) # [208 197 200]
img[50,100] = (0,0,255) # 操作图像像素
cv2.imshow('img',img)
cv2.waitKey()
# 分开访问图像某一通道像素值也很方便
img = cv2.imread('fengjing1.jpg')
# # 选定某一范围改变像素值
# img[0:100,100:200,0] = 255
# img[100:200,200:300,1] = 255
# img[200:300,300:400,2] = 255
# 更改某一矩形的像素值
img[0:50,1:100] = (43,244,255)
cv2.imshow('img',img)
cv2.waitKey()
7、图像三通道分离和合并
'''
分离图像通道可以使用cv2中的split函数,合并使用merge函数。
'''
import cv2
img = cv2.imread('fengjing1.jpg')
b,g,r = cv2.split(img)
# print(b,g,r)
cv2.imshow('blue',b)
cv2.imshow('green',g)
cv2.imshow('red',r)
merged = cv2.merge([b,g,r])
# print(merged)
cv2.imshow('Merged',merged)
cv2.waitKey()
8、在图像上输出文字
img: 图像
text:要输出的文本
org: 文字的起点坐标
fontFace: 字体
fontScale: 字体大小
color: 字体颜色
thickness: 字图加粗
'''
使用putText函数在图片上输出文字,函数原型:
putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)
'''
img = cv2.imread('fengjing1.jpg')
cv2.putText(img,'very beautiful this scene',(100,100),cv2.FONT_HERSHEY_COMPLEX,3,(0,0,255))
cv2.imshow('img',img)
cv2.waitKey()
9、图像缩放
'''
缩放使用cv2.resize()函数,resize函数里的size第一个是宽(列),第二个是高(行)。
'''
img = cv2.imread('fengjing1.jpg')
cv2.imshow('img',img)
imgg = cv2.resize(img,(200,100))
cv2.imshow('imgg',imgg)
cv2.waitKey()
10、图片灰化处理
from matplotlib import pyplot as plt
import cv2
from pylab import *
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"C:\Windows\Fonts\COOPBL.TTF",size = 14)
# 载入图像
im = cv2.imread('fengjing1.jpg')
# 显示原始图像
fig = plt.figure()
# print(fig) # Figure(640x480)
subplot(121)
plt.gray()
im2 = cv2.cvtColor(im, cv2.COLOR_BGR2RGB) #OpenCV采用BGR排列顺序,需要转换一下.
# print(imshow(img2)) # AxesImage(80,52.8;225.455x369.6)
imshow(im2)
title(u'caise_figure', fontproperties= font)
axis('off')
# 显示灰度化图像
# 颜色空间转换
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
plt.subplot(122)
plt.gray()
imshow(gray)
title(u'huidu_figure', fontproperties= font)
axis('off')
show()
11、在python3 下使用OpenCV抓取摄像头图像提取蓝色
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
for i in range(0, 19):
print(cap.get(i))
while 1:
ret, frame = cap.read()
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_blue = np.array([100, 47, 47])
upper_blue = np.array([124, 255,255])
mask = cv2.inRange(hsv, lower_blue, upper_blue) #蓝色掩模
res = cv2.bitwise_and(frame, frame, mask = mask)
cv2.imshow(u"Capture", frame)
cv2.imshow(u"mask", mask)
cv2.imshow(u"res", res)
key = cv2.waitKey(1)
if key & 0xff == ord('q') or key == 27:
print(frame.shape,ret)
break
cap.release()
cv2.destroyAllWindows()