im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (255,0,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
image:也就是原始图片
keypoints:从原图中获得的关键点,这也是画图时所用到的数据
outputimage:输出
color:颜色设置,通过修改(b,g,r)的值,更改画笔的颜色,b=蓝色,g=绿色,r=红色。
flags:绘图功能的标识设置,(可能标识的值由DrawMatchesFlags定义,具体的要看DrawMatchesFlags这个函数,c++里是这样)。在Python里面标识由drawmatchesflags::DEFAULT,
drawmatchesflags::DRAW_RICH_KEYPOINTS,
drawmatchesflags::DRAW_OVER_OUTIMG,
drawmatchesflags::NOT_DRAW_SINGLE_POINTS修改
opencv特征检测的公共接口:
detect(src,vector<keypoint>&,mask), detect(src,vector<vector<keypoint>>&,mask),
fast产生的原因:harris太过费时,
它使用一定邻域内像元的灰度值与中心点比较大小去判断是否为一个角点。但它的缺点是不具有方向性,尺度不变性。
比较中间点与半径3.4的圆经过的邻域上的连续的12/9个点的灰度值,若有连续12或9个邻域像素值都大于或都小于中心像素点,则认为是候选特征点;用ID3信息增益进行决策树的训练;通过定义特征点响应函数进行角点的非极大值抑制;配合金字塔模型,可以对不同尺度的图像进行特征点检测,结果总和为最终结果;
OpenCV3中FAST方法以FastFeatureDetector类的形式封装,为Feature2D类的子类:
Ptr<FastFeatureDetector> create( int threshold=10, bool nonmaxSuppression=true,
int type=FastFeatureDetector::TYPE_9_16 );
threshold是指比较时边缘轨迹点和中心点的差值,也就是第三步的阈值t, nonmaxSuppression代表是否使用第五步非极大值抑制,如果发现fast检测的结果有聚簇情况,那么可以考虑采用,第三个参数type的取值来自于FastFeatureDetector枚举,有如下取值:
TYPE_5_8 从轨迹中取8个点,当有5个点满足条件,就是特征点.
TYPE_7_12 取轨迹12个点,7个满足条件,就是特征点.
TYPE_9_16 取轨迹16个点,当9个满足条件,就是特征点.