opencv
1.边缘检测
cv2.Canny(img,min_thresh,max_thresh)
在进行边缘检测时,最好先进行高斯模糊 cv2.GaussianBlur(img,(3,3),0,0)
img 单通道图像
min_thresh 最小阈值
max_thresh最大阈值
返回值为提取边缘后的图片
2.轮廓检测
contours = cv2.findContours(edges_,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
返回值: 为一个个轮廓组成的list ,每个轮廓都由许多点构成
第一个参数
是寻找轮廓的图像;
第二个参数
表示轮廓的检索模式,有四种(本文介绍的都是新的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 近似算法
3.轮廓面积比较
area_d = cv2.contourArea(contour)
单个轮廓面积的计算
ret = map(area.index,heapq.nlargest(1,area))
获取所有轮廓中面积最大的索引
for contour in contours_all:
area_d = cv2.contourArea(contour)
area.append(area_d)
ret = map(area.index,heapq.nlargest(1,area))
4.图片上的绘图
画点或圆
cv2.circle(img,dian,2,(50,50,50),1)
img 原图像
dian 圆心坐标(x,y)
2 圆半径
(50,50,50) 颜色
1 线的宽度 -1 则为实心圆
划线
cv2.line(img,(10,10),(200,200),(0,255,0),3)
img 原图像
(10,10) (200,200) 线的俩端点
(0,255,0) 线的颜色
画矩
cv2.rectangle(img,(10,10),(30,40),(134,2,34),1)
img 原图像
(10,10) (30,40) 左上角与右下角的坐标
(134,2,34) 线颜色
1 线宽度
添加文字
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,’OpenCV’,(80,90), font, 2,(255,255,255),3)
绘制的文字,位置,字型,字体大小,文字颜色,线型
5.颜色提取
img_lab = cv2.cvtColor(img,cv2.COLOR_BGR2LAB) rgb --> lab b黄色通道 提取黄色比较明显
img_hls = cv2.cvtColor(img,cv2.COLOR_BGR2HLS) rgb --> hls l白色通道 提取白色比较明显
以上返回值 为三通道的图像
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) rgb --> gray 灰度图象 单通道图像
6.阈值分割
retval,dst = cv2.threshold(img,180,255,cv2.THRESH_BINARY)
返回值 dst为二值化后的灰度图
src::单通道图象
thresh:阈值
maxval:最大值
type:阈值类型 如下所示
7.多点拟合和
a.直线拟合
[vx,vy,x_,y_] = cv2.fitLine(contour,cv2.DIST_L2,0.2,0.01,0.01)
返回值处理 斜率为 vy/vx (x_,y_) 直线上的一点
点集 拟合方式 剩余参数默认即可