目录
基础常识:
一、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 cv2img = 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 cv2capture = 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 cv2img = 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 cv2img = 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 npcapture = 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_INVret,th = cv2.threshold(img,127,255,cv2.THRESH_BINARY)cv2.imshow("thresh",th)cv2.waitKey(0)
2.自适应阙值
cv2.adaptiveThreshold()自适应阙值会每次取图片的一小部分计算阙值,这样图片不同区域的阙值就不尽相同
import matplotlib.pyplot as pltimg = 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 cv2img = 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 nprows,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)#利用仿射变换实现Mdst = cv2.warpAffine(img,M,(cols,rows))cv2.imshow("rotation",dst)cv2.waitKey(0)
七、绘画功能
前情提要:
img:要绘制形状的图片
color:绘制的颜色
彩色图就传入BGR的一组值,如蓝色就是(255,0,0)
灰度图,传入一个灰度值就行
thickness:线宽,默认为1,对于矩形/圆之类的封闭形状而言,传入-1表示填充形状
通用模块,下面不再一一列出
import cv2import numpy as npimport matplotlib.pyplot as pltcv2.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的画,多边形不闭合。