基本方法 读取图片 1 2 cv2.imread(path_of_image) cv2.imread(path_of_image, intflag)
path_of_image:图片路径
intflag: CV_LOAD_IMAGE_COLOR / 1 ——加载彩色图像,忽略透明度.默认 CV_LOAD_IMAGE_GRAYSCALE / 0 ——灰度模式
窗口显示 1 cv2.imshow(windows_name, image)
windows_name:窗口名称
image:图像对象,类型是numpy中的ndarray类型
窗口关闭 1 2 cv2.destroyWindow(windows_name) cv2.destroyAllWindows()
如果需要一定条件自动关闭窗口:
1 cv2.waitKey(time_of_milliseconds)
当time_of_milliseconds>0时:过time_of_milliseconds毫秒后关闭窗口
当time_of_milliseconds<=0时:等待键盘敲击后关闭.例如:
1 2 3 4 5 6 if cv2.waitKey(0 ) == 27 : cv2.destroyAllWindows() if cv2.waitKey(-1 ) == ord ('A' ): cv2.destroyWindow('image' )
摄像头使用 1 cap = cv2.VideoCapture(0 )
循环获取并显示:
1 2 3 4 5 while (1 ): ret, frame = cap.read() cv2.imshow("capture" , frame) if cv2.waitKey(0 ) == 27 : break
释放摄像头对象:
图片保存 1 cv2.imwrite(image_filename, image)
image_filename:文件名称 image:图像对象,类型是numpy中的ndarray类型
获取图像信息 获取图片大小及某一点信息 1 2 3 4 5 6 print (rgb_img.shape) print (rgb_img[0 , 0 ]) print (rgb_img[0 , 0 , 0 ]) print (gray_img.shape) print (gray_img[0 , 0 ])
获取一整行
以白色为例: 获取一行内白色个数
1 white_count = np.sum (color == 255 )
获取白色像素点索引:
1 white_index = np.where(color == 255 )
应用举例: 求第一个白色点和最后一个白色点横坐标平均值 1 2 3 4 5 6 7 white_count = np.sum (color == 255 ) white_index = np.where(color == 255 ) if white_count == 0 : white_count = 1 center = (white_index[0 ][white_count - 1 ] + white_index[0 ][0 ]) / 2 print (center)
图像绘制 创建空白图像 1 2 3 4 5 6 7 8 import cv2import numpy as np white_img = np.ones((512 ,512 ,3 ), np.uint8) white_img = 255 *white_img cv2.imshow('white_img' , white_img) if cv2.waitKey(0 ) == 27 : cv2.destroyAllWindows()
一些共有参数:
img:需要进行绘制的图像对象ndarray color:颜色,采用BGR即上述说的(B、G、R) thickness:图形中线的粗细,默认为1,对于圆、椭圆等封闭图像取-1时是填充图形内部 lineType:图形线的类型,默认8-connected线是光滑的,当取cv2.LINE_AA时线呈现锯齿状
直线 1 cv2.line(image, starting, ending, color, thickness, lineType)
长方形 1 cv2.rectangle(image, top-left, bottom-right, color, thickness, lineType)
top-left、bottom-right长方形的左上角像素坐标、右下角像素坐标
圆形 1 cv2.circle(image, center, radius, color, thickness, lineType)
center、radius分别表示圆的圆心像素坐标、圆的半径长度
多边形 1 cv2.polylines(image, [point-set ], flag, color, thickness, lineType)
[point-set]: 表示多边形点的集合,如果多边形有m个点,则便是一个m12的数组,表示共m个点 flag: 当flag = True 时,则多边形是封闭的,当flag = False 时,则多边形只是从第一个到最后一个点连线组成的图像,没有封闭..示例:
1 2 3 4 5 6 7 8 9 import cv2import numpy as npimg = np.ones((512 ,512 ,3 ), np.uint8) img = 255 *img pts = np.array([[10 ,5 ],[20 ,30 ],[70 ,20 ],[50 ,10 ]], np.int32) img = cv2.polylines(img,[pts],True ,(0 , 0 , 0 ), 2 ) cv2.imshow('img' , img) if cv2.waitKey(0 ) == 27 : cv2.destroyAllWindows()
文字绘制 1 2 cv.putText(img,"OpenCV" ,(10 ,500 ),cv.FONT_HERSHEY_SIMPLEX,4 ,(255 ,255 ,255 ),2 ,cv_LINE_AA) cv2.putText(图片img,“文本内容”,(左下角坐标),字体,字体大小,(颜色),线条粗细,线条类型)
图片处理 图像色彩空间变换 1 cv2.cvtColor(input_image, flag)
input_image:要变换色彩的图像ndarray对象 flag:图像色彩空间变换的类型,共有274种空间转换类型,最常用的: cv2.COLOR_BGR2GRAY:将图像从BGR空间转化成灰度图 cv2.COLOR_BGR2HSV:将图像从BGR空间转化成HSV空间
缩放 1 2 3 4 img1=cv2.resize(img,(200 ,200 )) img2=cv2.resize(img,(0 ,0 ),fx=0.5 ,fy=0.5 ,interpolation=cv2.INTER_NEAREST)
裁剪 1 2 3 4 patch_img=img[20 :150 ,-180 :-50 ]
二值化 有阈值的二值化处理 1 2 3 4 5 6 cv2.threshold(src, thresh, maxval, type )
1 retval, dst = cv2.threshold(gray, 0 , 255 , cv2.THRESH_BINARY | cv2.THRESH_OTSU)
局部阈值二值化 1 2 3 4 5 6 7 8 9 10 cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None ) img2=cv2.adaptiveThreshold(img, 255 , cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5 , 10 , dst=None )
滤波 1 2 3 4 5 6 7 8 9 result = cv2.medianBlur(image,5 ) cv2.GaussianBlur(img,(5 ,5 ),1.5 ) cv2.blur(img,(5 ,5 )) cv2.bilateralFilter(img,9 ,75 ,75 )
膨胀与腐蚀 1 2 3 4 5 6 7 8 9 10 11 12 cv2.erode(img,kernel,iterations) cv2.dilate(img,kernel,iterations) kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3 , 3 )) NpKernel = np.uint8(np.ones((3 ,3 )))
先腐蚀后膨胀,用于移除由图像噪音形成的斑点;(开运算) 先膨胀后腐蚀,用来连接被误分为许多小块的对象.(闭运算)
开运算:用来去除噪声 1 opening = cv.morphologyEx(noi_src, cv.MORPH_OPEN, kernel)
闭运算:用来填充前景物体中的小洞,或前景物体上的小黑点 1 closing = cv.morphologyEx(noi_src, cv.MORPH_CLOSE, kernel)
梯度:膨胀与腐蚀的差别,前景物体的轮廓 1 gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
图片相减(差异对比)
通过cv2.absdiff(膨胀图像,腐蚀图像)可以获取图像边缘
取反色
颜色范围选取 1 2 3 lower = np.array([130 , 62 , 72 ]) upper = np.array([170 , 255 , 148 ]) img = cv2.inRange(frame_hsv, lower, upper)
其中lower,upper为HSV空间数组,其中数组中: H是色彩 S是深浅, S = 0时,只有灰度 V是明暗,表示色彩的明亮程度 低于或高于数组范围内都将变为0,只有其中间变为255
边缘提取:返回二值图像 1 img2 = cv.Canny(img,s1,s2)
img为输入的灰度图像 s1,s2为低阈值,高阈值.
轮廓检测 1 cv2.findContours(image, mode, method)
image:寻找轮廓的二值图像 mode:轮廓的检索模式 method:轮廓的近似办法 检索模式: cv2.RETR_EXTERNAL 只检测外轮廓 cv2.RETR_LIST 提取所有轮廓,并放置在list中,检测的轮廓不建立等级关 cv2.RETR_CCOMP 建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。 cv2.RETR_TREE 检测所有轮廓,建立完整的层次结构,建立网状轮廓结构 近似方法: cv2.CHAIN_APPROX_NONE 获取每个轮廓的每个像素,相邻的两个点的像素位置差不超过1 cv2.CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,值保留该方向的重点坐标,如果一个矩形轮廓只需4个点来保存轮廓信息 cv2.CHAIN_APPROX_TC89_L1 使用Teh-Chini chain近似算法 cv2.CHAIN_APPROX_TC89_KCOS 使用Teh-Chini chain近似算法
注: 如:
1 2 returns = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) print (len (returns))
在cv2中将返回2个值,cv3中将返回3个值 cv2:轮廓本身contours,每条轮廓对应的属性hierarchy cv3:所处理的图像img, 要找的轮廓的点集countours, 各层轮廓的索引hierarchy
绘制轮廓 1 cv2.drawContours(image, contours, contourIdx, color)
image:需要绘制轮廓的目标图像,会改变原图 contours:轮廓点,上述函数cv2.findContours()的第一个返回值 contourIdx:轮廓的索引,表示绘制第几个轮廓,-1表示绘制所有的轮廓 color:绘制轮廓的颜色
获取外接矩形边框 1 x,y,w,h = cv2.boundingRect(img)
img:一个二值图像 x,y:矩形左上角坐标 w,h:矩形宽高
获取最小旋转外接矩形边框
rect[0]返回矩形的中心点,(x,y),y行x列的像素点 cv2.boxPoints(rect)可以返回四个点的值,返回形式[ [x0,y0], [x1,y1], [x2,y2], [x3,y3] ] box = np.int0(box)取得整数 rect[1]返回矩形的长和宽 rect[2]返回矩形的旋转角度
举例:
1 2 3 4 5 6 7 8 import cv2 as cvimport numpy as npimg = cv.imread("test.jpg" ,0 ) _,contours,_ = cv.findContours(img,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE) cnt = contours[0 ] rect = cv.minAreaRect(cnt) box = cv.boxPoints(rect) box = np.int0(box)