国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

OpenCV完美實(shí)現(xiàn)兩張圖片的全景拼接(詳細(xì)教程)

這篇具有很好參考價(jià)值的文章主要介紹了OpenCV完美實(shí)現(xiàn)兩張圖片的全景拼接(詳細(xì)教程)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

1,主要步驟

1.1??導(dǎo)入需要的包和模塊,并讀取兩張待拼接的圖片,這里我們假設(shè)它們?yōu)?left.jpg 和 right.jpg。

1.2? 創(chuàng)建SIFT檢測(cè)器

1.3?創(chuàng)建一個(gè)基于 FLANN 的匹配器

1.4??篩選過程刪除掉一些不合適的匹配點(diǎn),只保留最好的匹配點(diǎn)

1.5透視變換

1.6??消除重疊的效果,對(duì)兩張圖片進(jìn)行加權(quán)處理

2,代碼展示

3,效果展示


應(yīng)用場(chǎng)景主要有兩個(gè)方面:

  1. 風(fēng)景或建筑物的拍攝

對(duì)于一些風(fēng)景或建筑物的拍攝,有時(shí)候需要的畫面寬度超出了單張圖片所能提供的視野范圍。這時(shí)可以通過拍攝多張圖片并將它們拼接成一張更加寬闊的全景圖來達(dá)到所需的效果。

  1. 科學(xué)研究

在一些科學(xué)研究中,需要對(duì)一定的區(qū)域進(jìn)行高精度測(cè)量,例如地形測(cè)量、海洋測(cè)量等。這時(shí)候就需要一些寬視野相機(jī)來實(shí)現(xiàn)拍攝。但是,由于一張圖片所能覆蓋的區(qū)域有限,因此通常還需要將多張圖片拼接成一張更大的全景圖像,方便科學(xué)家們進(jìn)行研究和分析。

1,主要步驟

  1. 讀入待拼接的圖片并調(diào)整大??;
  2. 使用 SIFT 或 SURF 算法提取圖片的關(guān)鍵點(diǎn)和描述符;
  3. 使用基于 FLANN 的匹配器進(jìn)行關(guān)鍵點(diǎn)匹配,并篩選出較好的匹配點(diǎn);
  4. 計(jì)算視角變換矩陣,并使用透視變換對(duì)右邊的圖片進(jìn)行變換;
  5. 消除重疊的效果,對(duì)兩張圖片進(jìn)行加權(quán)處理;
  6. 輸出拼接后的結(jié)果。

1.1??導(dǎo)入需要的包和模塊,并讀取兩張待拼接的圖片,這里我們假設(shè)它們?yōu)?left.jpg 和 right.jpg。

左視圖:

OpenCV完美實(shí)現(xiàn)兩張圖片的全景拼接(詳細(xì)教程),OpenCV從入門到精通,opencv,人工智能,計(jì)算機(jī)視覺,python

右視圖:

OpenCV完美實(shí)現(xiàn)兩張圖片的全景拼接(詳細(xì)教程),OpenCV從入門到精通,opencv,人工智能,計(jì)算機(jī)視覺,python

1.2? 創(chuàng)建SIFT檢測(cè)器

cv2.xfeatures2d.SIFT_create() 創(chuàng)建一個(gè) SIFT 檢測(cè)器。

也可以選擇使用 cv2.SIFT_create()

不過前者是更新的版本,可能會(huì)更好一些

然后,在兩張圖片上分別使用這個(gè)檢測(cè)器進(jìn)行關(guān)鍵點(diǎn)檢測(cè)和特征提取,獲得關(guān)鍵點(diǎn)集合和描述符集合。

surf=cv2.xfeatures2d.SIFT_create()#可以改為SIFT
#sift = cv2.SIFT_create()
sift = cv2.xfeatures2d.SIFT_create()

kp1,descrip1 = sift.detectAndCompute(imageA,None)
kp2,descrip2 = sift.detectAndCompute(imageB,None)

1.3?創(chuàng)建一個(gè)基于 FLANN 的匹配器

調(diào)用 cv2.FlannBasedMatcher() 創(chuàng)建一個(gè)基于 FLANN 的匹配器,并使用 knnMatch() 處理兩張圖片的特征描述符,得到最佳匹配。

indexParams = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
searchParams = dict(checks=50)
flann=cv2.FlannBasedMatcher(indexParams,searchParams)
match=flann.knnMatch(descrip1,descrip2,k=2)
good=[]

1.4??篩選過程刪除掉一些不合適的匹配點(diǎn),只保留最好的匹配點(diǎn)

for i,(m,n) in enumerate(match):
    if(m.distance<0.75*n.distance):
        good.append(m)

1.5透視變換

判斷滿足條件的匹配點(diǎn)數(shù)量是否大于閾值 MIN,如果大于,則進(jìn)行視角變換矩陣的計(jì)算,將右邊的圖片 imageB 對(duì)其進(jìn)行透視變換,得到 warpImg。

if len(good) > MIN:
    src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1,1,2)
    ano_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1,1,2)
    M,mask = cv2.findHomography(src_pts,ano_pts,cv2.RANSAC,5.0)
    warpImg = cv2.warpPerspective(imageB, np.linalg.inv(M), (imageA.shape[1]+imageB.shape[1], imageB.shape[0]))
    direct=warpImg.copy()
    direct[0:imageA.shape[0], 0:imageB.shape[1]] =imageA
    simple=time.time()

show('res',warpImg)

同時(shí),將左邊的圖片覆蓋在變換后的圖片上,得到 direct。最后,顯示結(jié)果。

print(rows)
print(cols)
for col in range(0,cols):
    # 開始重疊的最左端
    if imageA[:, col].any() and warpImg[:, col].any():
        left = col
        print(left)
        break

for col in range(cols-1, 0, -1):
    #重疊的最右一列
    if imageA[:, col].any() and warpImg[:, col].any():
        right = col
        print(right)
        break

1.6??消除重疊的效果,對(duì)兩張圖片進(jìn)行加權(quán)處理

根據(jù)圖片相對(duì)位置的不同,左邊的圖片和右邊的圖片有可能會(huì)在某些列出現(xiàn)重疊部分,為了消除這種不自然的效果,需要實(shí)現(xiàn)像素級(jí)的混合。首先找到左右圖片開始重疊的位置和結(jié)束的位置,然后對(duì)兩張圖片進(jìn)行加權(quán)處理,最后將加權(quán)后的圖片輸出。

#加權(quán)處理
res = np.zeros([rows, cols, 3], np.uint8)
for row in range(0, rows):
    for col in range(0, cols):
        if not imageA[row, col].any():  # 如果沒有原圖,用旋轉(zhuǎn)的填充
            res[row, col] = warpImg[row, col]
        elif not warpImg[row, col].any():
            res[row, col] = imageA[row, col]
        else:
            srcImgLen = float(abs(col - left))
            testImgLen = float(abs(col - right))
            alpha = srcImgLen / (srcImgLen + testImgLen)
            res[row, col] = np.clip(imageA[row, col] * (1 - alpha) + warpImg[row, col] * alpha, 0, 255)

warpImg[0:imageA.shape[0], 0:imageA.shape[1]]=res
show('res',warpImg)
final=time.time()
print(final-starttime)

2,代碼展示

import cv2
import numpy as np
from matplotlib import pyplot as plt
import time
def show(name,img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
MIN = 10
FLANN_INDEX_KDTREE = 0
starttime = time.time()
img1 = cv2.imread('left.jpg') #query
img2 = cv2.imread('right.jpg') #train
imageA = cv2.resize(img1,(0,0),fx=0.2,fy=0.2)
imageB = cv2.resize(img2,(0,0),fx=0.2,fy=0.2)
surf=cv2.xfeatures2d.SIFT_create()#可以改為SIFT
#sift = cv2.SIFT_create()
sift = cv2.xfeatures2d.SIFT_create()

kp1,descrip1 = sift.detectAndCompute(imageA,None)
kp2,descrip2 = sift.detectAndCompute(imageB,None)
#創(chuàng)建字典
indexParams = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
searchParams = dict(checks=50)
flann=cv2.FlannBasedMatcher(indexParams,searchParams)
match=flann.knnMatch(descrip1,descrip2,k=2)
good=[]
#過濾特征點(diǎn)
for i,(m,n) in enumerate(match):
    if(m.distance<0.75*n.distance):
        good.append(m)

# 當(dāng)篩選后的匹配對(duì)大于10時(shí),計(jì)算視角變換矩陣
if len(good) > MIN:
    src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1,1,2)
    ano_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1,1,2)
    M,mask = cv2.findHomography(src_pts,ano_pts,cv2.RANSAC,5.0)
    warpImg = cv2.warpPerspective(imageB, np.linalg.inv(M), (imageA.shape[1]+imageB.shape[1], imageB.shape[0]))
    direct=warpImg.copy()
    direct[0:imageA.shape[0], 0:imageB.shape[1]] =imageA
    simple=time.time()

show('res',warpImg)
rows,cols=imageA.shape[:2]
print(rows)
print(cols)
for col in range(0,cols):
    # 開始重疊的最左端
    if imageA[:, col].any() and warpImg[:, col].any():
        left = col
        print(left)
        break

for col in range(cols-1, 0, -1):
    #重疊的最右一列
    if imageA[:, col].any() and warpImg[:, col].any():
        right = col
        print(right)
        break
#加權(quán)處理
res = np.zeros([rows, cols, 3], np.uint8)
for row in range(0, rows):
    for col in range(0, cols):
        if not imageA[row, col].any():  # 如果沒有原圖,用旋轉(zhuǎn)的填充
            res[row, col] = warpImg[row, col]
        elif not warpImg[row, col].any():
            res[row, col] = imageA[row, col]
        else:
            srcImgLen = float(abs(col - left))
            testImgLen = float(abs(col - right))
            alpha = srcImgLen / (srcImgLen + testImgLen)
            res[row, col] = np.clip(imageA[row, col] * (1 - alpha) + warpImg[row, col] * alpha, 0, 255)

warpImg[0:imageA.shape[0], 0:imageA.shape[1]]=res
show('res',warpImg)
final=time.time()
print(final-starttime)

3,效果展示

OpenCV完美實(shí)現(xiàn)兩張圖片的全景拼接(詳細(xì)教程),OpenCV從入門到精通,opencv,人工智能,計(jì)算機(jī)視覺,python文章來源地址http://www.zghlxwxcb.cn/news/detail-742256.html

到了這里,關(guān)于OpenCV完美實(shí)現(xiàn)兩張圖片的全景拼接(詳細(xì)教程)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 使用ffmpeg拼接兩張圖片

    使用ffmpeg拼接兩張圖片

    ??最近在工作中遇到了一個(gè)需求,就是需要將兩張圖片拼接在一起,作為一個(gè)封面圖。如果只是臨時(shí)拼接一張,我們可以只用photoshop之類的圖片編輯工具,將兩張圖片拼接在一起。而我們的需要是需要實(shí)現(xiàn)自動(dòng)化,由于之前使用過ffmpeg做過圖片的操作,于是搜索了下,ffm

    2024年02月02日
    瀏覽(21)
  • 3 OpenCV兩張圖片實(shí)現(xiàn)稀疏點(diǎn)云的生成

    3 OpenCV兩張圖片實(shí)現(xiàn)稀疏點(diǎn)云的生成

    前文: 1 基于SIFT圖像特征識(shí)別的匹配方法比較與實(shí)現(xiàn) 2 OpenCV實(shí)現(xiàn)的F矩陣+RANSAC原理與實(shí)踐 1.1 由F到E E = K T ? F ? K E = K^T * F * K E = K T ? F ? K E 矩陣可以直接通過之前算好的 F 矩陣與相機(jī)內(nèi)參 K 矩陣獲得 相機(jī)內(nèi)參獲得的方式是一個(gè)較為復(fù)雜的方式,需要使用棋盤進(jìn)行定位獲得

    2024年02月07日
    瀏覽(21)
  • OpenCV Python – 使用SIFT實(shí)現(xiàn)兩張圖片的特征匹配

    OpenCV Python – 使用SIFT實(shí)現(xiàn)兩張圖片的特征匹配

    ?我們使用尺度不變特征變換(? SIFT ?)特征描述符和暴力匹配算法實(shí)現(xiàn)兩張圖像的特征匹配。其中,? SIFT ?用于找到圖像中的關(guān)鍵點(diǎn)和描述符,而? 暴力匹配算法 ?用于在兩張圖像中匹配描述符。 要使用? SIFT ?特征檢查器和? 暴力 ?匹配算法實(shí)現(xiàn)兩張圖像的特征匹配,可

    2024年02月03日
    瀏覽(23)
  • OpenCV Python – 使用SIFT算法實(shí)現(xiàn)兩張圖片的特征匹配

    1.要實(shí)現(xiàn)在大圖中找到任意旋轉(zhuǎn)、縮放等情況下的小圖位置,可以使用特征匹配算法,如 SIFT (尺度不變特征變換) 或 SURF (加速穩(wěn)健特征)。這些算法可以在不同尺度和旋轉(zhuǎn)情況下尋找匹配的特征點(diǎn) 2.我們使用了 SIFT 算法檢測(cè)和匹配特征點(diǎn),然后使用 RANSAC 算法計(jì)算透視變換矩陣

    2024年02月06日
    瀏覽(22)
  • opencv-全景圖像拼接

    運(yùn)行環(huán)境 python3.6 + opencv 3.4.1.15 stitcher.py

    2024年02月11日
    瀏覽(26)
  • Python 結(jié)合opencv實(shí)現(xiàn)圖片截取和拼接

    Python 結(jié)合opencv實(shí)現(xiàn)圖片截取和拼接

    python 3.6.2 scikit-build-0.16.7 win10 opencv_python-4.5.4.60-cp36-cp36m-win_amd64.whl 下載地址: https://pypi.org/project/opencv-python/4.5.4.60/#files https://files.pythonhosted.org/packages/57/6c/7f4f56b2555d5c25dd4f41fc72a16dc6402cb2b4f967da11d8d26c669b55/opencv_python-4.5.4.60-cp36-cp36m-win_amd64.whl 注意:下載時(shí)不用下abi版的,比如 o

    2024年02月08日
    瀏覽(20)
  • 基于MATLAB的Harris角點(diǎn)檢測(cè)完成圖片全景拼接

    基于MATLAB的Harris角點(diǎn)檢測(cè)完成圖片全景拼接

    目錄 作業(yè)概要 1 原理及實(shí)現(xiàn) 1 2.1. 模塊1 Harris角點(diǎn)檢測(cè) 1 根據(jù)角點(diǎn)響應(yīng)函數(shù)計(jì)算每個(gè)像素點(diǎn)的角點(diǎn)響應(yīng)值; 2 2.2. 模塊2 關(guān)鍵點(diǎn)的描述及其匹配 3 2.2.1. 生成描述向量 3 2.2.2. 匹配描述子 4 輸出matched_points和匹配點(diǎn)對(duì)數(shù)count; 5 2.3. 模塊3 轉(zhuǎn)換矩陣的估計(jì) 5 輸出仿射變換矩陣H。 6 2

    2024年01月17日
    瀏覽(92)
  • 使用openCV比對(duì)任意兩張圖片的相似度(親測(cè)較準(zhǔn)確)

    使用openCV比對(duì)任意兩張圖片的相似度(親測(cè)較準(zhǔn)確)

    方案:使用openCV中的直方圖算法做對(duì)比。測(cè)試效果較好。 代碼中提供了均方差算法(MSE)、結(jié)構(gòu)相似性指數(shù)算法(SSIM)、峰值信噪比(PSNR)、直方圖算法。其中直方圖效果最好 Exception in thread \\\"main\\\" java . lang . UnsatisfiedLinkError : no opencv_java455 in java . library . path Exception in threa

    2024年02月16日
    瀏覽(18)
  • MidJourney教程03--BLEND 兩張圖片合成一張圖片

    MidJourney教程03--BLEND 兩張圖片合成一張圖片

    MidJourney教程02--BLEND 兩張圖片合成一張圖片 首先輸入?? 然后會(huì)讓你選擇兩張圖片進(jìn)行處理! ?那么,現(xiàn)在我們把比卡丘,和路飛融合在一起啦! ?接下來看出來效果會(huì)是怎么樣子呢? 那么,我們就得到了一個(gè)路飛比卡丘! 其實(shí)還有很多種方法可以使用! 例如場(chǎng)景與產(chǎn)品的

    2024年02月15日
    瀏覽(26)
  • (OpenCV)圖片拼接

    (OpenCV)圖片拼接

    ????????圖片拼接在許多領(lǐng)域都有廣泛的應(yīng)用,包括但不限于以下幾個(gè)方面: 全景攝影 :在攝影中,通過將多張照片拼接在一起可以實(shí)現(xiàn)全景照片的效果。這在旅游景點(diǎn)、房地產(chǎn)展示等領(lǐng)域有著廣泛的應(yīng)用,能夠提供更加生動(dòng)、真實(shí)的視覺體驗(yàn)。 醫(yī)學(xué)影像處理 :在醫(yī)學(xué)

    2024年02月22日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包