婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > OpenCV-Python 實現兩張圖片自動拼接成全景圖

OpenCV-Python 實現兩張圖片自動拼接成全景圖

熱門標簽:聊城語音外呼系統 ai電銷機器人的優勢 打電話機器人營銷 騰訊地圖標注沒法顯示 孝感營銷電話機器人效果怎么樣 南陽打電話機器人 海外網吧地圖標注注冊 商家地圖標注海報 地圖標注自己和別人標注區別

背景介紹

圖片的全景拼接如今已不再稀奇,現在的智能攝像機和手機攝像頭基本都帶有圖片自動全景拼接的功能,但是一般都會要求拍攝者保持設備的平穩以及單方向的移動取景以實現較好的拼接結果。這是因為拼接的圖片之間必須要有相似的區域以保證拼接結果的準確性和完整性。本文主要簡單描述如何用 Python 和 OpenCV 庫實現兩張圖片的自動拼合,首先簡單介紹一下兩張圖片拼接的原理。

基本原理

要實現兩張圖片的簡單拼接,其實只需找出兩張圖片中相似的點 (至少四個,因為 homography 矩陣的計算需要至少四個點), 計算一張圖片可以變換到另一張圖片的變換矩陣 (homography 單應性矩陣),用這個矩陣把那張圖片變換后放到另一張圖片相應的位置 ( 就是相當于把兩張圖片中定好的四個相似的點給重合在一起)。如此,就可以實現簡單的全景拼接。當然,因為拼合之后圖片會重疊在一起,所以需要重新計算圖片重疊部分的像素值,否則結果會很難看。所以總結起來其實就兩個步驟:

1. 找兩張圖片中相似的點,計算變換矩陣

2. 變換一張圖片放到另一張圖片合適的位置,并計算重疊區域新的像素值 (這里就是圖片融合所需要采取的策略)

具體實現

尋找相似點

當然,我們可以手動的尋找相似的點,但是這樣比較麻煩。因為相似點越多或者相似點對應的位置越準確,所得的結果就越好,但是人的肉眼所找的位置總是有誤差的,而且找出很多的點也不是一件容易的事。所以就有聰明的人設計了自動尋找相似點的算法,這里我們就用了 SIFT 算法,而 OpenCV 也給我們提供 SIFT 算法的接口,所以我們就不需要自己費力去實現了。如下是兩張測試圖片的原圖和找出相似點后的圖片。

其中紅色的點是 SIFT 算法找出的相似點,而綠色的線表示的是在所有找出的相似的點中所篩選出的可信度更高的相似的點。因為算法找出的相似點并不一定是百分百正確的。然后就可以根據這些篩選出的相似點計算變換矩陣,當然 OpenCV 也提供了相應的接口方便我們的計算,而具體的代碼實現也可以在 OpenCV 的 Python tutorial 中找到 [1]。

圖片拼接

計算出變換矩陣后,接下來就是第二步,用計算出的變換矩陣對其中一張圖做變換,然后把變換的圖片與另一張圖片重疊在一起,并重新計算重疊區域新的像素值。對于計算重疊區域的像素值,其實可以有多種方法去實現一個好的融合效果,這里就用最簡單粗暴的但效果也不錯的方式。直白來說就是實現一個圖像的線性漸變,對于重疊的區域,靠近左邊的部分,讓左邊圖像內容顯示的多一些,靠近右邊的部分,讓右邊圖像的內容顯示的多一些。用公式表示就是,假設 alpha 表示像素點橫坐標到左右重疊區域邊界橫坐標的距離,新的像素值就為 newpixel = 左圖像素值 × (1 - alpha) + 右圖像素值 × alpha 。這樣就可以實現一個簡單的融合效果,如果想實現更復雜或更好的效果,可以去搜索和嘗試一下 multi-band 融合,這里就不過多贅述了。最后附上實現的結果和代碼,可供參考。

Python 代碼如下:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

if __name__ == '__main__':
    top, bot, left, right = 100, 100, 0, 500
    img1 = cv.imread('test1.jpg')
    img2 = cv.imread('test2.jpg')
    srcImg = cv.copyMakeBorder(img1, top, bot, left, right, cv.BORDER_CONSTANT, value=(0, 0, 0))
    testImg = cv.copyMakeBorder(img2, top, bot, left, right, cv.BORDER_CONSTANT, value=(0, 0, 0))
    img1gray = cv.cvtColor(srcImg, cv.COLOR_BGR2GRAY)
    img2gray = cv.cvtColor(testImg, cv.COLOR_BGR2GRAY)
    sift = cv.xfeatures2d_SIFT().create()
    # find the keypoints and descriptors with SIFT
    kp1, des1 = sift.detectAndCompute(img1gray, None)
    kp2, des2 = sift.detectAndCompute(img2gray, None)
    # FLANN parameters
    FLANN_INDEX_KDTREE = 1
    index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
    search_params = dict(checks=50)
    flann = cv.FlannBasedMatcher(index_params, search_params)
    matches = flann.knnMatch(des1, des2, k=2)

    # Need to draw only good matches, so create a mask
    matchesMask = [[0, 0] for i in range(len(matches))]

    good = []
    pts1 = []
    pts2 = []
    # ratio test as per Lowe's paper
    for i, (m, n) in enumerate(matches):
        if m.distance  0.7*n.distance:
            good.append(m)
            pts2.append(kp2[m.trainIdx].pt)
            pts1.append(kp1[m.queryIdx].pt)
            matchesMask[i] = [1, 0]

    draw_params = dict(matchColor=(0, 255, 0),
                       singlePointColor=(255, 0, 0),
                       matchesMask=matchesMask,
                       flags=0)
    img3 = cv.drawMatchesKnn(img1gray, kp1, img2gray, kp2, matches, None, **draw_params)
    plt.imshow(img3, ), plt.show()

    rows, cols = srcImg.shape[:2]
    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 = cv.findHomography(src_pts, dst_pts, cv.RANSAC, 5.0)
        warpImg = cv.warpPerspective(testImg, np.array(M), (testImg.shape[1], testImg.shape[0]), flags=cv.WARP_INVERSE_MAP)

        for col in range(0, cols):
            if srcImg[:, col].any() and warpImg[:, col].any():
                left = col
                break
        for col in range(cols-1, 0, -1):
            if srcImg[:, col].any() and warpImg[:, col].any():
                right = col
                break

        res = np.zeros([rows, cols, 3], np.uint8)
        for row in range(0, rows):
            for col in range(0, cols):
                if not srcImg[row, col].any():
                    res[row, col] = warpImg[row, col]
                elif not warpImg[row, col].any():
                    res[row, col] = srcImg[row, col]
                else:
                    srcImgLen = float(abs(col - left))
                    testImgLen = float(abs(col - right))
                    alpha = srcImgLen / (srcImgLen + testImgLen)
                    res[row, col] = np.clip(srcImg[row, col] * (1-alpha) + warpImg[row, col] * alpha, 0, 255)

        # opencv is bgr, matplotlib is rgb
        res = cv.cvtColor(res, cv.COLOR_BGR2RGB)
        # show the result
        plt.figure()
        plt.imshow(res)
        plt.show()
    else:
        print("Not enough matches are found - {}/{}".format(len(good), MIN_MATCH_COUNT))
        matchesMask = None

Reference

[1] OpenCV tutorial: https://docs.opencv.org/3.4.1/d1/de0/tutorial_py_feature_homography.html

到此這篇關于OpenCV-Python 實現兩張圖片自動拼接成全景圖的文章就介紹到這了,更多相關OpenCV 圖片自動拼接成全景圖內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • OpenCV全景圖像拼接的實現示例
  • python opencv進行圖像拼接
  • opencv2基于SURF特征提取實現兩張圖像拼接融合
  • python+OpenCV實現圖像拼接
  • Python+OpenCV實現圖像的全景拼接
  • python opencv 圖像拼接的實現方法
  • OpenCV實現多圖像拼接成一張大圖
  • opencv實現多張圖像拼接

標簽:牡丹江 南寧 六盤水 聊城 揚州 迪慶 楊凌 撫州

巨人網絡通訊聲明:本文標題《OpenCV-Python 實現兩張圖片自動拼接成全景圖》,本文關鍵詞  OpenCV-Python,實現,兩張,圖片,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《OpenCV-Python 實現兩張圖片自動拼接成全景圖》相關的同類信息!
  • 本頁收集關于OpenCV-Python 實現兩張圖片自動拼接成全景圖的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久久影院官网| 亚洲精品老司机| 日韩国产在线一| 亚洲欧美日韩中文字幕一区二区三区| 高清beeg欧美| 免费久久精品视频| 日本一二三不卡| 欧美精品日韩一区| 色老头久久综合| 国产乱子轮精品视频| 丝袜美腿高跟呻吟高潮一区| 国产精品三级电影| www国产亚洲精品久久麻豆| 日本韩国欧美一区| 国产成人一级电影| 91同城在线观看| 国产成人免费视频网站高清观看视频| 国产成人免费视频网站高清观看视频| 日韩午夜在线观看视频| 91玉足脚交白嫩脚丫在线播放| 青青草精品视频| 天涯成人国产亚洲精品一区av| 国产精品国产自产拍高清av| 欧美成人一区二区三区在线观看| 91亚洲国产成人精品一区二区三| 日韩黄色片在线观看| 欧美日韩精品一区二区| 26uuu久久综合| 91网站最新地址| 国产精品综合久久| 国产凹凸在线观看一区二区 | 国产一区二区在线观看视频| 三级成人在线视频| 蜜桃视频第一区免费观看| 免费成人在线观看视频| 毛片av一区二区| 成人黄色小视频在线观看| 成人激情综合网站| 精品污污网站免费看| 在线不卡一区二区| 久久精品视频免费| 午夜久久久影院| 国产高清精品在线| 欧美午夜精品久久久久久孕妇 | 欧美在线观看视频在线| 欧美日韩精品综合在线| 久久久久久97三级| 亚洲第一久久影院| av不卡一区二区三区| 欧美日韩国产综合一区二区三区| 91麻豆精品国产91久久久更新时间| 91日韩一区二区三区| 制服丝袜在线91| 欧美一区二区私人影院日本| 久久久91精品国产一区二区三区| 国产精品天天摸av网| 卡一卡二国产精品| 亚洲综合成人在线| jvid福利写真一区二区三区| 日韩精品一区二区在线观看| 在线播放欧美女士性生活| 国产精品传媒在线| 老司机午夜精品| 高清成人在线观看| 欧洲在线/亚洲| 久久久欧美精品sm网站| 午夜伦理一区二区| 91蜜桃视频在线| 欧美巨大另类极品videosbest| 日韩欧美综合一区| 国产精品一品二品| 国产精品久久久爽爽爽麻豆色哟哟| 狠狠色丁香婷婷综合| 国产成人无遮挡在线视频| 精品国产一区二区三区不卡 | 亚洲成av人片在www色猫咪| 在线观看中文字幕不卡| 日韩美女视频一区二区在线观看| 亚洲精品亚洲人成人网在线播放| 国产精品国产自产拍高清av王其 | 美国欧美日韩国产在线播放| 天天色图综合网| 国产麻豆精品一区二区| 久久久www成人免费毛片麻豆| 中文无字幕一区二区三区 | 国产精品一区二区在线观看网站| 国产午夜亚洲精品羞羞网站| 97se狠狠狠综合亚洲狠狠| 亚洲午夜三级在线| 亚洲欧洲成人精品av97| 91精品久久久久久久久99蜜臂| 色综合天天综合在线视频| 蜜臀99久久精品久久久久久软件| 亚洲女人****多毛耸耸8| 中文字幕人成不卡一区| 欧美群妇大交群的观看方式| 国产福利精品一区| 欧美大片在线观看| 欧美伊人久久久久久午夜久久久久| 一级特黄大欧美久久久| 91国偷自产一区二区开放时间 | 欧美日韩一区二区三区高清| 欧美中文字幕亚洲一区二区va在线| 一本一道综合狠狠老| 欧美成人性福生活免费看| 欧美日韩一区国产| 精品久久久影院| 国产精品美女久久久久久久久久久 | 欧美一卡在线观看| 91九色02白丝porn| 日本高清不卡在线观看| 色婷婷久久久综合中文字幕| 精品国产伦一区二区三区免费| 一区二区国产视频| 色av一区二区| 婷婷久久综合九色国产成人| 韩国欧美一区二区| 欧美精品久久久久久久久老牛影院| 精品电影一区二区三区| 国产精品网站在线播放| 午夜视频久久久久久| 欧美日韩激情一区二区| 国产精品美女久久久久久久| 麻豆国产精品一区二区三区| 欧美日韩国产片| 视频一区免费在线观看| 777亚洲妇女| 午夜精品久久久久久久99水蜜桃| 91成人在线精品| 国产精品国模大尺度视频| 成人黄色网址在线观看| 亚洲精选一二三| 丰满放荡岳乱妇91ww| 国产日韩欧美不卡在线| 成人免费高清视频| 久久这里只有精品6| 国产成人综合在线观看| 国产精品美女久久久久aⅴ国产馆| 国产一区二区三区最好精华液| 久久久亚洲高清| 91成人在线精品| 国产福利91精品一区| 亚洲国产欧美一区二区三区丁香婷| 欧美视频自拍偷拍| 激情综合网最新| 一区二区三区日韩欧美| 欧美男生操女生| 99久久免费国产| 日韩国产高清在线| 国产精品免费视频网站| 成人精品一区二区三区中文字幕 | 精品国产一区二区国模嫣然| 一区二区久久久久久| 9191国产精品| 91社区在线播放| 国产精品一区二区黑丝| 日韩av电影天堂| 亚洲综合网站在线观看| 国产精品色眯眯| 欧美日韩国产精品成人| www.日韩精品| voyeur盗摄精品| 成人性生交大片| 国产成人av一区二区三区在线| 亚洲国产综合色| 亚洲一区在线观看免费 | 亚洲国产一区二区三区| 亚洲人xxxx| 一区二区三区在线高清| 国产欧美日韩麻豆91| 日本一区二区三区dvd视频在线| 国产日韩欧美综合一区| 亚洲福利视频一区二区| 精品国产污网站| 国产精品沙发午睡系列990531| 欧美韩国日本不卡| 亚洲欧洲日产国产综合网| 中文字幕一区免费在线观看| 国产精品家庭影院| 日韩高清不卡一区二区三区| 青青草成人在线观看| 国产乱码精品一区二区三区av | 911精品国产一区二区在线| 日韩一区二区免费视频| 国产日韩一级二级三级| 亚洲欧美一区二区三区孕妇| 舔着乳尖日韩一区| 激情亚洲综合在线| 色综合婷婷久久| 久久久国际精品| 视频一区欧美精品| 色菇凉天天综合网| 欧美va亚洲va香蕉在线| 一区二区成人在线| 国产精品一区二区在线看| 精品视频一区 二区 三区| 亚洲精品综合在线| 欧美日韩精品一区二区三区蜜桃| 久久女同互慰一区二区三区| 性欧美疯狂xxxxbbbb|