参考:https://www.cnblogs.com/zlel/p/9267629.html
1.图片加载
cv2.imread(filename, flags=None)
2、显示图片
cv2.imshow(winname, mat)
winname 图口名称
mat ,已加载图片的变量名
3、图像显示窗口创建与销毁,
cv2.namedWindow(窗口名,属性) 创建一个窗口
属性—指定窗口大小模式:
cv2.WINDOW_AUTOSIZE:根据图像大小自动创建大小
cv2.WINDOW_NORMAL:窗口大小可调整
cv2.destoryAllWindows(窗口名) 删除任何建立的窗口
如图不设定直接调用imshow窗口是不可改变的
4、图片宽、高、通道数获取
img.shape 返回图像高(图像矩阵的行数)、宽(图像矩阵的列数)和通道数3个属性组成的元组,若图像是非彩色图,则只返回高和宽组成的元组。
5、图像像素数目和图像数据类型的获取
图像矩阵img的size属性和dtype分别对应图像的像素总数目和图像数据类型。一般情况下,图像的数据类型是uint8。
6、生成指定大小的空图像
import numpy as np
imgFix = np.zeros((300, 500, 3), np.uint8)
# imgFix = np.zeros((300,500),np.uint8)
7、访问和操作图像像素
通过操作vc对像OpenCV中图像矩阵的顺序是B、G、R。可以直接通过坐标位置访问和操作图像像素。
numb = img[50,100] #读取坐标点的像素值
print( numb) #[231 220 222]
numb3 = img[0:100, 100:200] # 读取像素块的值
print (numb3)
img[50,100] = (0,0,255) #设定坐标点的像素值
8、分开访问和修改图像某一通道像素值
numb2 = img[50, 100,0] # 读取坐标点的指定通道的像素值
print (numb2)#(231)
imgFix[0:100, 100:200, 0] = 255 #从坐标点0,100 到100,200 都的像素块的第一通道都设成255
imgFix[100:200, 200:300, 1] = 255
imgFix[200:300, 300:400, 2] = 255
cv2.imshow("change", imgFix)
9、 图像三通道分离和合并
分离图像通道可以使用cv2中的split函数,合并使用merge函数。
10、 在图像上输出文字
使用putText函数在图片上输出文字,函数原型:
putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)
参数:
img: 图像
text:要输出的文本
org: 文字的起点坐标
fontFace: 字体
fontScale: 字体大小
color: 字体颜色
thickness: 字图加粗
11、 图像缩放
缩放使用cv2.resize()函数,resize函数里的size第一个是宽(列),第二个是高(行)
cv2.resize(img, (200, 100))
12、图片裁剪
cropped = img[0:128, 0:512] # 裁剪坐标为[y0:y1, x0:x1]
cv2.imwrite("./data/cut/cv_cut_thor.jpg", cropped)
import cv2
# 加载图片110.jpg
img = cv2.imread("d:/temp/material/video/1/110.jpg")
# 生成灰色图片,第二个参数"0"表示灰度图片
imgGrey = cv2.imread("d:/temp/material/video/1/110.jpg", 0)
# 展示原图
cv2.imshow("img", img)
# 展示灰色图片
cv2.imshow("imgGrey", imgGrey)
#图片宽、高、通道数获取
sp1 = img.shape
sp2 = imgGrey.shape
print(sp1)#(720, 1270, 3)
print(sp2)#(720, 1270)
#图像像素数目和图像数据类型的获取
imgSize = img.size
print(imgSize)#2743200
ty = img.dtype
print(ty)#uint8
#生成指定大小的空图像
imgZero = np.zeros(img.shape, np.uint8)
imgFix = np.zeros((300, 500, 3), np.uint8)
cv2.imshow("imgZero", imgZero)
cv2.imshow("imgFix", imgFix)
#访问和操作图像像素
numb = img[50,100] #读取坐标点的像素值
print numb
numb3 = img[0:100, 100:200] # 读取像素块的值
print (numb3)
iimgFix[50, 100] = (0, 0, 255) # 设定坐标点的像素值
cv2.imshow("change", imgFix)
imgFix[0:100, 100:200, 0] = 255 #从坐标点0,100 到100,200 都的像素块的第一通道都设成255
imgFix[100:200, 200:300, 1] = 255
imgFix[200:300, 300:400, 2] = 255
cv2.imshow("change", imgFix)
#更改图像某一矩形区域的像素值
img[0:50,1:100] = (0,0,255)
cv2.imshow("img",img)
#图像三通道分离和合并
b , g , r = cv2.split(img)
#也可以分开写
# b = cv2.split(img)[0]
# g = cv2.split(img)[1]
# r = cv2.split(img)[2]
merged = cv2.merge([b,g,r])
cv2.imshow("Blue",b)
cv2.imshow("Green",g)
cv2.imshow("Red",r)
cv2.imshow("Merged",merged)
#调整图片大小
imgg = cv2.resize(img, (200, 100))
cv2.imshow("imgg", imgg)
# 等待图片的关闭
cv2.waitKey()
# 保存灰色图片
cv2.imwrite("Copy.jpg", imgGrey)
VideoCapture 读取视频
一、语法:cap = cv2.VideoCapture(0)
说明:参数0表示默认为笔记本的内置第一个摄像头,如果需要读取已有的视频则参数改为视频所在路径路径,例如:cap=cv2.VideoCapture(‘video.mp4’)
二、语法:cap.isOpened()
说明:判断视频对象是否成功读取,成功读取视频对象返回True。
三、语法:ret,frame = cap.read()
说明:按帧读取视频,返回值ret是布尔型,正确读取则返回True,读取失败或读取视频结尾则会返回False。frame为每一帧的图像,这里图像是三维矩阵,即frame.shape = (640,480,3),读取的图像为BGR格式。
四、语法:key = cv2.waitKey(1)
说明:等待键盘输入,参数1表示延时1ms切换到下一帧,参数为0表示显示当前帧,相当于暂停。
将一副图像从rgb颜色空间转换到hsv颜色空间
hsv = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2HSV)
利用cv2.inRange函数设阈值,去除背景部分
mask = cv2.inRange(hsv, lower_red, upper_red)
第一个参数:hsv指的是原图
第二个参数:lower_red指的是图像中低于这个lower_red的值,图像值变为0
第三个参数:upper_red指的是图像中高于这个upper_red的值,图像值变为0
而在lower_red~upper_red之间的值变成255
中值滤波medianBlur
中值滤波对消除椒盐噪声非常有效,能够克服线性滤波器带来的图像细节模糊等弊端,能够有效保护图像边缘信息,是非常经典的平滑噪声处理方法。
medianBlur(InputArray src, OutputArray dst, int ksize)
参数解释:
. InputArray src: 输入图像,图像为1、3、4通道的图像,当模板尺寸为3或5时,图像深度只能为CV_8U、CV_16U、CV_32F中的一个,如而对于较大孔径尺寸的图片,图像深度只能是CV_8U。
. OutputArray dst: 输出图像,尺寸和类型与输入图像一致,可以使用Mat::Clone以原图像为模板来初始化输出图像dst
. int ksize: 滤波模板的尺寸大小,必须是大于1的奇数,如3、5、7……
cv2.findContours()函数 //查找轮廓
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])
第一个参数是寻找轮廓的图像;
第二个参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):
cv2.RETR_EXTERNAL 表示只检测外轮廓
cv2.RETR_LIST 检测的轮廓不建立等级关系
cv2.RETR_CCOMP 建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
cv2.RETR_TREE 建立一个等级树结构的轮廓。
第三个参数method为轮廓的近似办法
cv2.CHAIN_APPROX_NONE 存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS 使用teh-Chinl chain 近似算法
返回值
cv2.findContours()函数返回两个值,一个是轮廓本身,还有一个是每条轮廓对应的属性
cv2.boundingRect(cnt)
生成一个最小的矩形,把找到的轮廓包起来。
这个函数很简单,cnt是一个轮廓点集合,也就是它的参数,可以通过cv2.findContours获取;返回四个值,分别是x,y,w,h;
x,y是矩阵左上点的坐标,w,h是矩阵的宽和高
cv2.rectangle 这个函数的作用是在图像上绘制一个简单的矩形。
参数解释
第一个参数:img是原图
第二个参数:(x,y)是矩阵的左上点坐标
第三个参数:(x+w,y+h)是矩阵的右下点坐标
第四个参数:(0,255,0)是画线对应的rgb颜色
第五个参数:2是所画的线的宽度