范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

使用OpenCV和Python进行图像拼接

  么是图像拼接呢?简单来说,对于输入应该有一组图像,输出是合成图像。同时,必须保留图像之间的逻辑流。
  首先让我们了解图像拼接的概念。基本上,如果你想捕捉一个大的场景,你的相机只能提供一个特定分辨率的图像(如:640×480),这当然不足以捕捉大的全景。所以,我们可以做的是捕捉整个场景的多个图像,然后把所有的碎片放在一起,形成一个大的图像。这些有序的照片被称为全景。获取多幅图像并将其转换成全景图的整个过程称为图像拼接。
  首先,需要安装opencv 3.4.2.16。
  接下来我们将导入我们将在Python代码中使用的库:
  在我们的教程中,我们将拍摄这张精美的照片,我们会将其分成两张左右两张照片,然后我们会尝试拍摄相同或非常相似的照片。
  因此,我将此图像切成两个图像,它们会有某种重叠区域:
  在此,我们将列出我们应采取的步骤,以取得最终的结果:计算左右图像的筛选关键点和描述符。计算一个图像中的每个描述符与另一个图像中的每个描述符之间的距离。为图像的每个描述符选择最佳匹配项。运行RANSAC以估计单应性。 Warp对齐以便拼接。最后将它们拼接在一起。
  因此,从第一步开始,我们将导入这两个图像并将它们转换为灰度,如果您使用的是大图像,我建议您使用cv2.resize,因为如果您使用较旧的计算机,它可能会非常慢并且需要很长时间。如果要调整图像大小,即调整50%,只需将fx = 1更改为fx = 0.5即可。
  我们还需要找出两幅图像中匹配的特征。我们将使用opencv_contrib的SIFT描述符。SIFT (Scale constant Feature Transform)是一种非常强大的OpenCV算法。这些最匹配的特征作为拼接的基础。我们提取两幅图像的关键点和sift描述符如下:
  kp1和kp2是关键点,des1和des2是图像的描述符。如果我们用特征来画这幅图,它会是这样的:cv2.imshow("original_image_left_keypoints",cv2.drawKeypoints(img_,kp1,None))
  左边的图像显示实际图像。右侧的图像使用SIFT检测到的特征进行注释:
  一旦你有了两个图像的描述符和关键点,我们就会发现它们之间的对应关系。我们为什么要这么做?为了将任意两个图像连接成一个更大的图像,我们必须找到重叠的点。这些重叠的点会让我们根据第一幅图像了解第二幅图像的方向。根据这些公共点,我们就能知道第二幅图像是大是小还是旋转后重叠,或者缩小/放大后再fitted。所有此类信息的产生是通过建立对应关系来实现的。这个过程称为registration。
  对于匹配图像,可以使用opencv提供的FLANN或BFMatcher方法。我会写两个例子证明我们会得到相同的结果。两个示例都匹配两张照片中更相似的特征。当我们设置参数k = 2时,这样我们就要求knnMatcher为每个描述符给出2个最佳匹配。"matches"是列表的列表,其中每个子列表由"k"个对象组成。以下是Python代码:
  FLANN匹配代码:
  BFMatcher匹配代码:
  通常在图像中,图像的许多地方可能存在许多特征。所以我们过滤掉所有的匹配来得到最好的。因此我们使用上面得到的前2个匹配项进行比值检验。如果下面定义的比值大于指定的比值,则考虑匹配。
  现在我们定义在图像上绘制线条的参数,并给出输出以查看当我们在图像上找到所有匹配时的样子:
  这是输出的匹配图像:
  这部分完整Python代码:import cv2
  import numpy as np
  img_ = cv2.imread("original_image_left.jpg")
  #img_ = cv2.resize(img_, (0,0), fx=1, fy=1)
  img1 = cv2.cvtColor(img_,cv2.COLOR_BGR2GRAY)
  img = cv2.imread("original_image_right.jpg")
  #img = cv2.resize(img, (0,0), fx=1, fy=1)
  img2 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  sift = cv2.xfeatures2d.SIFT_create()
  # find the key points and descriptors with SIFT
  kp1, des1 = sift.detectAndCompute(img1,None)
  kp2, des2 = sift.detectAndCompute(img2,None)
  #cv2.imshow("original_image_left_keypoints",cv2.drawKeypoints(img_,kp1,None))
  #FLANN_INDEX_KDTREE = 0
  #index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
  #search_params = dict(checks = 50)
  #match = cv2.FlannBasedMatcher(index_params, search_params)
  match = cv2.BFMatcher()
  matches = match.knnMatch(des1,des2,k=2)
  good = []
  for m,n in matches:
  if m.distance < 0.03*n.distance:
  good.append(m)
  draw_params = dict(matchColor = (0,255,0), # draw matches in green color
  singlePointColor = None,
  flags = 2)
  img3 = cv2.drawMatches(img_,kp1,img,kp2,good,None,**draw_params)
  cv2.imshow("original_image_drawMatches.jpg", img3)
  因此,一旦我们获得了图像之间的最佳匹配,我们的下一步就是计算单应矩阵。如前所述,单应矩阵将与最佳匹配点一起使用,以估计两个图像内的相对方向变换。
  在OpenCV中估计单应性是一项简单的任务,只需一行代码:H, __ = cv2.findHomography(srcPoints, dstPoints, cv2.RANSAC, 5)
  在开始编码拼接算法之前,我们需要交换图像输入。所以img_现在会取右图像img会取左图像。
  那么让我们进入拼接编码:
  因此,首先,我们将最小匹配条件count设置为10(由MIN_MATCH_COUNT定义),并且只有在匹配良好的匹配超出所需匹配时才进行拼接。否则,只需显示一条消息,说明匹配不够。
  因此,在if语句中,我们将关键点(从匹配列表)转换为findHomography()函数的参数。
  只需在这段代码中讨论cv2.imshow("original_image_overlapping.jpg",img2),我们就会显示我们收到的图像重叠区域:
  因此,一旦我们建立了单应性,我们需要扭曲视角,我们将以下单应矩阵应用于图像:warped_image = cv2.warpPerspective(image, homography_matrix, dimension_of_warped_image)
  所以我们使用如下:
  在上面两行Python代码中,我们从两个给定的图像中获取重叠区域。然后在"dst"中我们只接收到没有重叠的图像的右侧,因此在第二行代码中我们将左侧图像放置到最终图像。所以在这一点上我们完全拼接了图像:
  剩下的就是去除图像的黑色,所以我们将编写以下代码来从所有图像边框中删除黑边:
  这是我们调用修剪边界的最终定义函数,同时我们在屏幕上显示该图像。如果您愿意,也可以将其写入磁盘:
  使用上面的Python代码,我们将首先收到原始图片:
  这是完整的最终代码:import cv2
  import numpy as np
  img_ = cv2.imread("original_image_right.jpg")
  #img_ = cv2.imread("original_image_left.jpg")
  #img_ = cv2.resize(img_, (0,0), fx=1, fy=1)
  img1 = cv2.cvtColor(img_,cv2.COLOR_BGR2GRAY)
  img = cv2.imread("original_image_left.jpg")
  #img = cv2.imread("original_image_right.jpg")
  #img = cv2.resize(img, (0,0), fx=1, fy=1)
  img2 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  sift = cv2.xfeatures2d.SIFT_create()
  # find key points
  kp1, des1 = sift.detectAndCompute(img1,None)
  kp2, des2 = sift.detectAndCompute(img2,None)
  #cv2.imshow("original_image_left_keypoints",cv2.drawKeypoints(img_,kp1,None))
  #FLANN_INDEX_KDTREE = 0
  #index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
  #search_params = dict(checks = 50)
  #match = cv2.FlannBasedMatcher(index_params, search_params)
  match = cv2.BFMatcher()
  matches = match.knnMatch(des1,des2,k=2)
  good = []
  for m,n in matches:
  if m.distance < 0.03*n.distance:
  good.append(m)
  draw_params = dict(matchColor=(0,255,0),
  singlePointColor=None,
  flags=2)
  img3 = cv2.drawMatches(img_,kp1,img,kp2,good,None,**draw_params)
  #cv2.imshow("original_image_drawMatches.jpg", img3)
  MIN_MATCH_COUNT = 10
  if len(good) > MIN_MATCH_COUNT:
  src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2)
  dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2)
  M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
  h,w = img1.shape
  pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2)
  dst = cv2.perspectiveTransform(pts, M)
  img2 = cv2.polylines(img2,[np.int32(dst)],True,255,3, cv2.LINE_AA)
  #cv2.imshow("original_image_overlapping.jpg", img2)
  else:
  print("Not enought matches are found - %d/%d", (len(good)/MIN_MATCH_COUNT))
  dst = cv2.warpPerspective(img_,M,(img.shape[1] + img_.shape[1], img.shape[0]))
  dst[0:img.shape[0],0:img.shape[1]] = img
  cv2.imshow("original_image_stitched.jpg", dst)
  def trim(frame):
  #crop top
  if not np.sum(frame[0]):
  return trim(frame[1:])
  #crop top
  if not np.sum(frame[-1]):
  return trim(frame[:-2])
  #crop top
  if not np.sum(frame[:,0]):
  return trim(frame[:,1:])
  #crop top
  if not np.sum(frame[:,-1]):
  return trim(frame[:,:-2])
  return frame
  cv2.imshow("original_image_stitched_crop.jpg", trim(dst))
  #cv2.imsave("original_image_stitched_crop.jpg", trim(dst))
  在本教程中,我们学习了如何使用OpenCV执行图像拼接和全景构造,并编写了最终的图像拼接代码。
  我们的图像拼接算法需要四个主要步骤:检测关键点和提取局部不变描述符; 获得图像之间的匹配描述符; 应用RANSAC估计单应矩阵; 使用单应矩阵应用warping transformation。
  当仅为两个图像构建全景图时,该算法在实践中工作良好。

如何看待国家发改委要求不得新建500米以上超高层建筑?对超高建筑的迷恋早已融入人类文明的骨血中,高度即权力,高大建筑历来被作为图腾仰望。高大建筑展示了由上与向下的空间关系,上是抬头仰望,用高度来矮化别人下是一种高度的俯瞰,权威的意象。混凝土建筑可以变成可充电电池一些研究人员想在混凝土结构中建造可充电电池。混凝土的消耗量仅次于水,是世界上消耗量最大的材料。混凝土已经环绕在我们周围的建筑环境中,研究人员一直在探索用混凝土储存电能,从根本上把建微信执行新规定,这两项功能或将开始收费,愿你没在其中在互联网高速发展的时代背景下,我们很多生活习惯也随之有所变化,从原本需要现金交易,到现在只需要你有带手机,扫一下商家的二维码就可以付款了,这也是现在最流行的交易方式移动支付。这也多接下来城市化究竟怎么搞,城市功能由谁来定?(上)中国社会科学院农村发展研究所2月17日发布的中国农村发展报告2020中预计,到2025年中国城镇化率将达65。5,新增农村转移人口8000万人以上。根据以往城市化的经验,农村人进城接下来城市化究竟怎么搞,城市功能由谁来定?(下)在今后五年还将有8000万人进城!接下来城市化竟怎么搞,城市功能由谁来定?(上)一文中,我们分析了城市化面临的问题以及城市化的内涵,我们认为,如今城市发展已经到了从城市化到城市深化八种培养积极身体意象的方法拒绝饮食炒作什么是身体意象?身体意象是一个人对自己身体的审美或性吸引力的感知。也就是说身体在我们自己眼中的样子。它总是在消极和积极之间来回波动。负面的身体意象,比如总穿一件老旧的衣服,随着年龄为什么野马不用钉马蹄铁?直接敲个钉子下去,马不会疼吗?作者吴一千大家好,我是一千,今天给大家介绍有关马蹄的趣事儿。马是人类最忠实的战友,无论是用作战争的坐骑,还是平日的交通运输,马在人类历史文化中,都扮演着非常重要的角色。马的祖先是始暴雨中,正在驾车前行的您,该如何判断?怎样应对?一场帝王将相都没遇到的千年暴雨,却让九州心腹十省通衢的郑州人民遭遇到了,往日熙熙攘攘的街道,迅速聚水成灾,硕大的汽车在洪水里面,就像在煮的饺子一样,左摇右晃,上下翻动,让人后怕不已当年692分考入人大,毕业却嫁贫农连生6娃的伍继红,现状如何离骚路漫漫其修远兮,吾将上下而求索。世人常说读书不一定有好的出路,但不读书一定没有好出路。这句话似乎说的也很有道理。在贫穷年代,要想有好出路,那就必须得读书,书读得越多前途自然也就1000个神奇网站让我帮你百度一下精品资源分享NO。KM218101帮你百度一下文章编辑一林适用系统网页端(手机电脑端均适用)日常生活中总有人会问xxx是什么意思啊?,怎么查xxx呀?,xxx是什么呀?诸如此类的问2021将实行户口合并,抓紧时间办三件事,错过以后就难了现在农村的发展也越来越快速了,不再是以前那个落后的样子了。我国对于农村也是大力扶持。并且我国还颁布了户籍制度,建议户口合并。其实主要就是为了能够减少农村与城市的差距。那么什么是户口
月球竟然在地球大气层里面,而且这个发现迟到了二十年最近的一项研究提出,地球的大气层延伸到至少100个地球半径,约630000千米(km)处,这也意味着月球其实也在大气层中。不管你还记不记得地理课本上对大气层的具体定义,你一定会觉得NASA飞行器拍摄到火星河道!比地球的河道更深更宽据美国太空网27日报道,美国科学家的一项新研究表明,在大约37亿年前,在失去大部分大气层后很长时间,火星才有大河,火星河流持续了数十亿年,很可能在不到10亿年前才完全干涸,且火星河中国发现内有森林的巨大天坑科学未知的物种可能隐藏在这个巨大的洞中。这个巨大的喀斯特天坑,在中国中部湖北省宣恩县洛泉岩村的底部生长着植物。这不是广西壮族自治区发现的天坑中国科学家团队发现了一个巨大的新天坑,其巴哈达龙奇怪的尖刺原来是大自然的绝妙发明,令人惊叹那天晚上我没睡。我被一个问题折磨着恐龙听什么样的音乐?上网一搜,没有给我答案我没有找到一个恐龙类音乐团!但我遇到了南美最赛博朋克的巴哈达龙!即使你是一个真正的恐龙学家,你也可能没有德雷克方程预测有多少外星文明的数学宇宙中只有我们吗?这是科学试图回答的最大问题之一。许多人倾向于认为地球之外确实存在生命。毕竟,有几十亿个星系,每个星系都有几十亿颗恒星。当然,其中肯定有其他类地行星和类日恒星能够孕黑洞无毛与黑洞有毛这是一个非常有趣的科学故事,也是物理学天文学研究的最前沿的方向。科学家约克惠勒,在60年前首次提出黑洞无毛概念。最初,黑洞无毛只是一种猜测。直至20世纪70年代,才有了严格的数学证天舟四号发货太空快递送达来源人民网北京时间2022年5月10日1时56分,搭载天舟四号货运飞船的长征七号遥五运载火箭,在我国文昌航天发射场点火发射,发射取得圆满成功。这是我国载人航天工程的第二十二次发射任被病痛折磨的地球霸主在我们的印象中,大部分恐龙都身材高大,健康壮硕,尽显地球霸主的威严,就像神话中的生物。但是它们也要呼吸要进食,同样也会受病痛折磨。而几千万年之后的今天,曾经折磨过恐龙的一些疾病仍在这个世界是真实的吗?这个世界是真实的吗?有人会说,是真实的,因为我就是活生生地生活了三四十年呐?也许,事实并非如此。下面要介绍的是几个经典实验1。双缝实验,或者应该是恐怖的双缝实验。中学物理课本上会有打开手电筒,朝着天空照射1秒后,发出的光能不能飞到宇宙边缘?大家都知道,光速是宇宙中的第一速度。其实在地球上,光的速度也是超越一切的存在,你们知道它的速度是多少吗?光速是指光波或电磁波在真空或介质中的传播速度根据光在空气中的折射率为1。00嫦娥五号采集的月球样本获重大发现,延长月球地质寿命近10亿年我国科学家,通过对嫦娥五号采集的月球样本进行科学研究,获得了重大发现,延长月球地质寿命近10亿年,那么今天我们就来聊聊这个话题。嫦娥五号是中国首个实施无人月面取样返回的月球探测器。