https://www.bilibili.com/video/av95503343?p=1www.bilibili.com
中文文字翻译:太绝了史上最全的OpenCV入门教程_qq_38660394的博客-CSDN博客blog.csdn.net
第一节:Intro and loading Images
功能:读取图片,显示图片,导入matplotlib.pyplot,保存图像
#Intro and loading Images
#功能:读取图片,显示图片,导入matplotlib.pyplot,保存图像
import cv2
import numpy as np
import matplotlib.pyplot as plt
#控制台运行'sudo apt-get install python-matplotlib'安装
img = cv2.imread('watch.jpg',0)
#cv2.IMREAD_GRAYSCALE = 0;灰度图
#cv2.IMREAD_COLOR = 1;彩色图
#cv2.IMREAD_UNCHANGED = -1;原图
“”“
cv2.imshow('image',img)#显示图片(图片名称,源图片)
cv2.waitKey(0)#等待按下‘0’
cv2.destroyAllWindows()#释放所有窗口
”“”
#导入matplotlib.pyplot
'''plt.imshow(img,cmap='gray', interpolation='bicubic')plt.plot([50,100],[80,100],'c',linewidth=5)plt.show()'''
cv2.imwrite('watchgray.png',img)#保存图像
输出结果:
第二节:Loading videoo Source
功能:打开摄像机,转为灰度图,在窗口中显示,保存为avi格式视频
#Loading videoo Source
#功能:打开摄像机,转为灰度图,在窗口中显示,保存为avi格式视频
import cv2
import numpy as np
cap = cv2.VideoCapture(0)# #调用摄像头‘0'一般是打开电脑自带摄像头,‘1'是打开外部摄像头(只有一个摄像头的情况)
#定义视频编码器
#这里有必要提一下fourcc
#FourCC全称Four-Character Codes,代表四字符代码 (four character code), 它是一个32位的标示符,其实就是typedef unsigned int FOURCC;是一种独立标示视频数据流格式的四字符代码。
#因此cv2.VideoWriter_fourcc()函数的作用是输入四个字符代码即可得到对应的视频编码器。
fourcc = cv2.VideoWriter_fourcc(*'XVID')#使用XVID编码器
out = cv2.VideoWriter('output.avi',fourcc,20.0,(640,480))#分别是:保存文件名、编码器、帧率、视频宽高
while True:
ret,frame = cap.read()#读取图像(frame就是读取的视频帧,对frame处理就是对整个视频的处理)
#ret是判断读取是否成功,成功为1,失败为0
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#将RGB图转为GRAY图
out.write(frame)# 保存录像结果
cv2.imshow('frame',frame)#显示图像
cv2.imshow('gray',gray)#显示灰度图
input = cv2.waitKey(1)
#功能:等待键盘'key'键的输入
#参数:1:表示延时1ms切换到下一帧图像,对于视频而言
#0:只显示当前帧图像,相当于视频暂停
#key:要输入键盘的键
#返回值:键盘输入的ASCII码
if input == ord('q'):
break
#释放内存
cap.release()#释放摄像头
out.release()#释放视频
cv2.destroyAllWindows()#关闭所有窗口
import cv2
import numpy as np
cap = cv2.VideoCapture(0)# #调用摄像头‘0'一般是打开电脑自带摄像头,‘1'是打开外部摄像头(只有一个摄像头的情况)
#定义视频编码器
#这里有必要提一下fourcc
#FourCC全称Four-Character Codes,代表四字符代码 (four character code), 它是一个32位的标示符,其实就是typedef unsigned int FOURCC;是一种独立标示视频数据流格式的四字符代码。
#因此cv2.VideoWriter_fourcc()函数的作用是输入四个字符代码即可得到对应的视频编码器。
fourcc = cv2.VideoWriter_fourcc(*'XVID')#使用XVID编码器
out = cv2.VideoWriter('output.avi',fourcc,20.0,(640,480))#分别是:保存文件名、编码器、帧率、视频宽高
while True:
ret,frame = cap.read()#读取图像(frame就是读取的视频帧,对frame处理就是对整个视频的处理)
#ret是判断读取是否成功,成功为1,失败为0
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#将RGB图转为GRAY图
out.write(frame)# 保存录像结果
cv2.imshow('frame',frame)#显示图像
cv2.imshow('gray',gray)#显示灰度图
input = cv2.waitKey(1)
#功能:等待键盘'key'键的输入
#参数:1:表示延时1ms切换到下一帧图像,对于视频而言
#0:只显示当前帧图像,相当于视频暂停
#key:要输入键盘的键
#返回值:键盘输入的ASCII码
if input == ord('q'):
break
#释放内存
cap.release()#释放摄像头
out.release()#释放视频
cv2.destroyAllWindows()#关闭所有窗口
输出结果:
参考链接:Opencv-VideoWriter_Yan-CSDN博客_cv2.videowriter_fourcc(*xvid)blog.csdn.net
第三节:Drawing and Writing on Image
功能:读取图片,画矩形/圆形/多边形/写字,显示图片
#Drawing and Writing on Imag
#功能:读取图片,画矩形/圆形/多边形/写字,显示图片
import cv2
import numpy as np
img = cv2.imread('watch.jpg',cv2.IMREAD_COLOR)#读取图片,引号内为图片路径
#img = np.zeros((300,400,3), np, uint8)#绘制一张黑图(长宽位深,数据格式)
cv2.line(img,(0,0), (150,150), (255,0,0), 15)#画直线(源图片,起点,终点,BGR颜色,线宽)
cv2.rectangle(img, (15,25), (200,150), (0,255,0), 5)#画矩形(源图片,左上点,右下点,BGR颜色,线宽)
cv2.circle(img, (100,63), 55, (0,0,255), -1)#画圆形(源图片,圆心,半径,BGR颜色,线型0空心,-1实心)
pts = np.array([[10,5], [20,30], [70,20], [50,10]], np.int32)#画多边形(坐标点,数据类型)
#pts = pts.reshape((-1,1,2))#语义可以看后面的链接
cv2.polylines(img,[pts], True, (0,255,255), 3)#画线(源图像,多边形,是否闭合,颜色,线宽)
font = cv2.FONT_HERSHEY_SIMPLEX#设置字体
cv2.putText(img, 'OpenCV Tuts!', (0,130), font, 1, (200,0,0), 2, cv2.LINE_AA)
#添加文字(源图像,文字内容,位置,字体,字号,颜色,线宽,线型)
cv2.imshow('image',img)#显示图片(图片名称,源图片)
cv2.waitKey(0)#等待按下‘0’
cv2.destroyAllWindows()#释放所有窗口
输出结果:
参考链接:python-opencv绘图函数(cv2.line(), cv2.circle(), cv2.rectangle(),cv2.ellipse() cv2. cv2.putText() )blog.csdn.net
reshapenumpy.reshape - NumPy v1.19 Manualnumpy.org
第四节:Image Operations
功能:图片矩阵块的理解,复制
#Image Operations
#功能:图片矩阵块的理解,复制
import cv2
import numpy as np
img = cv2.imread('watch.jpg',cv2.IMREAD_COLOR)#读取图片,引号内为图片路径
#cv2.IMREAD_GRAYSCALE = 0;灰度图
#cv2.IMREAD_COLOR = 1;彩色图
#cv2.IMREAD_UNCHANGED = -1;原图
img[55,55] = [255,255,255]
px = img[55,55]
img[200:350, 200:350] = [255,255,255]#原图片【长(像素),宽(像素)】为白色
watch_face = img[37:111, 107:194]#将原图中【长(像素),宽(像素)】复制
img[0:74, 0:87] = watch_face#111-37=74,194-107=87
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
第五节:Image arithmetics and Logic
功能:三种图像叠加的形式
#Image arithmetics and Logic
#功能:三种图像叠加的形式
import cv2
import numpy as np
img1 = cv2.imread('3D-Matplotlib.png')#读取图片,引号内为图片路径
img2 = cv2.imread('mainsvmimage.png')
#尝试三种方法
#add = img1 + img2#去除背景色后,将前景色进行重叠
#add = cv2.add(img1, img2)#将图片每个单元格的值相加,如(155,211,79)+(50,170,200)=(205,381,279)=(205,255,255)
add = cv2.addWeighted(img1, 0.6, img2, 0.4, 0)
cv2.imshow('add', add)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
参考链接:opencv中addWeighted()函数用法总结(05)_久久乐-CSDN博客_addweightedblog.csdn.net
功能:二值化、掩膜
#Image arithmetics and Logic
#功能:二值化、掩膜
import cv2
import numpy as np
img1 = cv2.imread('3D-Matplotlib.png')#读取图片,引号内为图片路径
img2 = cv2.imread('mainlogo.png')
rows,cols,channels = img2.shape#将图(长、宽、位深)复制到变量中
roi = img1[0:rows,0:cols]#将img2中信息复制到img1指定位置
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)#将图片转为灰度图
ret,mask = cv2.threshold(img2gray, 220, 255, cv2.THRESH_BINARY_INV)#将图像进行二值化
#注意:如果采用彩色图像进行计算会得到彩色效果,而不是预期的二值化结果
mask_inv = cv2.bitwise_not(mask)#对图像进行非运算
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)#对图像进行与运算
img2_fg = cv2.bitwise_and(img2, img2, mask=mask)
dst = cv2.add(img1_bg, img2_fg)#将图像灰度进行相加
img1[0:rows,0:cols] = dst#将img1中选定区域复制给dst
#cv2.imshow('res',img1)#将img2复制到img1指定位置
#cv2.imshow('mask_inv',mask_inv)#将img2二值化后的图像进行非运算
cv2.imshow('img1_bg',img1_bg)#将img1中指定roi区域与img2进行与运算
#cv2.imshow('img2_fg',img2_fg)#将img2本身进行与运算,注意模式
cv2.imshow('dst',dst)#显示img1中指定roi区域图像
#cv2.imshow('mask', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
参考链接:【python】opencv库中cv2.threshold()函数的参数与返回值www.jianshu.comOpenCV之bitwise_and、bitwise_not等图像基本运算及掩膜_小伟锅的博客-CSDN博客_bitwise_notblog.csdn.net
第六节:Thresholding(阈值)
功能:几种常用二值化结果对比及使用方法
#Thresholding
#功能:几种常用二值化结果对比及使用方法
import cv2
import numpy as np
img = cv2.imread('bookpage.jpg')#读取图片,引号内为图片路径
retval, threshold = cv2.threshold(img, 20, 255, cv2.THRESH_BINARY)#将图片二值化
grayscaled = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#将图片变为灰度图
retval2, threshold2 = cv2.threshold(grayscaled, 20, 255, cv2.THRESH_BINARY)#将灰度图二值化
gaus = cv2.adaptiveThreshold(grayscaled, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY, 115, 1)#将灰度图自适应二值化
retval2, otsu = cv2.threshold(grayscaled, 125, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)#大津法二值化
cv2.imshow('original',img)#彩色原图
cv2.imshow('threshold', threshold)#彩色原图二值化
cv2.imshow('threshold2', threshold2)#灰度图二值化
cv2.imshow('gaus', gaus)#自适应二值化
cv2.imshow('otsu', otsu)#大津法二值化
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
参考链接:opencv阈值处理--threshold函数、自适应阈值处理、Otsu处理(大津法) - pheasant - 博客园www.cnblogs.com
第七节:Color Filtering(颜色滤波器)
功能:基于摄像头的掩膜、HSV提取
图像# Color Filtering
#功能:基于摄像头的掩膜、HSV提取
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while True:
_, frame = cap.read()
# 颜色空间转换
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)#HSV:色度(H)、饱和度(S)、亮度(V)
# hsv( hue sat value )
lower_red = np.array([0,100,100])
upper_red = np.array([50,200,200])
# get mask
mask = cv2.inRange(hsv, lower_red, upper_red)
# detect red
res = cv2.bitwise_and(frame, frame, mask = mask)
cv2.imshow('frame',frame)#显示原图
cv2.imshow('mask',mask)#显示掩膜图像
cv2.imshow('res',res)#经过位与运算后的图像
# Press esc on keyboard to exit
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
cap.release()
输出结果:
参考链接:
(1)利用掩膜(mask)进行“与”操作,即掩膜图像白色区域是对需要处理图像像素的保留,黑色区域是对需要处理图像像素的剔除,其余按位操作原理类似只是效果不同而已。inRange()函数、cvtColor()函数、createTrackbar()函数_qq_37791134的博客-CSDN博客_inrangeblog.csdn.net
(2)k = cv2.waitKey(5) & 0xFF解释品颜完月:OpenCV&Python 编程中对此语句的理解:if cv2.waitKey(25) & 0xFF == 27zhuanlan.zhihu.com
第八节:Blurring and Smoothing(模糊和平滑)
功能:几种滤波效果的介绍
# Blurring and Smoothing
#功能:几种滤波效果的介绍
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while True:
_, frame = cap.read()
# 颜色空间转换
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)#HSV:色度(H)、饱和度(S)、亮度(V)
# hsv( hue sat value )
lower_red = np.array([0,100,100])
upper_red = np.array([50,200,200])
# get mask
mask = cv2.inRange(hsv, lower_red, upper_red)
# detect red
res = cv2.bitwise_and(frame, frame, mask = mask)
kernel = np.ones((15,15), np.float32)/225
smoothed = cv2.filter2D(res, -1, kernel)#2D滤波器
blur = cv2.GaussianBlur(res, (15,15), 0)#高斯模糊滤波
median = cv2.medianBlur(res,15)#中值滤波器
bilateral = cv2.bilateralFilter(res, 15, 75, 75)#双边滤波
cv2.imshow('frame',frame)#显示原图
#cv2.imshow('mask',mask)#显示掩膜图像
cv2.imshow('res',res)#经过位与运算后的图像
cv2.imshow('smoothed',smoothed)#2D滤波器
cv2.imshow('blur',blur)#高斯模糊滤波
cv2.imshow('median',median)#中值滤波器
cv2.imshow('bilateral',bilateral)#双边滤波
# Press esc on keyboard to exit
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
cap.release()
输出结果:原图、位与运算、2D滤波、高斯模糊、中值滤波、双边滤波
参考链接:Python-OpenCV中的filter2D()函数 - Rogn - 博客园www.cnblogs.com
1、2D滤波器:cv2.filter2D()
2、均值滤波:blur()
3、方框滤波:boxFilter()
4、高斯模糊:GaussianBlur()
5、中值滤波:medianBlur()
6、双边滤波:bilateralFilter()
7、联合双边滤波:xmingproc.jointBilateralFilter()
8、导向滤波:ximgproc.guidedFilter()五、图像平滑、滤波_嘻哈吼嘿呵的博客-CSDN博客_cv2.filter2d(img,-1,kernel),-1blog.csdn.net
第九节:Morphological Transformations(形态变换)
功能:腐蚀、膨胀、形态学变换-开环、闭环
# Morphological Transformations
# 功能:腐蚀、膨胀、形态学变换-开环、闭环
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while True:
_, frame = cap.read()
# 颜色空间转换
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)#HSV:色度(H)、饱和度(S)、亮度(V)
# hsv( hue sat value )
lower_red = np.array([0,100,100])
upper_red = np.array([50,200,200])
# get mask
mask = cv2.inRange(hsv, lower_red, upper_red)
# detect red
res = cv2.bitwise_and(frame, frame, mask = mask)
kernel = np.ones((5,5), np.uint8)#定义结构元素
erosion = cv2.erode(mask, kernel, iterations = 1)#腐蚀
dilation = cv2.dilate(mask, kernel, iterations = 1)#膨胀
#形态学-开运算,先腐蚀,再膨胀,可清除一些小东西(亮的),放大局部低亮度的区域
opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
#形态学-闭运算,先膨胀,再腐蚀,可清除小黑点
closing = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
## It is the difference between input image and Opening of the image
#cv2.imshow('Tophat', tophat)
## It is the difference between the closing of the input image and input image
#cv2.imshow('Blackhat', blackhat)
cv2.imshow('frame',frame)#显示原图
cv2.imshow('res',res)#经过位与运算后的图像
cv2.imshow('erosion',erosion)#腐蚀
cv2.imshow('dilation',dilation)#膨胀
cv2.imshow('opening',opening)#形态学-开运算
cv2.imshow('closing',closing)#形态学-闭运算
# Press esc on keyboard to exit
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
cap.release()
输出结果:原图、位与、腐蚀、膨胀、开运算、闭运算
参考链接:
(1)腐蚀、膨胀腐蚀和膨胀动画演示_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.com
(2)形态学opencv -- morphologyEx 开运算、闭运算、形态学梯度、顶帽、黑帽www.cnblogs.com
MORPH_ERODE = 0, //腐蚀
MORPH_DILATE = 1, //膨胀
MORPH_OPEN = 2, //开操作
MORPH_CLOSE = 3, //闭操作
MORPH_GRADIENT = 4, //梯度操作
MORPH_TOPHAT = 5, //顶帽操作
MORPH_BLACKHAT = 6, //黑帽操作
第十节:Edge Detection and Gradients(边缘检测和梯度)
功能:
# Edge Detection and Gradients
# 功能:边缘检测-拉普拉斯方法、索贝尔方法;目标检测
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while True:
_, frame = cap.read()
laplacian = cv2.Laplacian(frame, cv2.CV_64F)#边缘检测算子-拉普拉斯
sobelx = cv2.Sobel(frame,cv2.CV_64F, 1, 0, ksize=5)#边缘检测算子-索贝尔(X)
sobely = cv2.Sobel(frame,cv2.CV_64F, 0, 1, ksize=5)#边缘检测算子-索贝尔(Y)
edges = cv2.Canny(frame, 100, 200)#目标检测-canny
cv2.imshow('original', frame)#原图
cv2.imshow('laplcian', laplacian)#拉普拉斯
cv2.imshow('sobelx', sobelx)#索贝尔X
cv2.imshow('sobely', sobely)#索贝尔Y
cv2.imshow('edges', edges)#canny
# Press esc on keyboard to exit
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
cap.release()
输出结果:原图、拉普拉斯、索贝尔X、索贝尔Y、canny
参考链接:
(1)边缘检测-sobelopencv边缘检测sobel算子 - core! - 博客园www.cnblogs.com
(2)边缘检测-拉普拉斯opencv边缘检测-拉普拉斯算子 - core! - 博客园www.cnblogs.com
(3)目标检测-cannyopencv目标检测之canny算法 - core! - 博客园www.cnblogs.com