笔记关键词检索?

在所有笔记中搜索你感兴趣的关键词!

《OpenCV3计算机视觉》 ──   Python语言实现(原书第2版)

作者:Joe Minichino&Joseph Howse著 刘波 苗贝贝 史斌 译

知识点类型:【方法】


Python&OpenCV轮廓检测及cv2.threshold,cv2.findContours,cv2.cvtColor,cv2.drawContours函数

对与轮廓检测就是cv2.threshold,cv2.findContours,cv2.cvtColor,cv2.drawContours这几个函数的调用。下面就是代码及对这几个函数的解释:

import cv2
import numpy as np
img = np.zeros((200,200),dtype = np.uint8 )#构造一个两百行两两百列的矩阵
img[50:150,50:150]= 225 #把50到150行和50到150列赋值为225
# cv2.imshow('img',img)
# cv2.waitKey()
ret ,thresh = cv2.threshold('img',127,255,0)#选取一个全局阈值,然后就把整幅图像分成了非黑即白的二值图像
'''
cv2.threshold() 函数解释
这个函数有四个参数,第一个原图像,第二个进行分类的阈值,第三个是高于(低于)阈值时赋予的新值,第四个是一个方法选择参数,常用的有:
• cv2.THRESH_BINARY(黑白二值)
• cv2.THRESH_BINARY_INV(黑白二值反转)
• cv2.THRESH_TRUNC (得到的图像为多像素值)
• cv2.THRESH_TOZERO
• cv2.THRESH_TOZERO_INV
该函数有两个返回值,第一个retVal(得到的阈值值(在后面一个方法中会用到)),第二个就是阈值化后的图像。
'''
image,contours ,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
'''
cv2.threshold函数的解释
参数
第一个参数是寻找轮廓的图像;
第二个参数表示轮廓的检索模式,有四种(本文介绍的都是新的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()函数返回两个值,一个是轮廓本身,还有一个是每条轮廓对应的属性。'''
color =cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)#将灰度图像转化成BGR图像
'''
cvCvtColor(...),是Opencv里的颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间的转换,也可以转换为灰度图像。
参数CV_RGB2GRAY是RGB到gray。
参数 CV_GRAY2RGB是gray到RGB。
'''
img = cv2.drawContours(color,contours,-1,(0,255,0),2)#主要用于画出图像的轮廓
'''
cv2.drawContours的参数解释(此例只用了前五个)
其中第一个参数image表示目标图像,
第二个参数contours表示输入的轮廓组,每一组轮廓由点vector构成,
第三个参数contourIdx指明画第几个轮廓,如果该参数为负值,则画全部轮廓,
第四个参数color为轮廓的颜色,
第五个参数thickness为轮廓的线宽,如果为负值或CV_FILLED表示填充轮廓内部,
第六个参数lineType为线型,
第七个参数为轮廓结构信息,
第八个参数为maxLevel
'''
cv2.imshow('contours',color)
cv2.waitKey()
cv2.destroyAllWindows()
 

............

cv2.applyColorMap

............

cv2.bitwise_and

............

cv2.getStructuringElement

............

cv2.xfeatures2d.SURF_create

............

cv2.resize

............

sklearn.make_classification

make_classification(n_samples=100, n_features=20, n_informative=2, n_redundant=2, n_repeated=0, n_classes=2, n_clusters_per_class=2, weights=None, flip_y=0.01, class_sep=1.0, hypercube=True, shift=0.0, scale=1.0, shuffle=True, random_state=None): 
参数: 

n_features :特征个数= n_informative() + n_redundant + n_repeated 

n_informative:多信息特征的个数 

n_redundant:冗余信息,informative特征的随机线性组合 

n_repeated :重复信息,随机提取n_informative和n_redundant 特征 

n_classes:分类类别 

n_clusters_per_class :某一个类别是由几个cluster构成的 

weights:列表类型,权重比 

class_sep:乘以超立方体大小的因子。 较大的值分散了簇/类,并使分类任务更容易。默认为1 

random_state: 如果是int,random_state是随机数发生器使用的种子; 如果RandomState实例,random_state是随机数生成器; 如果没有,则随机数生成器是np.random使用的RandomState实例。
返回值: 

X:形状数组[n_samples,n_features] 生成的样本。 

y:形状数组[n_samples] 每个样本的类成员的整数标签。

............

cv2.drawKeypoints

drawKeypoints(image, keypoints, outImage, color=None, flags=None) 

image:也就是原始图片 

keypoints:从原图中获得的关键点,这也是画图时所用到的数据 

outputimage:输出 color:颜色设置,通过修改(b,g,r)的值,更改画笔的颜色,b=蓝色,g=绿色,r=红色。 

flags:绘图功能的标识设置flags的四个参数: 

    cv2.DRAW_MATCHES_FLAGS_DEFAULT:创建输出图像矩阵,使用现存的输出图像绘制匹配对和特征点,对每一个关键点只绘制中间点 

    cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不创建输出图像矩阵,而是在输出图像上绘制匹配对 

    cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:对每一个特征点绘制带大小和方向的关键点图形 

    cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制 

............

cv2.FlannBasedMatcher

FLANN英文全称Fast Libary for Approximate Nearest Neighbors,FLANN是一个执行最近邻搜索的库,官方网站http://www.cs.ubc.ca/research/flann。

它包含一组算法,这些算法针对大型数据集中的快速最近邻搜索和高维特征进行了优化,对于大型数据集,它比BFMatcher工作得更快。经验证、FLANN比其他的最近邻搜索软件快10倍。 

flann = cv2.FlannBasedMatcher(indexParams,searchParams) 

其中FLANN匹配对象接收两个参数:indexParams和searchParams。这两个参数在python中以字典形式进行参数传递(在C++中以结构体形式进行参数传递),为了计算匹配,FALNN内部会决定如何处理索引和搜索对象。 

1、indexParams 对于像SIFT,SURF等算法,您可以传递以下内容: indexParams = dict(algorithm = FLANN_INDEX_KDTREE,trees = 5) 参数algorithm用来指定匹配所使用的算法,可以选择的有LinearIndex、KTreeIndex、KMeansIndex、CompositeIndex和AutotuneIndex,这里选择的是KTreeIndex(使用kd树实现最近邻搜索)。KTreeIndex配置索引很简单(只需要指定待处理核密度树的数量,最理想的数量在1~16之间),并且KTreeIndex非常灵活(kd-trees可被并行处理)。 

2、searchParams SearchParams它指定索引数倍遍历的次数。 值越高,精度越高,但也需要更多时间。 如果要更改该值,请传递:searchParams = dict(checks = 50) 实际上、匹配效果很大程度上取决于输入。5 kd-trees和50 checks总能取得具有合理精度的结果,而且能够在很短的时间内完成匹配。

............