图像基础
cv2.imread('image.jpg',0)
读入图像
cv2.imshow('image',img)
显示图像
cv2.waitKey(0)
是一个键盘绑定函数
cv2.destroyAllWindows()
可以轻易删除任何建立的窗口
cv2.namedWindow('image')
命名窗口
cv2.imwrite('messigray.png',img)
保存一个图像
cv2.VideoCapture(0)
用摄像头捕获视频,设置成 1 或者其他的来选择别的摄像头
cv2.VideoWrite('output.avi',cv2.VideoWriter_fourcc(*'XVID'), 20.0, (640,480))
从文件中播放视频
cv2.VideoWriter('output.avi',cv2.cv.FOURCC(*'XVID'), 20.0, (640,480))
保存视频
cv2.cv.FOURCC(*'XVID')
cv2.cv.FOURCC(*'MJPG')
cv2.cv.FOURCC('M','J','P','G')
cv2.line(img,(x1,y1), (y2,y2), color, tickness, linetype)
画线
cv2.polylines(img, (x1,y1), (y2,y2), color, tickness, linetype)
可以被用来画很多条线
cv2.rectangle(img, (x1,y1), (y2,y2), color, tickness, linetype)
画矩形
cv2.circle(img, (x, y), r, color, tickness, linetype)
画圆
cv2.ellipse(img, (x1,y1), (longlength, shortlength), 0, 180(360), color, tickness, linetype)
画椭圆
cv2.putText(img,'OpenCV',(x,y), cv2.FONT_HERSHEY_SIMPLEX, fontsize, color, linetype=cv2.LINE_AA)
在图片上添加文字
cv2.setMouseCallback('image', cv2.EVENT_LBUTTONDBLCLK)
把鼠标当画笔
CV2鼠标事件:
['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY',
'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON',
'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY',
'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN',
'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK',
'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP',
'EVENT_MOUSEMOVE', 'EVENT_RBUTTONDBLCLK',
'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']
cv2.getTrackbarPos('R','image')
获取滑动条
第一个参数是滑动条的名字,第二个参数 是滑动条被放置窗口的名字,第三个参数是滑动条的默认位置。第四个参数是滑动条的最大值,第五个函数是回调函数
cv2.creatTrackbar('R','image',0,255,nothing)
创建滑动条
img.shape
可以获取图像的形状
img.size
可以返回图像的像素数目
img.dtype
返回的是图像的数据类型
cv2.split(img)
图像通道的拆分
img=cv2.merge(b,g,r)
图像通道的合并
cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
为图像扩边(填充)
这个函数包括如下参数:
• src 输入图像
• top, bottom, left, right 对应边界的像素数目。
•borderType 要添加那种类型的边界,类型如下 – cv2.BORDER_CONSTANT 添加有颜色的常数值边界,还需要下一个参数(value)。
cv2.BORDER_REFLECT 边界元素的镜像。比如: fedcba|abcdefgh|hgfedcb
cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT 跟上面一样,但稍作改动。例如: gfedcb|abcdefgh|gfedcba –
cv2.BORDER_REPLICATE 重复最后一个元素。例如: aaaaaa| abcdefgh|hhhhhhh
cv2.BORDER_WRAP 不知道怎么说了, 就像这样: cdefgh| abcdefgh|abcdefg
• value 边界颜色,如果边界的类型是 cv2.BORDER_CONSTANT
图像上的算术运算
cv2.add(np.uint8([250]), np.uint8([10]))
将两幅图像进行加法运算
cv2.addWeighted(img1, 0.8, img2, 0.1, 0)
图片混合:把两幅图混合在一起。第一幅图的权重是 0.8,第二幅图的权重是 0.1
cv2.bitwise_not(mask)
bitwise_and(roi,roi,mask = mask)
bitwise_or
bitwise_xor
AND,OR,NOT,XOR
按位运算
程序性能检测及优化
cv2.getTickCount()
检测程序效率
cv2.getTickFrequency()
返回时钟频率,或者说每秒钟的时钟数。
cv2.medianBlur()
做中值滤波
cv2.useOptimized()
查看优化是否被开启了
cv2.setUseOptimized()
开启优化。
图像处理
cv2.cvtColor(input_image,flag)
转换颜色空间:中 flag就是转换类型。
对于 BGR↔Gray 的转换,我们要使用的 flag 就是 cv2.COLOR_BGR2GRAY。
同样对于 BGR↔HSV的转换,我们用的 flag 就是 cv2.COLOR_BGR2HSV。
物体跟踪
cv2.inRange(hsv,lower_blue,upper_blue)
根据阈值构建掩模:输入图像、颜色阈值设置
cv2.bitwise_and(frame,frame,mask=mask)
对原图像和掩模进行位运算
几何变换
cv2.warpAffine(2x3)
和
cv2.warpPerspective(3x3)
变换函数
cv2.warpAffine 和 cv2.warpPerspective,使用这两个函数你可以实现所有类型的变换。cv2.warpAffine 接收的参数是 2 × 3 的变换阵,而cv2.warpPerspective 接收的参数是 3 × 3 的变换矩 阵。
cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_CUBIC)
扩展缩放只是改变图像的尺寸大小
cv2.INTER_AREA, 在扩展时推荐使用 v2.INTER_CUBIC(慢) 和v2.INTER_LINEAR。
默认情况下所有改变图像尺寸大小的操作使用的插值方法都是 cv2.INTER_LINEAR。
cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6)
旋转:这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
cv2.getAffineTransform(pts1,pts2)
仿射变换
cv2.getPerspectiveTransform(pts1,pts2)
透视变换
仿射变换:
在仿射变换中,原图中所有的平行线在结果图像中同样平行。为了创建这个矩阵我们需要从原图像中找到三个点以及他们在输出图像中的位置。然后
cv2.getAffineTransfor()
会创建一个 2×3 的矩阵,最后这个矩阵会被传给函数
cv2.warpAffine()
透视变换:
对于视角变换,我们需要一个 3×3 变换矩阵。在变换前后直线还是直线。要构建这个变换矩阵,你需要在输入图像上找 4 个点,以及他们在输出图像上对应的位置。这四个点中的任意三个都不能共线。这个变换矩阵可以有函数
cv2.getPerspectiveTransform()
构建,然后把这个矩阵传给函数
cv2.warpPerspective()
图像阈值:
cv2.threshhold(img, 127, 255, cv2.THRESH_BINARY)
简单阈值
第二个参数就是用来对像素值进行分类的阈值。第三个参数就是当像素值高于(有时是小于)阈值时应该被赋予的新的像素值。
提供了多种不同的阈值方法,这是有第四个参数来决定的。这些方法包括:
• cv2.THRESH_BINARY
• cv2.THRESH_BINARY_INV
• cv2.THRESH_TRUNC
• cv2.THRESH_TOZERO
• cv2.THRESH_TOZERO_INV
自适应阈值:
Adaptive Method- 指定计算阈值的方法。
cv2.ADPTIVE_THRESH_MEAN_C:阈值取自相邻区域的平均值
cv2.ADPTIVE_THRESH_GAUSSIAN_C:阈值取值相邻区域的加权和,权重为一个高斯窗口。
Block Size -邻域大小(用来计算阈值的区域大小)。
C – 这就是是一个常数,阈值就等于的平均值或者加权平均值减去这个常数。
cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 11, 2)
自适应阈值:阈值取自相邻区域的平均值
cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 11, 2)
自适应阈值:阈值取值相邻区域的加权和,权重为一个高斯窗口
Otsu’s 二值化:
cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
Otsu’s 二值化
cv2.GaussianBlur(img,(5,5),0)
Otsu’s 二值化(高斯)
图像平滑(图像滤波):
cv.filter2D(img,-1,np.ones((5,5),np.float32)/25)
对一幅图像进行2D卷积操作:5×5平均滤波器核
cv2.blur(img, 高斯核)
和
cv2.boxFilter(img, 高斯核)
平均模糊
cv2.GaussianBlur(img, 高斯核, 标准差)
高斯模糊
cv2.getGaussianKernel()
构建高斯核
cv2.medianBlur(img,5)
中值模糊:卷积核
cv2.bilateralFilter(img,9,75,75)
双边滤波:9 邻域直径,两个 75 分别是空间高斯函数标准差,灰度值相似性高斯函数标准差
形态学转换:
cv2.erode(img,np.ones((5,5),np.uint8),iterations = 1)
腐蚀
cv2.dilate(img,np.ones((5,5),np.uint8),iterations = 1)
膨胀
cv2.morphologyEx(img, cv2.MORPH_OPEN, np.ones((5,5),np.uint8))
开运算
cv2.morphologyEx(img, cv2.MORPH_CLOSE, np.ones((5,5),np.uint8))
闭运算
cv2.morphologyEx(img, cv2.MORPH_GRADIENT, np.ones((5,5),np.uint8))
形态学梯度
cv2.morphologyEx(img, cv2.MORPH_TOPHAT, np.ones((5,5),np.uint8))
礼帽
cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, np.ones((5,5),np.uint8))
黑帽:进行闭运算之后得到的图像与原始图像的差
结构化元素:
cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
构建一个矩形、椭圆形或者圆形的核,输入需要的核的形状和大小:
cv2.MORPH_RECT
cv2.MORPH_ELLIPSE
cv2.MORPH_CROSS
图像梯度:
cv2.Laplacian(img, cv2.CV_64F)
拉普拉斯滤波器
cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
Sobel滤波器
cv2.Schar(img, cv2.CV_64F, 1, 0, ksize=5)
Scharr 是对 Sobel(使用小的卷积核求解求解梯度角度时)的优化
数据类型(输出图像的深度):
• cv2.CV_64F 输出图像的深度(数据类型),可以使用-1, 与原图像保持一致 np.uint8
• cv2.CV_16S
• cv2.CV_64F
• cv2.CV_8U
边缘检测
cv2.Canny(img, minVul, maxVul)
边缘检测:检测值是图像,最大阈值,最小阈值
噪声去除
: 由于边缘检测很容易受到噪声影响,所以第一步是使用5×5的高斯滤波器去除噪声。
计算图像梯度
:对平滑后的图像使用Sobel算子计算水平方向和竖直方向的一阶导数(图像梯度)(Gx和Gy)。
非极大值抑制
:
在获得梯度的方向和大小之后,应该对整幅图像多一个扫描,去除那些非边界上的点。 滞后阈值:
现在要确定那些边界才是真正的边界。这时我们需要设置两个阈值:minVal 和 maxVal。当图像的灰度梯度高于 maxVal时被认为是真的边界,那些低于 minVal的边界会被抛弃。如果介于两者之间的话,就要看这个点是否与某个被确定为真正的边界点相连,如果是就认为它也是边界点,如果不是就抛弃。
cv2.pyrDown(img)
从一个高分辨率大尺寸的图像向上构建一个金子塔(尺寸变小,分辨率降低)。
cv2.pyrUp(img)
从一个低分辨率小尺寸的图像向下构建一个金子塔(尺寸变大,但分辨率不会增加)。
cv2.findContours(img, 轮廓检索模式,轮廓近似方法)
在一个二值图像中查找轮廓
cv2.drawContours(img, contours, -1, (0, 255, 0), 2)
用来绘制轮廓
cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
轮廓的近似方法
cv2.moments(contours)
会将计算得到的矩以一个字典的形式返回:检测值是轮廓
cv2.contourArea(contours)
轮廓面积:检测值是图像轮廓
cv2.arcLength(contours, True)
轮廓周长:检测值是图像轮廓
cv2.approxPolyDP(contours,epsilon,True)
轮廓近似:这个函数的第一个参数是图像轮廓,第二个参数叫epsilon,它是从原始轮廓到近似轮廓的最大距离。
cv2.convexHull(points[, hull[, clockwise[, returnPoints]])
凸包检测:可以用来检测一个曲线是否具有凸性缺陷,并能纠正缺陷。
参数:
• points 我们要传入的轮廓
• hull 输出,通常不需要
• clockwise 方向标志。如果设置为 True,输出的凸包是顺时针方向的。
否则为逆时针方向。
• returnPoints 默认值为 True。它会返回凸包上点的坐标。如果设置
为 False,就会返回与凸包点对应的轮廓上的点。
cv2.isContourConvex(contours)
凸性检测:可以用来检测一个曲线是不是凸的,检测值是轮廓。