Posted on  Updated on 

opencv學習

参考资料

https://www.bilibili.com/video/BV1ET4y127vd/?spm_id_from=333.999.0.0&vd_source=755a0f899976f771c7923daed9448d48

https://opencv.apachecn.org/

opencv简介

是什么?

计算机视觉开源软件库

numpy

opencv-python的安装

打开cmd
输入

1
2
3
pip install opencv-python

pip install opencv-contrib-python

开梯子下载更快

测试代码

1
2
3
4
5
6

import cv2
# 读一个图片并进行显示(图片路径需自己指定)
lena=cv2.imread("1.png")
cv2.imshow("image", lena) # 打开新窗口,窗口名为image,显示Lena
cv2.waitKey(0)

opencv模块


其中core、highgui、imgproc是最基础的模块,该课程主要是围绕这几个模块展开的,分别介绍如下:

  • core模块实现了最核心的数据结构及其基本运算,如绘图函数、数组操作相关函数等
  • highgui模块实现了视频与图像的读取、显示、存储等接口。
  • imgproc模块实现了图像处理的基础方法,包括图像滤波、图像的几何变换、平滑、闻值分割、形态学处理、边缘检测、目标检测、运动分析和对象跟踪等。

其他

  • features2d模块用于提取图像特征以及特征匹配,nonfree模块实现了一些专利算法,如sift特征。obidetect模块实现了一些目标检测的功能,经典的基于Haar、LBP特征的人脸检测,基于HOG的行
    人、汽车等目标检测,分类器使用Cascade Classification (级联分类)和Latent SVM等。
  • stitching模块实现了图像拼接功能。
  • FLANN模块 (Fast Library for Approximate Nearest Neighbors),包含快速近似最近搜索FLANN
    和聚类Clustering算法。
  • ml模块机器学习模块 (SVM,决策树,Boosting等等)
  • photo模块包含图像修复和图像去噪两部分。
  • video模块针对视频处理,如背景分离,前景检测、对象跟踪等。
  • calib3d模块即Calibration (校准)3D,这个模块主要是相机校准和三维重建相关的内容。包含了基本的多视角几何算法,单个立体摄像头标定,物体姿态估计,立体相似性算法,3D信息的重建等等。
    G-API模块包含超高效的图像处理pipeline引擎

图像的基础操作

  • 掌握图像的读取和保存方法
  • 能够使用OpenCV在图像上绘制几何图形
  • 能够访问图像的像素
  • 能够获取图像的属性,并进行通道的分离和合并0
  • 能够实现颜色空间的变换

读取图像

1
cv.imread("路径")
  • cv.IMREAD*COLOR:以彩色模式加载图像,任何图像的透明度都将被忽略。这是默认参数。
  • cv.IMREAD*GRAYSCALE: 以灰度模式加载图像
  • Cv.IMREAD UNCHANGED: 包括alpha通道的加载图像模式。
    可以使用1、0或者-1来替代上面三个标志
    1
    2
    3
    4
    5
    6
    7
    8
    import numpy as np
    import cv2

    #以灰度图的形式读取图像
    img = cv2.imread("1.png")
    cv2.imshow("image", img)
    cv2.waitKey(0)

注意:如果加载的路径有错误,不会报错,会返回一个None值

显示图像

1
cv.imshow("窗口名", 图片)

注意:在调用显示图像的API后,要调用cv.waitKey()//等待键盘输入 给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来。waitkey(0),永远等待
另外我们也可使用matplotlib对图像进行展示。

保存图像

1
cv.imwrite("文件名", 图片变量)

总结:

1
2
3
4
5
6
7
8
9
10
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#读取图像
img = cv.imread('1.png',1)
# 利用opencv展示图像
cv.imshow( ' image', img)
k = cv.waitKey(0)
# 3 保存图像
cv.imwrite( 'messigray.png',img)

course_1

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 学习了基本操作,imread(), imwrite()等
import cv2 as cv

# 获取摄像头
cap = cv.VideoCapture(0)
# set the height(3) and width(4) of the windows
# windows系统下,微软surface的系统摄像头,该设置失效,原因未明
# 外置摄像头OK
cap.set(3, 640)
cap.set(4, 480)

# set brightness
# 但好像也没什么用
cap.set(10, 0.00001)

while True:
success, img = cap.read()
cv.imshow("camera", img)
if cv.waitKey(1) == ord('Q') or cv.waitKey(1) == 27:
# 当所有事完成,释放 VideoCapture 对象
cap.release()
cv.destroyAllWindows()
break




详解

1
2
3
4
cap = cv.VideoCapture(2)
VideoCapture()中参数是0,表示打开笔记本的内置摄像头,
参数是视频文件路径,打开方式如下:
cap = cv2.VideoCapture(“../test.avi”)
1
2
success, img = cap.read()
cap.read()按帧读取视频,ret,frame是获cap.read()方法的两个返回值。 其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。
1
2
3
4

waitKey()
方法本身表示等待键盘输入,参数是1,表示延时1ms切换到下一帧图像。对于视频而言;参数为0,如cv2.waitKey(0)只显示当前帧图像,相当于视频暂停;
参数过大如cv2.waitKey(1000),会因为延时过久而卡顿感觉到卡顿。c得到的是键盘输入的ASCII码,esc键对应的ASCII码是27,即当按esc键是if条件句成立

course_2

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import cv2 as cv
import numpy as np

aaa = np.ones((5, 5), np.uint8)

# cv.imread("路径", 参数),参数不传,默认参数1
img = cv.imread("img/1 (1).jpg")

# cv2.namedWindow(‘窗口标题’,默认参数) 创建新窗口
cv.namedWindow('Local Camera', 0)
# 设置显示的窗口大小为500,500,建议大于等于摄像头分辨率
cv.resizeWindow("Local Camera", 300, 300)
cv.imshow("Local Camera", img)

# 灰度图片
imgGray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
cv.imshow("show imgGray", imgGray)

# 高斯模糊
imgBlur = cv.GaussianBlur(img, (7, 7), 0)
cv.imshow("show imgBlur", imgBlur)

# 边缘检测
imgCanny = cv.Canny(img, 150, 200)
cv.imshow("show imgCanny", imgCanny)

# 膨胀
imgDilation = cv.dilate(imgCanny, aaa, iterations=1)
cv.imshow("show imgDilation", imgDilation)

# 腐蚀
imgErode = cv.erode(imgDilation, aaa, iterations=1)
cv.imshow("show imgErode", imgErode)

cv.waitKey(0)

course_3

学习图像像素查看,图片大小调整,图片裁剪

opencv的X,Y的位置

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import cv2 as cv
import numpy as np

img = cv.imread("img/1 (1).jpg")
print(img.shape)
print(img.shape[0])
# 打印出(1526, 1080, 3)
# 打印出的分别是,高,宽,BGR

# 图像大小调整,参数为宽,高
a = int(img.shape[1]*0.3)
b = int(img.shape[0]*0.3)
imgResize = cv.resize(img, (a, b))
print(imgResize.shape)

# 图像裁剪 高与宽
imgCropped = img[0:400, 200:400]


cv.imshow("LOCAL img", img)
cv.imshow("LOCAL imgResize", imgResize)
cv.imshow("LOCAL imgCropped", imgCropped)

cv.waitKey(0)

course_4 绘画

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import cv2 as cv
import numpy as np

# 0为黑,1为白
img = np.zeros((400, 400))
img1 = np.zeros((400, 400, 3))
imgBlue = img1.copy() # 令imgBlub = img,则会报错,img为二维数组,只有黑白
imgBlue[:] = 255, 0, 0

# 划线,参数1,图片,参数2,起始点,参数3,终止点,参数4,color 参数5,厚度
cv.line(img1, (0, 0), (400, 250), (255, 255, 255), 1)
# 画矩形,参数配置同上,参数5也可用cv.FILLED,填充
cv.rectangle(img1, (0, 0), (400, 200), (255, 255, 0), 2)
# 画圆
cv.circle(img1, (200, 70), 30, (255, 255, 100), cv.FILLED)

cv.imshow("img", img)
cv.imshow("img2", img1)
cv.imshow("imgBlue", imgBlue)
cv.waitKey(0)


course_5 透视变换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import cv2 as cv
import numpy as np
# 矩阵变换

width, height = 250, 350
img = cv.imread("img/1 (15).png")
pts1 = np.float32([[108, 240], [276, 209], [150, 491], [342, 451]])
pts2 = np.float32([[0, 0], [width, 0], [0, height], [width, height]])

matrix = cv.getPerspectiveTransform(pts1, pts2) # 获得透视矩阵
out_img = cv.warpPerspective(img, matrix, (width, height)) # 透视

cv.imshow("local img", img)
cv.imshow("out_img img", out_img)
cv.waitKey(0)

解析

cv2.getPerspectiveTransform()是一个OpenCV函数,用于获取透视变换矩阵。它需要两个参数,分别是源图像中待测矩形的四点坐标和目标图像中矩形的四点坐标。它返回一个3x3的变换矩阵,可以用于cv2.warpPerspective()函数进行透视变换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import cv2
import numpy as np

# 定义源图像中待测矩形的四点坐标
pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])

# 定义目标图像中矩形的四点坐标
pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])

# 获取透视变换矩阵
M = cv2.getPerspectiveTransform(pts1, pts2)

# 输出变换矩阵
print(M)

输出为

1
2
3
[[ 8.24482681e-01 -1.02318154e-01 -3.33674687e+01]
[ 1.18180922e-01 9.43895645e-01 1.17818491e+01]
[ 1.65498408e-04 -1.69338403e-04 1.00000000e+00]]

warpPerspective()函数
主要作用:对图像进行透视变换,就是变形
cv.warpPerspective是OpenCV中的一个函数,主要用于对图像进行透视变换。它可以将原始图像中的任意四边形区域转换为目标图像中的矩形区域,从而实现图像的透视变换。该函数的语法如下:

1
dst = cv.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

其中,参数含义如下:
src:输入图像,可以是8位无符号整数、32位浮点数或16位有符号整数。
M:3x3变换矩阵。
dsize:输出图像的大小。
dst:输出图像,与输入图像具有相同的数据类型和通道数。
flags:插值方法的标志,可以是cv2.INTER_NEAREST、cv2.INTER_LINEAR、cv2.INTER_CUBIC、cv2.INTER_AREA、cv2.INTER_LANCZOS4等。
borderMode:边界填充模式,可以是cv2.BORDER_CONSTANT、cv2.BORDER_REPLICATE、cv2.BORDER_REFLECT、cv2.BORDER_WRAP等.
borderValue:边界填充值。