python-OpenCV基础
目录
基础常识:
一、OpenCV图片函数
1.cv2.imread()读入图片
2.cv2.imshow()显示图片
3.cv2.imwrite()保存图片
二、OpenCV摄像头有关函数
1.打开摄像头
2.获取、改变摄像头属性
3.播放本地视频:
三、图像的基本操作
1.获取和修改像素值:
2.获取图片的属性
img.shape、img.dtype、img.size
3.ROI(截图)
四、颜色的空间转换
1.颜色空间转换
2.对特定颜色物体追踪
五、阙值分割—两类值
1.固定阙值分割
2.自适应阙值
六、图像几何变换
1.缩放图片
2.镜像反转图片
3.平移图片
4.旋转图片
七、绘画功能
1.画线
2.画矩形
3.画圆
4.画椭圆
5.画多边形
基础常识:
电脑上图片以RGB颜色模式显示,在opencv中以B-G-R通道顺序存储的,灰度图只是一个通道
一、OpenCV图片函数
1.cv2.imread()读入图片
import cv2
img = cv2.imread("l.jpg",0)
#参数1:图片路径;若图片放在当前文件夹下,直接"l.jpg",否则需要给出绝对路径,如'D:\OpenCVSamples\lena.jpg'
#参数2:读入方式;彩色图:1;灰度图:0;包含透明通道的彩色图:-1
2.cv2.imshow()显示图片
cv2.imshow("lena",img)
#参数1:窗口名字
#参数2:要显示的图片,在上一步读入图片中已经完成
cv2.waitKey(0)#让程序暂停
#参数:程序暂停时间,时间一到,会继续执行接下来的程序
#传入0表示一直等待
当图片比较大时,先用cv2.namedWindow()创建一个窗口,之后再显示图片:
cv2.namedWindow("lena2",cv2.WINDOW_NORMAL)
#参数1:窗口名字
#参数2:默认值,表示窗口大小自适应图片
cv2.imshow("lena2",img)
cv2.waitKey(0)
3.cv2.imwrite()保存图片
cv2.imwrite("lena_gray.jpg",img)
#参数1:包括后缀名的文件名
#参数2:需要保存的图片
二、OpenCV摄像头有关函数
1.打开摄像头
import cv2
capture = cv2.VideoCapture(0)
#0表示摄像头的编号,如果电脑上有两个摄像头,访问第二个摄像头就可以传入1,以此类推
while True:
ret,frame = capture.read()#获取一帧
#ret是一个布尔值,表示当前这一帧是否获取正确
#frame为这一帧的图
#cv2.cvtColor()用来转换颜色,这里将彩色图转成灰度图。
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#显示图片
#参数1:窗口名称;参数2:要显示的图片
cv2.imshow("frame",gray)
if cv2.waitKey(1) == ord("q"):
break
2.获取、改变摄像头属性
使用cap.get(propId),参数为0~18的数字,代表不同的属性
width,height = capture.get(3),capture.get(4)
#获取捕获的分辨率
print(width,height)
#修改参数
capture.set(cv2.CAP_PROP_FRAME_WIDTH,width*2)
capture.set(cv2.CAP_PROP_FRAME_WIDTH,height*2)
3.播放本地视频:
跟打开摄像头一样,如果把摄像头的编号换成视频的路径就可以播放本地视频了。回想一下cv2.waitKey()
,它的参数表示暂停时间,所以这个值越大,视频播放速度越慢,反之,播放速度越快,通常设置为 25 或 30。
#播放本地视频
capture = cv2.VideoCapture("demo_video.mp4")
#使用cv2.VideoCapture()函数完成摄像头的初始化之后,为了防止初始化发生错误,用cv2.VideoCapture.isOpened()函数来检查初始化是否成功。
while(capture.isOpened()):
ret,frame = capture.read()
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow("frame",gray)
if cv2.waitKey(30) == ord("q"):
break
三、图像的基本操作
1.获取和修改像素值:
#读入一张图片
import cv2
img = cv2.imrad("lena.jpg")
#参数存放,图片的地址
px = img[100,90]#里面的数是图片的行列坐标
print(px)
#只获取蓝色blue通道的值
px_blue = img[100,90,0]
print(px_blue)
#修改像素值
img[100,90] = [255,255,255]
print(img[100,90])
2.获取图片的属性
img.shape、img.dtype、img.size
print(img.shape)#(263,247,3),行数、列数、通道数
print(img.dtype)#获取图像数据类型
print(img.size)#获取图像总像素数
3.ROI(截图)
img[100:200,115:188]
face = img[100:200,115:188]
cv2.imshow("face",face)
cv2.waitKey(0)
四、颜色的空间转换
1.颜色空间转换
颜色模型转换:cv2.cvtColor() 函数进行颜色转换,常用BGR到Gray,BGR到HSV
得到某种颜色在HSV下的值,将BGR的值用cvtColor()得到
转换为灰度图:img_gray = cv2.cvtColor(img,cv2.COLOR_BGR3GRAY)
灰度化最常用的公式:gray=R*0.299+G*0.587+B*0.114
import cv2
img = cv22.imread("lena.jpg")
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow("img",img)
cv2.imshow("gray",img_gray)
cv2.waitKey(0)
2.对特定颜色物体追踪
从BGR转换到HSV:COLOR_BGR2HSV
import numpy as np
capture = cv2.VideoCapture(0)
#确定颜色范围
lower_blue = np.array([100,110,110])
upper_blue = np.array([130,255,255])
while True:
ret,frame = capture.read()
#从BGR转到HSV,得到某颜色在HSV下的值。HSV模型颜色模型常用于颜色识别
hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
#介于颜色范围之间的都为白色,其余为黑色
mask = cv2.inrange(hsv,lower_blue,upper_blue)
#只保留原图中蓝色部分
res = cv2.bitwise_and(frame,frame,mask=mask)
cv2.imshow("frame",frame)
cv2.imshow("mask",mask)
cv2.imshow("res",res)
if cv2.waitKey(1) == ord("q"):
break
关于如何得到lower_blue与upper_blue的范围:
我们先把标准蓝色的BGR值用cvtColor()转换下:
blue = np.unit8([[[255,0,0]]])
hsv_blue = cv2.cvtColor(blue,cv2.COLOR_BGR2HSV)
print(hsv_blue)#[[[120 255 255]]]
五、阙值分割—两类值
1.固定阙值分割
将像素点值大于阙值变成一类值,小于阙值变成另一类值
cv2.threshold()函数实现阙值分割
import cv2
#灰度图读入
img = cv2.imread("gradient.jpg",0)
#阙值分割
#参数1:要处理的原题,一般是灰度图
#参数2:设定的阙值
#参数3:对于THRESH_BINARY、THRESH_BINARY_INV阙值方法所选用的最大阙值,一般为255
#参数4:阙值的方式,主要有5种:THRESH_BINARY、THRESH_BINARY_INV、THRESH_TRUNC、THRESH_TOZERO、THRESH_TOZERO_INV
ret,th = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
cv2.imshow("thresh",th)
cv2.waitKey(0)
2.自适应阙值
cv2.adaptiveThreshold()自适应阙值会每次取图片的一小部分计算阙值,这样图片不同区域的阙值就不尽相同
import matplotlib.pyplot as plt
img = cv2.imread("sudoku.jpg",0)
#自适应阙值
#参数1:要处理的图像、
#参数2:最大阙值,一般为255
#参数3:小区域阙值计算方式、ADAPTIVE_THRESH_MEAN_C:小区域内取均值ADAPTIVE_THRESH_GAUSSIAN_C:小区域内加权求和,权重是个高斯核
#参数4:阈值方法,只能使用THRESH_BINARY、THRESH_BINARY_INV,具体见前面所讲的阈值方法
#参数5:小区域的面积,如 11 就是 11*11 的小块
#参数6:最终阈值等于小区域计算出的阈值再减去此值
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,4)
th3 = cv2.adaptiveThreshold(img,255,ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,17,6)
#图片显示
#显示标题
titles = ["Original","Global(v = 127)","Adaptive Mean","Adaptive Gaussian"]
#显示的图片
images = [img,th1,th2,th3]
#分别进行展示
for i in range(4):
plt.subplot(2,2,i+1)#同一窗口下两行两列显示
plt.imshow(images[i],"gray")#参数:要显示的图片、参数
plt.title(titles[i],fontsize=8)
plt.xticks([]),plt.yticks([])#隐藏坐标轴
plt.show()
六、图像几何变换
1.缩放图片
cv2.resize()函数实现,既可以按照比例缩放,也可以按照指定大小缩放
import cv2
img = cv2.imread('drawing.jpg')
#按照指定的宽度高度缩放图片
res = cv2.resize(img,(132,150))
#按照比例缩放,如x,y轴均放大一倍
res2 = cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_LINEAR)
cv2.imshow("shrink",res)#参数:要显示的窗口名称,要显示的图片
cv2.imshow("zoom",res2)
cv2.waitKey(0)
2.镜像反转图片
cv2.flip()函数。参数1:要进行操作的图片;参数2:参数2<0水平垂直反转;参数2=0沿x轴垂直反转;参数2>0沿y轴水平反转
dst = cv2.flip(img,1)
3.平移图片
平移通过仿射变换函数cv2.warpAffine()实现的,需要构建矩阵
import numpy as np
rows,cols = img .shape[:2]
#构建平移矩阵,需要是numpy的float32类型
M = np.float32([[1,0,100],[0,1,50]])#x轴平移100,y轴平移50
#用仿射变换实现平移
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow("shift",dst)
cv2.waitKey(0)
4.旋转图片
旋转和平移一样,需要通过仿射变换实现,因此也需要定义一个变换矩阵,这时,opencv直接提供了cv2.getRotationMatrix2D()函数来生成这个矩阵,仿射变换仍用函数cv2.warpAffine()函数
#图片旋转45°并缩小一般
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 0.5)
#利用仿射变换实现M
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow("rotation",dst)
cv2.waitKey(0)
七、绘画功能
前情提要:
img:要绘制形状的图片
color:绘制的颜色
彩色图就传入BGR的一组值,如蓝色就是(255,0,0)
灰度图,传入一个灰度值就行
thickness:线宽,默认为1,对于矩形/圆之类的封闭形状而言,传入-1表示填充形状
通用模块,下面不再一一列出
import cv2
import numpy as np
import matplotlib.pyplot as plt
cv2.imshow("img",img)
cv2.waitKey(0)
1.画线
只需要指出起点和终点坐标就行,cv2.line()函数
#创建一副黑色图片
img = np.zeros((512,512,3),np.unit8)
#np.zeros(size,type).参数1:数组形状尺寸;参数2:新数组的数据类型
#画一条线宽为5的蓝色直线
#参数2:起点
#参数3:终点
cv2.line(img,(0,0),(512,512),(255,0,0),5)
2.画矩形
画矩形需要知道左上角和右下角的坐标,cv2.rectangle()函数
#画一个绿色边框的矩形,参数2:左上角坐标,参数3:右下角坐标
cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)
3.画圆
需要指定圆心和半径,cv2.circle()函数.注意:最后一个参数线宽=-1,表示为实心的
cv2.circle(img,(477,63),63,(0,0,255),-1)
4.画椭圆
椭圆需要指定的参数比较多,利用函数cv2.ellipse()函数
#在圆中心画一个填充的半圆
cv2.ellopse(img,(256,256),(100,50),0,0,180,(255,0,0),-1)
#参数2:椭圆中心坐标
#参数3:x轴与y轴的长度
#参数4:angle--椭圆旋转角度
#参数5:startAngle--椭圆的起始角度
#参数6:endAngle--椭圆的结束角度
5.画多边形
相当于相邻两点之间画直线
opencv中需要先将多边形的顶点坐标需要变成顶点数✖1✖2维的矩阵
cv2.polylines()绘制多条直线
#定义四个顶点坐标
pts = np.array([[10,5],[50,10],[70,20],[20,30]],np.int32)
#顶点个数:4,矩阵变成4*1*2维
pts = pts.reshape((-1,1,2))
cv2.polylines(img,[pts],True,(0,255,255))
这段代码将 pts 变量调整为具有特定形状的数组。 pts.reshape((-1,1,2)) 将 pts 变量转换为一个三维数组,其中第一维的大小由原始数组中的元素数量自动计算,第二维和第三维的大小分别为 1 和 2。
如果函数cv2.polylines()的参数3是False的画,多边形不闭合。
作者:远山不远.