qgyd2021/wechat_or_qq_icon_detection
收藏数据集概述
任务描述
从图像中检测出 WeChat 或 QQ 图标的位置。
实现方法
基于 OpenCV 库,通过 SIFT 或 SURF 图像特征进行检测。
环境要求
- Python 版本: 3.6.5
- OpenCV 库版本: opencv-contrib-python==3.4.2.16
实现步骤
- 采用 OpenCV 库的 SIFT 或 SURF 图像特征
cv.xfeatures2d.SIFT_create()对目标区域生成特征点向量。 - 为减少特征点数量,对所有的特征点向量做聚类,将聚类中心作为特征点,得到
template_descriptors。 - 计算目标图像中的所有 SIFT 或 SURF 图像特征点,得到
scene_descriptors。 - 采用
flann.knnMatch方法进行特征点匹配,如果最近匹配距离比第二匹配距离的 0.7 倍还要小,则认为这个点是good_match。 - 最小要有3个
good_match才认为图标匹配成功。 - 最后根据
good_match点的分布计算图标的中心,计算点集中心和平均距离,将大于平均距离的点丢弃,重复此过程,直到半径小于阈值。
涉及的方法
python import cv2 as cv
sift = cv.xfeatures2d.SIFT_create()
index_params = dict(algorithm=0, trees=5) search_params = dict(checks=50) flann = cv.FlannBasedMatcher(index_params, search_params)
keypoints, descriptors = sift.detectAndCompute(image, None)
matches = flann.knnMatch( queryDescriptors=template_descriptors, trainDescriptors=scene_descriptors, k=2 )
good_matches = [] for m, n in matches: if m.distance < 0.7 * n.distance: good_matches.append(m)
k = 3 if len(good_matches) > k: print(good_matches) else: print("Not enough matches are found - %d/%d" % (len(good_matches), k))
类别定义
text CATEGORIES = [ "红黑白QQ图标", "绿边白色微信图标", "淡蓝底全白QQ图标", "绿底全白微信图标", "大绿小白微信图标", "纯色微信图标", "纯色QQ图标" ]



