计算本质矩阵
首先下载CV2的python库,点击下载:
这个网站可以长期保存,如果有用得到的地方,直接搜索就可以。
将CV2的库方放在桌面上,打开Anaconda Prompt (spyder)就可
如果这个方法不好使的话,再来一个下载速度超快的。
pip install opencv-python pip -i https://pypi.tuna.tsinghua.edu.cn/simple/
在Anaconda Prompt 直接复制,粘贴即可。
具体安装流程,可以查看:链接
第一步
用手机拍摄不同角度的两张照片,有平移有旋转,保存至文件夹
照片最好不要用大于500K的照片,这是因为照片的分辨率越高,特征值点就越小;当分辨率越小,特征值点就越大,容易进行观察。
推荐一款软件:格式工厂,可以修改照片的分辨率和改变照片的格式。
格式工厂
链接:https://pan.baidu.com/s/1aSSjBY3P8xM2AalOl8bAJA
提取码:snbp
第二步
直接上代码!
检测两张图片的特征点,并保存特征点检测图片,代码如下:
import numpy as np
import cv2
from matplotlib import pyplot as plt
#根据不同的照片格式,选择不同的方法
img11 = cv2.imread('1.jpg')
img12 = cv2.imread('2.jpg')#导入第一问的照片
img11 = cv2.cvtColor(img11, cv2.COLOR_BGR2RGB)
img12 = cv2.cvtColor(img12, cv2.COLOR_BGR2RGB)
# imgl1=cv2.imread('./1.png')
# imgl2=cv2.imread('./2.png')
orb = cv2.ORB_create()
keypoint_1 = orb.detect(img11,None)
keypoint_2 = orb.detect(img12,None)
img1 = cv2.drawKeypoints(img11, keypoints= keypoint_1, outImage=None)
img2 = cv2.drawKeypoints(img12, keypoints= keypoint_2, outImage=None)
newimg = np.hstack([img1, img2])
cv2.imshow("img", newimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite("./im1.jpg", newimg, [int(cv2.IMWRITE_PNG_COMPRESSION),0])
关于照片颜色改变的问题:点击修改方式
查看不一样的知识。
import cv2
import numpy as np
fengmian = 'picture.jpg'
img = cv2.imread(fengmian)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # cv2默认为bgr顺序
But今天也发现一个例外
img11=cv2.imread('./1.jpg')
img12=cv2.imread('./2.jpg')
有的这个运行出来是原图片,python的世界真大,我也理解不了!比英语的海洋还要宽广。
第三步
计算特征点匹配,并保存特征点匹配图片
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)
matches = cv2.BFMatcher(cv2.NORM_HAMMING).match(des1, des2)
min_distance = matches[0].distance
max_distance = matches[0].distance
for x in matches:
if x.distance < min_distance:
min_distance = x.distance
if x.distance > max_distance:
max_distance = x.distance
good_matche = matches[:100]
mimg = cv2.drawMatches(img1, kp1, img2, kp2, good_matche, outImg=None)
cv2.imshow("img", mimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite("./im2.jpg", mimg, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
good_match = []
pts1 = []
pts2 = []
for x in matches:
if x.distance <= max(2 * min_distance,**): #当描述子之间的距离大于两倍的最小距离时,认为匹配有误。
#但有时候最小距离会非常小,所以设置一个经验值**作为下限。
good_match.append(x)
pts1.append(kp1[x.queryIdx].pt)
pts2.append(kp2[x.trainIdx].pt)
H, _ = cv2.findHomography(np.float32(pts1), np.float32(pts2), cv2.RHO)
cv2.imshow("Match Result", mimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite("./im3.jpg", mimg, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
第四步
计算基本矩阵
ret = cv2.drawMatches(img1, kp1, img2, kp2,good_match, outImg=None, flags=2)
pts1=np.array(pts1)
pts2=np.array(pts2)
F, mask = cv2.findFundamentalMat(pts1,pts2,cv2.FM_LMEDS)
print("基本矩阵",F)
二、计算手机相机的内参矩阵
参考链接:点击查看
计算出k带入
三、计算本质矩阵
#将所得到的的mtx带入
k=[[]]
k=np.array(k)
E, mask =cv2.findEssentialMat(pts1,pts1,k)
print("本质矩阵",E)
retval2, R, T, mask=cv2.recoverPose(E,pts1,pts2,k)
print("旋转角度",R)
print("平移量",T)
其中代码可以进行适量地修改。
关于“最佳匹配点保存到 GP1和GP2,一一对应”的问题
就是修改文章中**(子之间的距离)的值,得到两张最佳匹配的照片,放在文件GP1和GP2的文件下就可。
关于代码合并的问题,自由发挥!OK?