python+opencv教程7_树莓派 OpenCV_Python基础教程---1至10

https://www.bilibili.com/video/av95503343?p=1​www.bilibili.com

中文文字翻译:太绝了史上最全的OpenCV入门教程_qq_38660394的博客-CSDN博客​blog.csdn.netv2-2a5027b5bff83f50a189c6146b4f7548_ipico.jpg

第一节: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.netv2-85640688e1fd892b6b297356706c874c_ipico.jpg

第三节: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.netv2-3d6f0b0cdd7632882b0ca6d20143ea66_ipico.jpg

reshapenumpy.reshape - NumPy v1.19 Manual​numpy.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博客_addweighted​blog.csdn.netv2-b981620e8dfd0e3f14849e5d8240edf6_ipico.jpg

功能:二值化、掩膜

#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.comv2-3af774a119fb73718ed8d9d01b54b685_ipico.jpgOpenCV之bitwise_and、bitwise_not等图像基本运算及掩膜_小伟锅的博客-CSDN博客_bitwise_not​blog.csdn.netv2-b981620e8dfd0e3f14849e5d8240edf6_ipico.jpg

第六节: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.comv2-c27b34efa7334d4999ab471d6b0571cf_180x120.jpg

第七节: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博客_inrange​blog.csdn.netv2-2a5027b5bff83f50a189c6146b4f7548_ipico.jpg

(2)k = cv2.waitKey(5) & 0xFF解释品颜完月:OpenCV&Python 编程中对此语句的理解:if cv2.waitKey(25) & 0xFF == 27​zhuanlan.zhihu.comv2-ba4b8debdb5995a33ba8b26a18e407c8_180x120.jpg

第八节: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.comv2-e8eed8289ba901bf4bf32c52bc48d062_180x120.jpg

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),-1​blog.csdn.netv2-3d6f0b0cdd7632882b0ca6d20143ea66_ipico.jpg

第九节: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)腐蚀、膨胀腐蚀和膨胀动画演示_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.comv2-0076a954848300915cc6a8ca729332a7_180x120.jpg

(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.comv2-1ceb27b3521c0b16005924bd8ea1b9a6_180x120.jpg

(2)边缘检测-拉普拉斯opencv边缘检测-拉普拉斯算子 - core! - 博客园​www.cnblogs.comv2-1a4b777082a0044a31f3615ea1a5e7fa_180x120.jpg

(3)目标检测-cannyopencv目标检测之canny算法 - core! - 博客园​www.cnblogs.comv2-54e41dd4094285591030bc98e46f896f_180x120.jpg

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值