Python-OpenCV——基本操作详解
OpenCV是⼀个基于BSD许可(开源)发⾏的跨平台计算机视觉库,可以运⾏在Linux、Windows、MacOS操作系统上。它轻量级⽽且⾼效——由⼀系列 C 函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语⾔的接⼝,实现了图像处理和计算机视觉⽅⾯的很多通⽤算法。
简⾔之,通过openCV可实现计算机图像、视频编辑。⼴泛应⽤于图像识别、运动跟踪、机器视觉等领域。(OpenCV-Python就是⽤Python包装了C++的实现,背后实际就是C++的代码在跑,所以代码的运⾏速度跟原⽣C/C++速度⼀样快,⽽且更加容易编写。)
基础操作函数
cv2.imread()——读取图像
函数格式cv2.imread(img,flag)
flag取值可以为
cv2.IMREAD_COLOR 默认、彩⾊照⽚  1
cv2.IMREAD_GRAYSCALE 灰度照⽚  0
cv2.IMREAD_UNCHANGED 加载原图通道    -1
也可以通过1、 0、-1 指定上述三个模式
1import cv2
2
3# 灰度模式打开图⽚
4 img = cv2.imread('messi5.jpg',0)
cv2.imshow()——显⽰图⽚
1 cv2.imshow('image',img)  #第⼀个为显⽰的图⽚名字,第⼆个为图⽚
2 cv2.waitKey(0)  #不停刷新图⽚,直到你按下任意按键退出
3 cv2.destroyAllWindows()  #关闭所有显⽰框,若只关闭⼀个,可 cv2.destroyWindow()单独指定
cv2.imwrite()——保存图⽚
cv2.imwrite('messigray.png',img) #第⼀个参数为⽂件名,第⼆个为要保存的图像。
cv2.VideoCapture()——捕捉视频图像
1import numpy as np
2import cv2
3
4#创建⼀个VideoCapture项⽬,0代表选择第⼀个设备
5 cap = cv2.VideoCapture(0)
6
7while(True):
8# 捕捉每⼀帧图像,返回两个参数ret为是否返回图⽚(True or False),frame为返回的图⽚
9    ret, frame = ad()
10
11# 通过cv2.cvtColor转换颜⾊格式为灰度模式
12    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
13
14# 播放每⼀帧图像
15    cv2.imshow('frame',gray)
16if cv2.waitKey(1) & 0xFF == ord('q'):
17break
18
19# 最后要记得释放capture
lease()
21 cv2.destroyAllWindows()
还可以通过更改设备号为⽂件名来播放视频(此处播放⽆声⾳),并且通过cv2.WaitKey()来控制播放速度,可以制作慢动作视频等等import numpy as np
import cv2
cap = cv2.VideoCapture('vtest.avi')
while(cap.isOpened()):
ret, frame = ad()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
cv2.VideoWriter()——保存视频
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
#fourcc是⼀种编码格式,我们保存视频时要指定⽂件名、编码格式、FPS、输出尺⼨、颜⾊模式
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))  #输出⽂件名、FourCC、帧率、⼤⼩
while(cap.isOpened()):
ret, frame = ad()
if ret==True:
#cv2.flip(img,flag)  翻转图像(1⽔平翻转、0垂直翻转、-1⽔平垂直翻转)
frame = cv2.flip(frame,0)
# 写⼊视频帧
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cv2.destroyAllWindows()
此外还有不常⽤的:
cv2.line(), cv2.circle() , angle(), cv2.ellipse(), cv2.putText()
cv2.setMouseCallback()——⿏标绘图
import cv2
import numpy as np
#初始化
drawing = False #为真时开始画图
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
#⿏标移动时
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
else:
cv2.circle(img,(x,y),5,(0,0,255),-1)
#⿏标抬起时
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if mode == True:
else:
cv2.circle(img,(x,y),5,(0,0,255),-1)
#初始化图像
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
#按下"m"来切换模式
while(1):
cv2.imshow('image',img)
k = cv2.waitKey(1) & 0xFF
if k == ord('m'):
mode = not mode
elif k == 27:
break
cv2.destroyAllWindows()
array.item()、array.itemset()——查看并修改单⼀像素值
import cv2
import numpy as np
img = cv2.imread('messi5.jpg')
# 指定像素点
px = img[100,100]
print(px)
#[157 166 200]
# 获取蓝⾊像素值
blue = img[100,100,0]
print(blue)
#157
img.shape img.size img.dtype —— 查看图⽚尺⼨、⼤⼩、数据类型>>> print img.shape
(342, 548, 3)
>>> print img.size
562248
>>> print img.dtype
uint8
cv2. —— 分离、合并通道(注意:有损分离)
>>> b,g,r = cv2.split(img)
>>> img = ((b,g,r))
#或者
>>> b = img[:,:,0]
#也可以通过这种形式快速指定红⾊通道像素值为0
>>> img[:,:,2] = 0
可以指定下列参数
src - 你的图⽚
top, bottom, left, right - 上下左右边框宽度
borderType - 边框类型(下⾯详细展⽰,不做具体讲解)
cv2.BORDER_CONSTANT
cv2.BORDER_REFLECT
cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT
cv2.BORDER_REPLICATE
cv2.BORDER_WRAP
value - 当类型为cv2.BORDER_CONSTANT时需要额外指定的值
1import cv2
2import numpy as np
3from matplotlib import pyplot as plt
4
5 BLUE = [255,0,0]
6
7 img1 = cv2.imread('opencv_logo.png')
8
9 replicate = pyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
10 reflect = pyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
11 reflect101 = pyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
12 wrap = pyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
13 constant= pyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)
14
15 plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
16 plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
17 plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
18 plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
19 plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
20 plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
21
22 plt.show()
cv2.inRange —— ⽤来追踪物体
是⼀个常⽤于颜⾊识别的模型,相⽐BGR更易区分颜⾊,转换模式⽤COLOR_BGR2HSV表⽰。
经验之谈:OpenCV中⾊调H范围为[0,179],饱和度S是[0,255],明度V是[0,255]。虽然H的理论数值是0°~360°,但8位图像像素点的最⼤值是255,所以OpenCV中除以了2,某些软件可能使⽤不同的尺度表⽰,所以同其他软件混⽤时,记得归⼀化现在,我们实现⼀个使⽤HSV来只显⽰视频中蓝⾊物体的例⼦,步骤如下:
1、捕获视频中的⼀帧
2、从BGR转换到HSV
3、提取蓝⾊范围的物体
4、只显⽰蓝⾊物体
1 capture = cv2.VideoCapture(0)
2# 蓝⾊的范围,不同光照条件下不⼀样,可灵活调整
3 lower_blue = np.array([100, 110, 110])
4 upper_blue = np.array([130, 255, 255])
5while(True):
6# 1.捕获视频中的⼀帧
7    ret, frame = ad()
8# 2.从BGR转换到HSV
9    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
10# 3.inRange():介于lower/upper之间的为⽩⾊,其余⿊⾊
11    mask = cv2.inRange(hsv, lower_blue, upper_blue)
12# 4.只保留原图中的蓝⾊部分
13    res = cv2.bitwise_and(frame, frame, mask=mask)
14    cv2.imshow('frame', frame)
15    cv2.imshow('mask', mask)
16    cv2.imshow('res', res)
17if cv2.waitKey(1) == ord('q'):
18break
19
20作者:IConquer
21链接:www.jianshu/p/885f7992b8fc
22來源:简书
23简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
1import numpy as np
2import cv2
3
4 cv2.namedWindow('hello blue!')
5 capture = cv2.VideoCapture(0)
6#设定蓝⾊的范围HSV
7# lower_color = np.array([100,110,110])
8# upper_color = np.array([130,255,255])
  #设定绿⾊的范围HSV
9 lower_color = np.array([37, 43, 46])
10 upper_color = np.array([77, 255, 255])
11
12while True:
13#1、捕获摄像头的⼀帧画⾯
14    ret,frame = ad()
15#2、从BRG转换为HSV(⾊调H范围为[0,179],饱和度S是[0,255],明度V是[0,255])
16    hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
17#3、inRange():介于lower_color 和 upper_color之间的为⽩⾊,其余为⿊⾊18    mask = cv2.inRange(hsv,lower_color,upper_color)
19#4、只保留原图中的蓝⾊部分
20    reserve = cv2.bitwise_and(frame,frame,mask=mask)
21    cv2.imshow('frame',frame)
22    cv2.imshow('mask',mask)
23    cv2.imshow('reserve',reserve)
24if cv2.waitKey(1) == ord('q'):
25break
26
rectangle函数opencv27#释放摄像头
lease()
29#关闭窗⼝
30 cv2.destroyAllWindows()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。