目录
目录
读取、显示图像
import cv2
import numpy as np
img = cv2.imread('41.png',0)
cv2.imshow('image',img)
key = cv2.waitKey(0)
if key & 0xff == ord('q'):
cv2.destroyWindow()
elif key & 0xff == ord('s'):
cv2.imwrite('14.png',img)
cv2.destroyWindow()
从摄像头进行视频采集
import cv2
#创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',640,480)
#获取视频
cap = cv2.VideoCapture(0) #0:开启本地视频
#cap = cv2.VideoCapture('14.mp4') #读取本地的视频资源
while True:
#从摄像头读取视频帧
ret,frame = cap.read()
#将视频帧在窗口显示出来
cv2.imshow('video',frame)
#等待键盘事件,如果为q,退出
key = cv2.waitKey(1)
if (key & 0xFF == ord('q')):
break
#释放videoCapture
cap.release()
cv2.destroyWindow()
视频录制
VideoWriter:输出文件\多媒体文件格式(VideoWriter_fourcc)
步骤:
VideoWriter |
write |
release |
import cv2
import numpy as np
#创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',640,480)
#获取视频设备/从视频文件中读取视频帧
cap = cv2.VideoCapture(0) #0:开启本地摄像头
#cap = cv2.VideoCapture('14.mp4') #读取本地的视频资源
#创建VideoWriter
fourcc = cv2.VideoWriter_fourcc(*'XVID')
vw = cv2.VideoWriter('out.avi',fourcc,25,(640,480))
while True:
#从摄像头读取视频帧
ret,frame = cap.read()
#frame = cv2.flip(frame,0) #图像翻转函数
#将视频帧在窗口显示出来
cv2.imshow('video',frame)
#写入
vw.write(frame)
#等待键盘事件,如果为q,退出
key = cv2.waitKey(1)
if (key & 0xFF == ord('q')):
break
#释放videowriter
vw.release()
#释放videoCapture
cap.release()
cv2.destroyWindow()
代码优化
import cv2
import numpy as np
#创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',640,480)
#创建VideoWriter
fourcc = cv2.VideoWriter_fourcc(*'XVID')
vw = cv2.VideoWriter('out.avi',fourcc,25,(640,480))
#获取视频设备/从视频文件中读取视频帧
#cap = cv2.VideoCapture(0) #0:开启本地摄像头
#如果出现waning:`anonymous-namespace'::SourceReaderCB::~SourceReaderCB terminating async cal 用下面
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
#cap = cv2.VideoCapture('14.mp4') #读取本地的视频资源
#判断摄像头是否为打开状态
while cap.isOpened():
#从摄像头读取视频帧
ret,frame = cap.read()
#判断视频帧是否读取成功
if ret == True:
#frame = cv2.flip(frame,0) #图像翻转函数
#将视频帧在窗口显示出来
cv2.imshow('video',frame)
cv2.resizeWindow('video', 640, 480)
#写数据到多媒体文件
vw.write(frame)
#等待键盘事件,如果为q,退出
key = cv2.waitKey(1)
if (key & 0xFF == ord('q')):
break
else:
break
#释放videowriter
vw.release()
#释放videoCapture
cap.release()
cv2.destroyWindow()
OpenCV处理鼠标事件
import cv2
import numpy as np
#自定义的callback函数
def mouse_callback(event,x,y,falgs,userdata):
print(event,x,y,falgs,userdata)
#创建一个窗口
cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse',640,360)
#设置鼠标回调函数
cv2.setMouseCallback('mouse',mouse_callback,"123")
cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
# 创建一个全黑的屏幕
img = np.zeros((360,640,3),np.uint8)
while True:
cv2.imshow('mouse',img)
key = cv2.waitKey(1)
if key & 0xFF ==ord('q'):
break
cv2.destroyAllWindows()
Tracker使用
import cv2
import numpy as np
#创建窗口
cv2.namedWindow('tracker',cv2.WINDOW_NORMAL)
#定义callback
def callback():
pass
#创建tracker
cv2.createTrackbar('R','tracker',0,255,callback)
cv2.createTrackbar('G','tracker',0,255,callback)
cv2.createTrackbar('B','tracker',0,255,callback)
#设置纯黑色的背景
img = np.zeros((480,640,3),np.uint8)
while True:
cv2.imshow('tracker',img)
#获取当前tracker的值
r = cv2.getTrackbarPos('R','tracker')
g = cv2.getTrackbarPos('G', 'tracker')
b = cv2.getTrackbarPos('B', 'tracker')
img[:]=[b,g,r]
cv2.imshow('tracker',img)
key = cv2.waitKey(1)
if key & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
颜色转化
#色彩空间的转化
import cv2
#创建窗口
cv2.namedWindow('color',cv2.WINDOW_NORMAL)
def callback(userdata):
pass
img = cv2.imread('41.png')
colorspaces = [cv2.COLOR_BGR2RGBA,cv2.COLOR_BGR2RGBA,cv2.COLOR_BGR2GRAY,
cv2.COLOR_BGR2HSV,cv2.COLOR_BGR2YUV]
cv2.createTrackbar('curcolor','color',0,4,callback)
while True:
index = cv2.getTrackbarPos('curcolor','color')
#颜色空间转换
cvt_img = cv2.cvtColor(img,colorspaces[index])
cv2.imshow('color',img)
key = cv2.waitKey(10)
print(key)
if key & 0xff == ord('q'):
break
cv2.destroyAllWindows()
Numpy 的基本操作
import numpy as np
#通过array定义矩阵
b = np.array([1,2,3])
c = np.array([[1,2,3],[4,5,6]])
print(c,b)
#zeros
a = np.zeros((2,3,2),np.uint8) #2列3行的矩阵
print(a)
#定义ones
d = np.ones((2,3),np.uint8)
print(d)
#定义full
e = np.full((8,8),10,np.uint8)
print(e)
#定义单位矩阵identity
f = np.identity(4)
print(f)
#定义单位矩阵eye
g = np.eye(5,7,key=3)
print(g)
#numpy的检索
#[y,x] 第y个值,第x个值
#[y,x,channel]
import cv2
import numpy as np
img = np.zeros((480,640,3),np.uint8)#bgr
#获取矩阵中的值
print(img[100,100])
count = 0
while count<100:
count+=1
img[count,100]=[255,255,255] #count这里等于列 0 在这里是蓝色的
cv2.imshow('img',img)
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
cv2.destroyAllWindows()
获取子矩阵
#numpy的检索
#[y,x] 第y个值,第x个值
#[y,x,channel]
import cv2
import numpy as np
img = np.zeros((480,640,3),np.uint8)#bgr
roi = img[100:400,100:400]
#获取子矩阵
roi[:,:]=[0,0,255]
roi[10:200,10:200] = [0,255,0]
cv2.imshow('img',roi)
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
cv2.destroyAllWindows()
图片信息
#numpy的检索
#[y,x] 第y个值,第x个值
#[y,x,channel]
import cv2
import numpy as np
img = cv2.imread('14.png')
#shape 属性中的三个信息
#高度、长度和通道数
print(img.shape)
#图像占用了多大的空间
#高度*长度*通道数
print(img.size)
#图像中每个元素的位深
print(img.dtype)
通道的分割与分离
#numpy的检索
#[y,x] 第y个值,第x个值
#[y,x,channel]
import cv2
import numpy as np
#创建一个图层
img = np.zeros((480,640,3),np.uint8)
#划线函数
cv2.line(img,(0,0),(100,100),(255,0,0),5)
#画矩形
cv2.rectangle(img,(0,0),(100,100),(0,255,0),3)
#画圆
#-1:涂满
cv2.circle(img,(200,200),60,(0,0,255),6)
#画椭圆
cv2.ellipse(img,(200,200),(20,100),0,0,360,(255,0,0),5)
#画多边形
#需要指定每个顶点的坐标,构建一个大小相等于行数X1X2的数组,行数就是点的数目,这个数组必须为int32.
pts = np.array([[100,5],[200,30],[70,200],[50,100]],np.int32)
print(pts)
pts = pts.reshape((-1,1,2))
print(pts)
##这里reshape的第一个参数为-1,表明这一维度的长度是根据后面的维度计算出来的
cv2.polylines(img,[pts],True,(0,255,255))
#在图片上添加文字
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV',(10,200),font,4,(255,255,255),2)
#创建窗口
cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
绘图函数
#numpy的检索
#[y,x] 第y个值,第x个值
#[y,x,channel]
import cv2
import numpy as np
img = np.zeros((480,640,3),np.uint8)
#这个是深拷贝 通道的分割
b,g,r = cv2.split(img)
b[10:100,10:100]=255
g[10:100,10:100]=255
#通道的合并
img2=cv2.merge((b,g,r))
cv2.imshow('b',b)
cv2.imshow('g',g)
cv2.imshow('r',r)
cv2.imshow('img',img)
cv2.imshow('img2',img2)
cv2.waitKey(0)
用滑动条做调色板
import cv2
import numpy as np
def nothing(x):
pass
#创建一个黑色的图像
img = np.zeros((400,640,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=on 滑动条可以使用
switch = '0:OFF\n1:ON'
print(switch)
cv2.createTrackbar(switch,'image',0,1,nothing)
while(1):
cv2.imshow('image',img)
k = cv2.waitKey(1)
if k==ord('q'):
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[:]=[r,g,b]
cv2.destroyAllWindows()
图像的基本操作
import cv2
import numpy as np
img = cv2.imread('41.png')
#img.shape = (360,280,3)
print(img.shape)
px = img[100,100]
#px = [180 144 114] 代表着三个通道 b g r
print(px)
blue = img[100,100,0]
print(blue)
img[100,100]=[255,255,255]
cv2.namedWindow('image')
while(1):
cv2.imshow('image',img)
k = cv2.waitKey(1)
if k==ord('q'):
break
cv2.destroyAllWindows()
读取图片通道
import cv2
import numpy as np
#创建窗口
cv2.namedWindow('image')
#读取图片
img = cv2.imread('41.png')
#使用item和itemset 分割通道
print(img.item(10,10,2))
img.itemset((10,10,2),100) #设置这个位置的值
print(img.item(10,10,2))
#返回图像的数据类型
print(img.dtype)
#拆分及合并图像通道
r,g,b = cv2.split(img) #尽量少用
r = img[:,:,2]
g = img[:,:,1]
b = img[:,:,0]
print(r,g,b)
img2 = cv2.merge(r,g,b)#合并
while(1):
cv2.imshow('image',img)
cv2.imshow('image', img2)
k = cv2.waitKey(1)
if k==ord('q'):
break
cv2.destroyAllWindows()
图片填充
#图像边界填充
import cv2
import numpy
from matplotlib import pyplot as plt
img = cv2.imread('41.png')
blue = [255,0,0]
replicate = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_CONSTANT)
plt.subplot(231),plt.imshow(img,'gray'),plt.title('original')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('replicate')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('reflect')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('rreflect101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('wrap')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('constant')
#展示
plt.show()
实现鼠标绘制基本图像
import cv2
import numpy as np
curshape = 0
startpos = (0,0)#起始点
endpos = (0,0)
'''
基本功能
l键:画线 curshape = 0
r键:画矩形 curshape = 1
c键:画圆 curshape = 2
'''
#创建窗口
cv2.namedWindow('drawshape',cv2.WINDOW_NORMAL)
cv2.resizeWindow('drawshape',640,480)
#显示窗口和背景
img = np.zeros((480,640,3),np.uint8)
#鼠标回调函数
def mouse_callback(event,x,y,flags,userdata):
#print(event,x,y,flags,userdata)
global startpos
if (event & cv2.EVENT_LBUTTONDOWN ==cv2.EVENT_LBUTTONDOWN): #鼠标左键按下
startpos = (x,y)
elif (event & cv2.EVENT_LBUTTONUP ==cv2.EVENT_LBUTTONUP): #鼠标左键按下
if curshape==0:
cv2.line(img,startpos,(x,y),(0,0,255))
if curshape==1:
cv2.rectangle(img,startpos,(x,y),(0,0,255))
elif curshape==2:
a = abs((x-startpos[0]))
b = abs((y-startpos[1]))
r = int((a**2+b**2)**0.5)
cv2.circle(img,startpos,r,(0,0,255))
else:
print('error')
#设置鼠标回调函数
cv2.setMouseCallback('drawshape',mouse_callback,'123')
while (1):
cv2.imshow('drawshape',img)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
print(key)
break
if key == ord('l'):#画线
curshape = 0
print(key)
if key == ord('r'):#画矩形
curshape = 1
print(key)
if key == ord('c'):#画圆
curshape = 2
print(key)
cv2.destroyAllWindows()
图像的加法
import cv2
import numpy as np
dog = cv2.imread('./dog.jpg')
print(dog.shape)
img = np.ones((1280,1920,3),np.uint8)*100 #100是曝光度
cv2.imshow('image',img)
cv2.imshow('orig',dog)
result = cv2.add(dog,img)
cv2.imshow('result',result)
cv2.waitKey(0)
图像减法
import cv2
import numpy as np
dog = cv2.imread('./dog.jpg')
print(dog.shape)
img = np.ones((1280,1920,3),np.uint8)*100 #100是曝光度
cv2.imshow('image',img)
cv2.imshow('orig',dog)
result = cv2.subtract(dog,img) #图像减法
cv2.imshow('result',result)
cv2.waitKey(0)
图片的加运算使图片更亮,减法使图片更暗
add(A,B):加法 subtract(A,B):减法
图像溶合
addWeight(A,alpha,B,bata,gamma)
# alpha和beta 为权重 gamma :静态权重
位操作
import cv2
import numpy as np
dog = cv2.imread('./dog.jpg')
img = np.zeros((200,200),np.uint8) #单通道的,黑白色
img2 = np.zeros((200,200),np.uint8) #单通道的,黑白色
img[50:150,50:150]=255
img2[50:150,50:150]=255
new_img = bitwise_and(img,img2) #与运算
new_img = bitwise_not(img,img2) #非运算
cv2.imshow('image',img)
cv2.imshow('image2',img2)
cv2.imshow('image2',new_img)
cv2.waitKey(0)