当前位置:首页 » 《我的小黑屋》 » 正文

python-OpenCV基础

20 人参与  2024年12月07日 08:01  分类 : 《我的小黑屋》  评论

点击全文阅读


目录

基础常识:

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


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/197372.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1