opencv 使用说明

参考教程

安装

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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值