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的画,多边形不闭合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值