openCV之单应性矩阵

简介: 单应性矩阵
import cv2
import numpy as np

# 打开图片
img1 = cv2.imread('./image/min_cat.png')
img2 = cv2.imread('./image/cat.png')

# 灰度化
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

# 创建特征检测器
sift = cv2.xfeatures2d.SIFT_create()

# 把关键点(特征点)和描述子一起检测出来.
kp1, des1 = sift.detectAndCompute(gray1,None)
kp2, des2 = sift.detectAndCompute(gray2,None)

# 创建特征匹配器
index_params = dict(algorithm = 1, trees = 5)
search_params = dict(checks = 50)
flann = cv2.FlannBasedMatcher(index_params,search_params)

# 对描述子进行特征匹配
matches = flann.knnMatch(des1,des2,k=2)
# print(matches)

goods = []
for (m,n) in matches:
    # 阈值一般设0.7-0.8之间
    if m.distance < 0.75*n.distance:
        goods.append(m)

# print(goods)
# 通过goods把特征点找到
# 因为计算单应性矩阵要求最少4个点
if len(goods) >=4:
    src_points = np.float32([kp1[m.queryIdx].pt for m in goods]).reshape(-1,1,2)
    dst_points = np.float32([kp2[m.trainIdx].pt for m in goods]).reshape(-1,1,2)

    # 根据匹配上的关键点去计算单应性矩阵
    H , _ = cv2.findHomography(src_points,dst_points,cv2.RANSAC,5)
    # 通过单应性矩阵,计算小图在大图中的对应位置
    h,w = img1.shape[:2]
    pts = np.float32([[0,0],[0,h-1],[w-1,h-1],[w-1,0]]).reshape(-1,1,2)
    # warpPerspective 是对图片进行透视变换的
    # cv2.warpPerspective()
    dst = cv2.perspectiveTransform(pts,H)
    # 在大图中,把dst画出来
    cv2.polylines(img2,[np.int32(dst)],True,(0,0,255),2)

else:
    print('not enough point number to compute homography matrix')
    exit()

# 画出匹配的特征点
ret = cv2.drawMatchesKnn(img1,kp1,img2,kp2,[goods],None)

cv2.imshow('ret',ret)
cv2.imshow('img2',img2)

cv2.waitKey(0)
cv2.destroyAllWindows()
目录
相关文章
|
6月前
|
存储 定位技术 计算机视觉
Armadillo与OpenCV矩阵数据mat、vec与Mat的相互转换
Armadillo与OpenCV矩阵数据mat、vec与Mat的相互转换
|
存储 计算机视觉 数据格式
OpenCV库、Armadillo库矩阵数据格式互转的方法
本文介绍在C++语言中,矩阵库Armadillo的mat、vec格式数据与计算机视觉库OpenCV的Mat格式数据相互转换的方法~
130 1
OpenCV库、Armadillo库矩阵数据格式互转的方法
|
计算机视觉
OpenCV-矩阵变形reshape
OpenCV-矩阵变形reshape
139 0
|
计算机视觉
OpenCV-矩阵归一化cv::normalize
OpenCV-矩阵归一化cv::normalize
|
计算机视觉 索引
三天学会opencv(二)——矩阵的掩膜操作
三天学会opencv(二)——矩阵的掩膜操作
106 0
三天学会opencv(二)——矩阵的掩膜操作
|
存储 API 计算机视觉
OpenCV 矩阵的掩膜操作
OpenCV 矩阵的掩膜操作
150 0
OpenCV 矩阵的掩膜操作
|
存储 计算机视觉
OpenCV矩阵cv::Mat通道和位深的整理(CV_8UC1,CV_32FC1等等)
OpenCV矩阵cv::Mat通道和位深的整理(CV_8UC1,CV_32FC1等等)
1684 0
|
计算机视觉 算法 定位技术
OpenCV 单应矩阵应用:全景图像融合原理
之前的写了好几篇文,什么特征点检测,匹配,RANSAC之类的乱七八糟的,就是为了做这个应用。了解原理之后用NI Vision实现,数图的课程设计算是交差了~~全景图像融合使用到SIFT算子(特征点检测和匹配)、单应矩阵(立体几何)和RANSAC(随机抽样一致性)之类的内容,了解其中的领域和原理还是需要花点时间的。
2113 0
|
计算机视觉
OpenCV 估算图像的投影关系:基础矩阵和RANSAC
根据针孔摄像机模型,我们可以知道,沿着三维点X和相机中心点之间的连线,可以在图像上找到对应的点x。反过来,在三维空间中,与成像平面上的位置x对应的场景点可以位于这条线上的所有位置。
2118 0