首页 > 其他分享 >在不知道相机内参的情况下,利用opencv库进行基于特征点匹配的极线校正

在不知道相机内参的情况下,利用opencv库进行基于特征点匹配的极线校正

时间:2024-03-19 11:46:14浏览次数:21  
标签:src plt dst 内参 opencv rectified img1 pts 极线

def rectify_image(img1, img2):
# 初始化SIFT检测器
sift = cv2.SIFT_create()
# 检测关键点和计算描述符
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
# 使用FLANN匹配器进行特征点匹配
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1, des2, k=2)
# 选择良好的匹配点
src_pts = []
dst_pts = []
# ratio test as per Lowe's paper
for i, (m, n) in enumerate(matches):
if m.distance < 0.8 * n.distance:
dst_pts.append(kp2[m.trainIdx].pt)
src_pts.append(kp1[m.queryIdx].pt)
src_pts = np.int32(src_pts)
dst_pts = np.int32(dst_pts)
F, mask = cv2.findFundamentalMat(src_pts, dst_pts, cv2.FM_LMEDS)
# We select only inlier points
src_pts = src_pts[mask.ravel() == 1]
dst_pts = dst_pts[mask.ravel() == 1]

# # 计算极线
# img11 = img1
# img22 = img2
# # Find epilines corresponding to points in right image (second image) and
# # drawing its lines on left image
# lines1 = cv2.computeCorrespondEpilines(dst_pts.reshape(-1, 1, 2), 2, F)
# lines1 = lines1.reshape(-1, 3)
# img5, img6 = drawlines(img11, img22, lines1, src_pts, dst_pts)
# # Find epilines corresponding to points in left image (first image) and
# # drawing its lines on right image
# lines2 = cv2.computeCorrespondEpilines(src_pts.reshape(-1, 1, 2), 1, F)
# lines2 = lines2.reshape(-1, 3)
# img3, img4 = drawlines(img22, img11, lines2, dst_pts, src_pts)
# plt.subplot(121), plt.imshow(img5)
# plt.subplot(122), plt.imshow(img3)
# plt.show()

# 极线校正
rectified_results = cv2.stereoRectifyUncalibrated(
src_pts.reshape(-1, 2), dst_pts.reshape(-1, 2), F, img1.shape[:2]
)
rectified_img1 = rectified_results[1]
rectified_img2 = rectified_results[2]
rectified_img1 = cv2.warpPerspective(img1, rectified_img1, img1.shape[:2][::-1])
rectified_img2 = cv2.warpPerspective(img2, rectified_img2, img2.shape[:2][::-1])
plt.subplot(121), plt.imshow(rectified_img1)
plt.subplot(122), plt.imshow(rectified_img2)
plt.show()

标签:src,plt,dst,内参,opencv,rectified,img1,pts,极线
From: https://www.cnblogs.com/xmyingg/p/18082432

相关文章

  • Debug环境配置能编译、调试,而 Release 却不能编译,找不到opencv_world480d.lib,我的解决
    这个问题弄了好久,网上的查看了N多资料,看来问题各不相同,总是弄不好。终于弄好,总结如下几点:1、弄清楚版本号,我用的是VS2017,对应的应该是VC15。opencv_world480d.lib对应的opencv估计是不支持,其目录中只有一个VC16,奇怪的是DEBUG模式认这个手动,将opencv下的VC16改为VC15,......
  • 制作opencv+jdk8容器镜像
    前言 之前使用opencv实现了获取湖泊轮廓,在打包到线上服务器时出现了问题.本来打算自己写一套不使用opencv的代码,但是效果不理想.无奈还是只能继续寻找使用opencv的解决方案.在过程中发现服务器使用了docker普通的安装不起作用.最终只能使用这版解决方案,为避免下次踩坑,......
  • opencv 人脸识别简单尝试
    opencv人脸识别简单尝试闲来无事,尝试着按照网上的教程和代码来实现简单的人脸识别 参考:基于OpenCv的人脸识别(Python完整代码)-CSDN博客 以下为快速配置 (具体的过程请参阅参考链接所提供的原文章) 1、环境搭建实验环境:python3.6+opencv-python3.4.14.51建......
  • opencv读取视频采集卡帧-调整分辨率
    VideoCapturecapture;capture.open(0,CAP_DSHOW); capture.set(CAP_PROP_FRAME_WIDTH,1920); capture.set(CAP_PROP_FRAME_HEIGHT,1080); MatmatFrame; capture.read(matFrame); capture.release();imshow("ShowFrame",matFrame);1-......
  • openCV打开高清摄像头卡顿的问题
    cv2.VideoCapture(camera_number+cv2.CAP_DSHOW)是OpenCV在Windows平台下用于指定使用DirectShow作为视频捕获后端的一种方式。这里的cv2.CAP_DSHOW是一个常量,表示使用DirectShow(DirectXShow)技术来访问和控制摄像头。cv2.CAP_DSHOW参数含义:当你将cv2.CAP_DSHOW与摄像头......
  • OpenCV 配置 VS 2022并识别人脸框出
    文章目录前言一、什么是OpenCV?二、OpenCV的安装和配置1.OpenCV下载2.安装3.配置环境变量4.vs2022环境配置三、OpenCV识别图片人脸四、总结前言在计算机视觉领域,人脸识别是一项具有挑战性且备受关注的任务。借助于开源的计算机视觉库OpenCV,我们可以轻松实现人脸......
  • OpenCV4.9.0开源计算机视觉库安装概述
    上一篇:OpenCV环境变量参考下一篇:​​​​​​​OpenCV4.9.0配置选项参考引言:OpenCV是一款开源的计算机视觉库,可用于实时的图像处理、图形识别、机器学习等领域。它具有跨平台、高速、易用等特点,并广泛应用于各种领域,如医学、安防、自动驾驶、AR/VR等。本文将简要介绍如何基......
  • 交叉编译之opencv-4.1.1
    编译环境:ubuntu22.04;编译工具CMake一、资料下载   opencv-4.1.1:https://github.com/opencv/opencv/archive/4.1.1.zip opencv_contrib-4.1.1:https://github.com/opencv/opencv_contrib/archive/refs/tags/4.1.1.tar.gz 安装cmakesudoaptinstallcmake-qt-gu......
  • 基于opencv的手势识别
            当然可以,下面是一个使用OpenCV实现简单手势识别,并在摄像头捕捉的视频中描绘出手部轮廓为线条的示例。该代码会读取摄像头流,然后检测出手部,并用线条描绘出手的轮廓。  首先,你需要安装OpenCV库。如果你还没有安装,可以使用pip来安装:pipinstallopencv-pyt......
  • 【计算机毕业设计源码】基于OpenCV的人脸检测系统
    项目概况基于OpenCV的人脸检测系统可对人脸进行框线检测,利用OpenCV的检测算法对单个或多个人脸实现框线定位。运行环境基于OpenCV的人脸检测系统运行环境如下:Python:≥3.5OpenCV:≥4.0IDE工具:VisualStudioCode技术栈:Python+OpenCV+PyQt5主要功能基于Ope......