Python+OpenCV学习(12)---特征匹配
来源:互联网 发布:七日杀mac存档在哪里 编辑:程序博客网 时间:2024/06/06 07:45
利用python学习OpenCV,个人感觉比较方便。函数的形式与C++基本相同,所以切换过来还是比较好的,对于像我这种对python不太熟练的人,使用python的集成开发环境PyCharm进行学习,可以设置断点调试,有助于我这类初学者理解掌握。
下面是利用python语言结合OpenCV进行SIFT特征进行匹配的代码:
# -*- coding:utf-8 -*-__author__ = 'Microcosm'import cv2#from find_obj import filter_matches,explore_matchimport numpy as npdef filter_matches(kp1, kp2, matches, ratio = 0.75): mkp1, mkp2 = [], [] for m in matches: if len(m) == 2 and m[0].distance < m[1].distance * ratio: m = m[0] mkp1.append( kp1[m.queryIdx] ) mkp2.append( kp2[m.trainIdx] ) p1 = np.float32([kp.pt for kp in mkp1]) p2 = np.float32([kp.pt for kp in mkp2]) kp_pairs = zip(mkp1, mkp2) return p1, p2, kp_pairsdef explore_match(win, img1, img2, kp_pairs, status = None, H = None): h1, w1 = img1.shape[:2] h2, w2 = img2.shape[:2] vis = np.zeros((max(h1, h2), w1+w2), np.uint8) vis[:h1, :w1] = img1 vis[:h2, w1:w1+w2] = img2 vis = cv2.cvtColor(vis, cv2.COLOR_GRAY2BGR) if H is not None: corners = np.float32([[0, 0], [w1, 0], [w1, h1], [0, h1]]) corners = np.int32( cv2.perspectiveTransform(corners.reshape(1, -1, 2), H).reshape(-1, 2) + (w1, 0) ) cv2.polylines(vis, [corners], True, (255, 255, 255)) if status is None: status = np.ones(len(kp_pairs), np.bool) p1 = np.int32([kpp[0].pt for kpp in kp_pairs]) p2 = np.int32([kpp[1].pt for kpp in kp_pairs]) + (w1, 0) green = (0, 255, 0) red = (0, 0, 255) white = (255, 255, 255) kp_color = (51, 103, 236) for (x1, y1), (x2, y2), inlier in zip(p1, p2, status): if inlier: col = green cv2.circle(vis, (x1, y1), 2, col, -1) cv2.circle(vis, (x2, y2), 2, col, -1) else: col = red r = 2 thickness = 3 cv2.line(vis, (x1-r, y1-r), (x1+r, y1+r), col, thickness) cv2.line(vis, (x1-r, y1+r), (x1+r, y1-r), col, thickness) cv2.line(vis, (x2-r, y2-r), (x2+r, y2+r), col, thickness) cv2.line(vis, (x2-r, y2+r), (x2+r, y2-r), col, thickness) vis0 = vis.copy() for (x1, y1), (x2, y2), inlier in zip(p1, p2, status): if inlier: cv2.line(vis, (x1, y1), (x2, y2), green) cv2.imshow(win, vis)img1 = cv2.imread("E:\python\Python Project\opencv_showimage\images\multi_view_big.jpg")img2 = cv2.imread("E:\python\Python Project\opencv_showimage\images\multi_view_small.jpg")img1_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)img2_gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)sift = cv2.SIFT()kp1,des1 = sift.detectAndCompute(img1_gray, None)kp2,des2 = sift.detectAndCompute(img2_gray, None)# BFmatcher with default parmsbf = cv2.BFMatcher(cv2.NORM_L2)matches = bf.knnMatch(des1, des2, k=2)p1,p2,kp_pairs = filter_matches(kp1,kp2,matches,ratio=0.5)explore_match('matches', img1_gray,img2_gray,kp_pairs)#img3 = cv2.drawMatchesKnn(img1_gray,kp1,img2_gray,kp2,good[:10],flag=2)cv2.waitKey(0)cv2.destroyAllWindows()
运行结果为:
3 0
- Python+OpenCV学习(12)---特征匹配
- python-opencv-特征点匹配连线(画线)drawMatches
- opencv-python 提取sift特征并匹配
- Python+OpenCV--图像特征匹配连线
- OpenCV SIFT特征学习:(二)SIFT匹配
- OpenCV学习笔记[5]FLANN特征匹配
- opencv学习之 特征检测与匹配
- Python+OpenCV学习(7)---模板匹配
- OpenCV SIFT特征学习 (三) 特征如何更好的匹配(上)
- OpenCV学习笔记(四):OpenCV SIFT特征的检测与匹配 测试
- opencv 特征点提取、匹配(一)
- opencv 特征点提取、匹配(二)
- OpenCV Surf特征匹配
- 初学opencv/特征匹配
- OpenCV-Python sift/surf特征匹配与显示
- 【OpenCV学习笔记】三十七、特征检测与匹配(二)——SIFT特征点匹配
- Opencv学习笔记(三)———特征点匹配
- opencv学习笔记:特征点匹配函数使用注意
- 数据库的配置
- 轮式驱动单元电机PID控制说明
- (4.4.12)Android开发:如何实现TCP和UDP传输
- Memcached之——Memcached与Spring提供的cache接口整合
- 好久没静下心学点东西了,再看看rbac这张图吧。
- Python+OpenCV学习(12)---特征匹配
- 一些摄像机标定的Matlab工具箱(含Kinect和激光)
- UI 第六节 uisegmentedControl uiimage uislider 课后习题
- NSScanner: nil string argument
- Dimensionality Reduction(学习Free Mind知识整理)
- capture screen activity to a movie file using AV Foundation on OS X 10.7 Lion and later
- mybatis调用存储过程
- URLConnection/Android Stutio中HttpClient的添加jar包方法和DoGet、DoPost的用法
- 自定义MITK PlanarFigure及困惑