安装
pip install opencv-python
pip install opencv-contrib-python
GUI操作
#! encoding=utf-8
import cv2 as cv
from matplotlib import pyplot as plt
pic_path = "./data/light.png"
# pic_path = "./data/test.jpg"
# pic_path = "./data/测试.txt"
video_path = "./data/light.mp4"
def show_image(frame):
cv.imshow("image",frame)
# while(True):
# if cv.waitKey(1000) & 0xFF == ord("q"):
# break
cv.waitKey(0)
# cv.destroyWindowindow("image")
cv.destroyAllWindows()
"""
图片操作:imread imwrite imshow
"""
img = cv.imread(pic_path)
# cv.imshow("light_img",img)
k = cv.waitKey(0)
cv.destroyAllWindows()
cv.imwrite("./data/test_save.png",img)
#matplotlib图片显示
# plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
# plt.xticks([])
# plt.yticks([])
# plt.show()
show_image(img)
"""
视频操作
VideoCapture
VideoWriter
"""
import os
import cv2 as cv
def video_to_image(video_path, save_path):
"""
视频转图片操作
"""
video = cv.VideoCapture(video_path)
try:
if not os.path.exists(save_path):
os.makedirs(save_path)
except OSError:
print("Error")
current_index = 0
while(True):
ret,frame = video.read()
if ret:
frame_name = os.path.join(save_path,str(current_index)+".jpg")
cv.imwrite(frame_name,frame)
print("save pic:{}".format(frame_name))
current_index = current_index + 1
# cv.imshow("image",frame)
# cv.waitKey(1)
else:
break
video.release()
cv.destroyAllWindows()
def video_show(video_path):
video = cv.VideoCapture(video_path)
while(True):
ret,frame = video.read()
if ret and (cv.waitKey(10) & 0xFF != ord("q")):
cv.imshow("image", frame)
else:
break
video.release()
cv.destroyAllWindows()
video_path = "./data/light.mp4"
save_path = "./data/light"
video_show(video_path)
"""
绘图功能 cv.line(), cv.circle() , cv.rectangle(), cv.ellipse(), cv.putText(),cv.polylines()
相同的参数:
img (512,512,3)矩阵
color (255,0,0)
thickness :5
lineType
"""
import cv2 as cv
import numpy as np
img = np.zeros((512,512,3),np.uint8)
frame = cv.line(img,(0,0),(511,511),(255,0,0),5)
frame_circle = cv.circle(img,(447,63),63,(0,0,255),-1)
frame_rectangle = cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
cv.ellipse(img,(444,80),(63,50),0,0,180,255,-1)
cv.putText(img,"Opencv",(600,600),0,0,0,1)
show_image(frame_circle)
"""
鼠标作为画笔:setMouseCallback()
查看所有的回调事件:
[i for i in dir(cv) if "EVENT" in i]
"""
import numpy as np
import cv2 as cv
# 鼠标回调函数
def draw_circle(event,x,y,flags,param):
if event == cv.EVENT_LBUTTONDOWN:
cv.circle(img,(x,y),100,(255,0,0),-1)
# 创建一个黑色图像,一个窗口,然后和回调绑定
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
cv.imshow('image',img)
if cv.waitKey(20) & 0xFF == 27:
break
cv.destroyAllWindows()
核心操作
import numpy as np
import cv2 as cv
pic_path = "./data/light.png"
img = cv.imread(pic_path)
#访问像素点、修改像素点
img.item(10,10,0)
img.itemset((10,10,0),45)
# 拆分和合并图像通道
b,g,r = cv.split(img)
img_merge = cv.merge((b,g,r))
# 或者使用numpy.array的切片方法
b = img[:,:,0]
"""
图像的算法运算
cv.add
cv.addWeighted
cv.bitwise_add
cv.bitwise_not
cv.threshold
cv.cvtColor
"""
pic_path_0 = "./data/light.png"
pic_path_1 = "./data/face.png"
img0 = cv.imread(pic_path_0)
img1 = cv.imread(pic_path_1)
length,width = img1.shape[0],img1.shape[1]
img0 = cv.resize(img0,(length,width))
dst = cv.addWeighted(img0,0.7,img1,0.3,0)
"""
测量性能
cv.getTickCount()
cv.getTickFrequency()
cv.useOptimized()
#
time.time()
"""
import time
count_0 = cv.getTickCount()
time.sleep(1)
count_1 = cv.getTickCount()
print((count_1-count_0)/cv.getTickFrequency())
图像处理
"""
更改颜色空间 cvtColor()
指定范围的值:cv.inRange
bgr、hsv颜色空间的区别
查看COLOR_相关的属性
"""
import numpy as np
color = [i for i in dir(cv) if i.startswith("COLOR_")]
# cv.imread默认读的就是bgr的格式
img = cv.imread(pic_path)
#cvtColor转化后,直接显示
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
# 颜色过滤
lower_white = np.array([0,50,50])
hight_white = np.array([20,255,255])
mask = cv.inRange(hsv, lower_white, hight_white)
res = cv.bitwise_and(img,img,mask=mask)
show_image(res)
# bgr对应的hsv值
bgr = np.array([[[255,255,255]]],dtype=np.uint8)
hsv = cv.cvtColor(bgr,cv.COLOR_BGR2HSV)
hsv
"""
%tb像金字塔
cv.pyrUp
cv.pyrDown
"""
"""
OpenCV中的轮廓
"""
"""
OpenCV中的图像转换
"""
"""
resize
几何变换
cv.getPerspectiveTransform:用于获取变换矩阵
cv.warpAffine
参数为2*3矩阵
"""
img = cv.imread(pic_path)
#按比例
img_1 = cv.resize(img,None,fx=0.2,fy=0.2, interpolation = cv.INTER_CUBIC)
# show_image(img_1)
#平移变换
rows,cols = img.shape[0],img.shape[1]
M = np.float32([[1,0,-100],[0,1,50]])
dst = cv.warpAffine(img,M,(cols,rows))
# show_image(dst)
#旋转
M = cv.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1)
dst = cv.warpAffine(img,M,(cols,rows))
#仿射变换
pts1 = np.float32([[50.0,50],[200,50],[50,200]])
pts2 = np.float32([[10.0,100],[200,50],[100,250]])
# M = cv.getPerspectiveTransform(pts1,pts2)
show_image(dst)
"""
平滑图像
cv.filter2D
cv.blur
cv.getGaussianKernel
cv.medianBlur
"""
import numpy as np
import cv2 as cv
img = cv.imread(pic_path_1)
kernel = np.ones((5,5),np.float32)/25
dst = cv.filter2D(img,-1,kernel)
dst = cv.blur(img,(5,5))
dst = cv.GaussianBlur(img,(5,5),0)
dst = cv.medianBlur(img,5)
show_image(dst)
"""
图像梯度
cv.Sobel
cv.Laplacian
cv.Scharr
"""
img = cv.imread(pic_path)
sobel = cv.Sobel(img,cv.CV_64F,0,1,ksize=5)
"""
图像边缘检测
cv.Canny()
"""
img = cv.imread(pic_path,0)
edges = cv.Canny(img,200,300)
show_image(edges)
"""
轮廓
cv.finContours()
cv.drawContours()
"""
img = cv.imread(pic_path)
# dst = cv.findContours(img, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
"""
OpenCV中的直方图
cv.calcHist
np.histogram
"""
img = cv.imread(pic_path,0)
hist = cv.calcHist([img],[0],None,[256],[0,256])
from matplotlib import pyplot as plt
plt.hist(img.ravel(),25,[0,256])
plt.show()
特征检测和描述
"""
目标检测
"""
import cv2 as cv
model_path = "./models/haarcascade_eye.xml"
pic_path = "./data/face.png"
pic_path = "./data/light/0.jpg"
img = cv.imread(pic_path)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
classifier = cv.CascadeClassifier(model_path)
faces = classifier.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv.imshow("image",img)
cv.waitKey(0)
cv.destroyAllWindows()