91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Python和OpenCV進(jìn)行圖像拼接

新機(jī)器視覺 ? 來源:新機(jī)器視覺 ? 作者:新機(jī)器視覺 ? 2022-10-26 15:59 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

圖像拼接是計(jì)算機(jī)視覺中最成功的應(yīng)用之一。如今,很難找到不包含此功能的手機(jī)或圖像處理API。在本文中,我們將討論如何使用Python和OpenCV進(jìn)行圖像拼接。也就是,給定兩張共享某些公共區(qū)域的圖像,目標(biāo)是“縫合”它們并創(chuàng)建一個(gè)全景圖像場(chǎng)景。當(dāng)然也可以是給定多張圖像,但是總會(huì)轉(zhuǎn)換成兩張共享某些公共區(qū)域圖像拼接的問題,因此本文以最簡(jiǎn)單的形式進(jìn)行介紹。

本文主要的知識(shí)點(diǎn)包含一下內(nèi)容:

關(guān)鍵點(diǎn)檢測(cè)

局部不變描述符(SIFT,SURF等)

特征匹配

使用RANSAC進(jìn)行單應(yīng)性估計(jì)

透視變換

我們需要拼接的兩張圖像如下:

特征檢測(cè)與提取

給定上述一對(duì)圖像,我們希望將它們縫合以創(chuàng)建全景場(chǎng)景。重要的是要注意,兩個(gè)圖像都需要有一些公共區(qū)域。當(dāng)然,我們上面給出的兩張圖像時(shí)比較理想的,有時(shí)候兩個(gè)圖像雖然具有公共區(qū)域,但是同樣還可能存在縮放、旋轉(zhuǎn)、來自不同相機(jī)等因素的影響。但是無論哪種情況,我們都需要檢測(cè)圖像中的特征點(diǎn)。

關(guān)鍵點(diǎn)檢測(cè)

最初的并且可能是幼稚的方法是使用諸如Harris Corners之類的算法來提取關(guān)鍵點(diǎn)。然后,我們可以嘗試基于某種相似性度量(例如歐幾里得距離)來匹配相應(yīng)的關(guān)鍵點(diǎn)。眾所周知,角點(diǎn)具有一個(gè)不錯(cuò)的特性:角點(diǎn)不變。這意味著,一旦檢測(cè)到角點(diǎn),即使旋轉(zhuǎn)圖像,該角點(diǎn)仍將存在。

但是,如果我們旋轉(zhuǎn)然后縮放圖像怎么辦?在這種情況下,我們會(huì)很困難,因?yàn)榻屈c(diǎn)的大小不變。也就是說,如果我們放大圖像,先前檢測(cè)到的角可能會(huì)變成一條線!

總而言之,我們需要旋轉(zhuǎn)和縮放不變的特征。那就是更強(qiáng)大的方法(如SIFT,SURF和ORB)。

關(guān)鍵點(diǎn)和描述符

諸如SIFT和SURF之類的方法試圖解決角點(diǎn)檢測(cè)算法的局限性。通常,角點(diǎn)檢測(cè)器算法使用固定大小的內(nèi)核來檢測(cè)圖像上的感興趣區(qū)域(角)。不難看出,當(dāng)我們縮放圖像時(shí),該內(nèi)核可能變得太小或太大。為了解決此限制,諸如SIFT之類的方法使用高斯差分(DoD)。想法是將DoD應(yīng)用于同一圖像的不同縮放版本。它還使用相鄰像素信息來查找和完善關(guān)鍵點(diǎn)和相應(yīng)的描述符。

首先,我們需要加載2個(gè)圖像,一個(gè)查詢圖像和一個(gè)訓(xùn)練圖像。最初,我們首先從兩者中提取關(guān)鍵點(diǎn)和描述符。通過使用OpenCV detectAndCompute()函數(shù),我們可以一步完成它。請(qǐng)注意,為了使用detectAndCompute(),我們需要一個(gè)關(guān)鍵點(diǎn)檢測(cè)器和描述符對(duì)象的實(shí)例。它可以是ORB,SIFT或SURF等。此外,在將圖像輸入給detectAndCompute()之前,我們將其轉(zhuǎn)換為灰度。

def detectAndDescribe(image, method=None):
    """
    Compute key points and feature descriptors using an specific method
    """


    assert method is not None, "You need to define a feature detection method. Values are: 'sift', 'surf'"


    # detect and extract features from the image
    if method == 'sift':
        descriptor = cv2.xfeatures2d.SIFT_create()
    elif method == 'surf':
        descriptor = cv2.xfeatures2d.SURF_create()
    elif method == 'brisk':
        descriptor = cv2.BRISK_create()
    elif method == 'orb':
        descriptor = cv2.ORB_create()


    # get keypoints and descriptors
    (kps, features) = descriptor.detectAndCompute(image, None)


    return (kps, features)

我們?yōu)閮蓚€(gè)圖像都設(shè)置了一組關(guān)鍵點(diǎn)和描述符。如果我們使用SIFT作為特征提取器,它將為每個(gè)關(guān)鍵點(diǎn)返回一個(gè)128維特征向量。如果選擇SURF,我們將獲得64維特征向量。下圖顯示了使用SIFT,SURF,BRISK和ORB得到的結(jié)果。

使用ORB和漢明距離檢測(cè)關(guān)鍵點(diǎn)和描述符

使用SIFT檢測(cè)關(guān)鍵點(diǎn)和描述符

使用SURF檢測(cè)關(guān)鍵點(diǎn)和描述符

使用BRISK和漢明距離檢測(cè)關(guān)鍵點(diǎn)和描述符

特征匹配

如我們所見,兩個(gè)圖像都有大量特征點(diǎn)?,F(xiàn)在,我們想比較兩組特征,并盡可能顯示更多相似性的特征點(diǎn)對(duì)。使用OpenCV,特征點(diǎn)匹配需要Matcher對(duì)象。在這里,我們探索兩種方式:暴力匹配器(BruteForce)和KNN(k最近鄰)。

BruteForce(BF)Matcher的作用恰如其名。給定2組特征(來自圖像A和圖像B),將A組的每個(gè)特征與B組的所有特征進(jìn)行比較。默認(rèn)情況下,BF Matcher計(jì)算兩點(diǎn)之間的歐式距離。因此,對(duì)于集合A中的每個(gè)特征,它都會(huì)返回集合B中最接近的特征。對(duì)于SIFT和SURF,OpenCV建議使用歐幾里得距離。對(duì)于ORB和BRISK等其他特征提取器,建議使用漢明距離。我們要使用OpenCV創(chuàng)建BruteForce Matcher,一般情況下,我們只需要指定2個(gè)參數(shù)即可。第一個(gè)是距離度量。第二個(gè)是是否進(jìn)行交叉檢測(cè)的布爾參數(shù)。具體代碼如下:

def createMatcher(method,crossCheck):

“Create and return a Matcher Object”

if method == ‘sift’ or method == ‘surf’:

bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=crossCheck)

elif method == ‘orb’ or method == ‘brisk’:

bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=crossCheck)

return bf

交叉檢查布爾參數(shù)表示這兩個(gè)特征是否具有相互匹配才視為有效。換句話說,對(duì)于被認(rèn)為有效的一對(duì)特征(f1,f2),f1需要匹配f2,f2也必須匹配f1作為最接近的匹配。此過程可確保提供更強(qiáng)大的匹配功能集,這在原始SIFT論文中進(jìn)行了描述。

但是,對(duì)于要考慮多個(gè)候選匹配的情況,可以使用基于KNN的匹配過程。KNN不會(huì)返回給定特征的單個(gè)最佳匹配,而是返回k個(gè)最佳匹配。需要注意的是,k的值必須由用戶預(yù)先定義。如我們所料,KNN提供了更多的候選功能。但是,在進(jìn)一步操作之前,我們需要確保所有這些匹配對(duì)都具有魯棒性。

比率測(cè)試

為了確保KNN返回的特征具有很好的可比性,SIFT論文的作者提出了一種稱為比率測(cè)試的技術(shù)。一般情況下,我們遍歷KNN得到匹配對(duì),之后再執(zhí)行距離測(cè)試。對(duì)于每對(duì)特征(f1,f2),如果f1和f2之間的距離在一定比例之內(nèi),則將其保留,否則將其丟棄。同樣,必須手動(dòng)選擇比率值。

本質(zhì)上,比率測(cè)試與BruteForce Matcher的交叉檢查選項(xiàng)具有相同的作用。兩者都確保一對(duì)檢測(cè)到的特征確實(shí)足夠接近以至于被認(rèn)為是相似的。下面2個(gè)圖顯示了BF和KNN Matcher在SIFT特征上的匹配結(jié)果。我們選擇僅顯示100個(gè)匹配點(diǎn)以清晰顯示。

使用KNN和SIFT的定量測(cè)試進(jìn)行功能匹配

在SIFT特征上使用暴力匹配器進(jìn)行特征匹配

需要注意的是,即使做了多種篩選來保證匹配的正確性,也無法完全保證特征點(diǎn)完全正確匹配。盡管如此,Matcher算法仍將為我們提供兩幅圖像中最佳(更相似)的特征集。接下來,我們利用這些點(diǎn)來計(jì)算將兩個(gè)圖像的匹配點(diǎn)拼接在一起的變換矩陣。

這種變換稱為單應(yīng)矩陣。簡(jiǎn)而言之,單應(yīng)性是一個(gè)3x3矩陣,可用于許多應(yīng)用中,例如相機(jī)姿態(tài)估計(jì),透視校正和圖像拼接。它將點(diǎn)從一個(gè)平面(圖像)映射到另一平面。

估計(jì)單應(yīng)性

隨機(jī)采樣一致性(RANSAC)是用于擬合線性模型的迭代算法。與其他線性回歸器不同,RANSAC被設(shè)計(jì)為對(duì)異常值具有魯棒性。

像線性回歸這樣的模型使用最小二乘估計(jì)將最佳模型擬合到數(shù)據(jù)。但是,普通最小二乘法對(duì)異常值非常敏感。如果異常值數(shù)量很大,則可能會(huì)失敗。RANSAC通過僅使用數(shù)據(jù)中的一組數(shù)據(jù)估計(jì)參數(shù)來解決此問題。下圖顯示了線性回歸和RANSAC之間的比較。需要注意數(shù)據(jù)集包含相當(dāng)多的離群值。

我們可以看到線性回歸模型很容易受到異常值的影響。那是因?yàn)樗噲D減少平均誤差。因此,它傾向于支持使所有數(shù)據(jù)點(diǎn)到模型本身的總距離最小的模型。包括異常值。相反,RANSAC僅將模型擬合為被識(shí)別為點(diǎn)的點(diǎn)的子集。

這個(gè)特性對(duì)我們的用例非常重要。在這里,我們將使用RANSAC來估計(jì)單應(yīng)矩陣。事實(shí)證明,單應(yīng)矩陣對(duì)我們傳遞給它的數(shù)據(jù)質(zhì)量非常敏感。因此,重要的是要有一種算法(RANSAC),該算法可以從不屬于數(shù)據(jù)分布的點(diǎn)中篩選出明顯屬于數(shù)據(jù)分布的點(diǎn)。

估計(jì)了單應(yīng)矩陣后,我們需要將其中一張圖像變換到一個(gè)公共平面上。在這里,我們將對(duì)其中一張圖像應(yīng)用透視變換。透視變換可以組合一個(gè)或多個(gè)操作,例如旋轉(zhuǎn),縮放,平移或剪切。我們可以使用OpenCV warpPerspective()函數(shù)。它以圖像和單應(yīng)矩陣作為輸入。

# Apply panorama correction
width = trainImg.shape[1] + queryImg.shape[1]
height = trainImg.shape[0] + queryImg.shape[0]


result = cv2.warpPerspective(trainImg, H, (width, height))
result[0:queryImg.shape[0], 0:queryImg.shape[1]] = queryImg


plt.figure(figsize=(20,10))
plt.imshow(result)


plt.axis('off')
plt.show()

如我們所見,結(jié)果中包含了兩個(gè)圖像中的內(nèi)容。另外,我們可以看到一些與照明條件和圖像邊界邊緣效應(yīng)有關(guān)的問題。理想情況下,我們可以執(zhí)行一些處理技術(shù)來標(biāo)準(zhǔn)化亮度,例如直方圖匹配,這會(huì)使結(jié)果看起來更真實(shí)和自然一些。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    2380

    瀏覽量

    66814
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4877

    瀏覽量

    90081

原文標(biāo)題:使用OpenCV進(jìn)行圖像全景拼接

文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    沒有專利的opencv-python 版本

    所有 官方發(fā)布的 opencv-python 核心版本(無 contrib 擴(kuò)展)都無專利風(fēng)險(xiǎn)——專利問題僅存在于 opencv-contrib-python 擴(kuò)展模塊中的少數(shù)算法(如早期 SIFT
    發(fā)表于 12-13 12:37

    硬件融合拼接器與軟件融合拼接的區(qū)別?

    、內(nèi)存和存儲(chǔ)設(shè)備等組成,具備強(qiáng)大的計(jì)算和數(shù)據(jù)處理能力。它可以將多個(gè)圖像拼接成一個(gè)大的全景圖像,這個(gè)過程是在硬件設(shè)備中進(jìn)行的,因此速度較快。 而軟件融合
    的頭像 發(fā)表于 09-28 14:33 ?537次閱讀

    零成本鋼鐵俠手套!樹莓派+OpenCV 秒變手勢(shì)遙控器!

    使用樹莓派和OpenCV實(shí)時(shí)掃描并存儲(chǔ)二維碼使用樹莓派和OpenCV實(shí)現(xiàn)物體與動(dòng)物識(shí)別使用樹莓派、攝像頭和OpenCV進(jìn)行速度檢測(cè)用樹莓派+Open
    的頭像 發(fā)表于 08-16 16:16 ?1293次閱讀
    零成本鋼鐵俠手套!樹莓派+<b class='flag-5'>OpenCV</b> 秒變手勢(shì)遙控器!

    如何使用樹莓派與OpenCV實(shí)現(xiàn)面部和運(yùn)動(dòng)追蹤的云臺(tái)系統(tǒng)?

    使用樹莓派和OpenCV實(shí)時(shí)掃描并存儲(chǔ)二維碼使用樹莓派和OpenCV實(shí)現(xiàn)物體與動(dòng)物識(shí)別使用樹莓派、攝像頭和OpenCV進(jìn)行速度檢測(cè)用樹莓派+Open
    的頭像 發(fā)表于 08-14 17:45 ?1668次閱讀
    如何使用樹莓派與<b class='flag-5'>OpenCV</b>實(shí)現(xiàn)面部和運(yùn)動(dòng)追蹤的云臺(tái)系統(tǒng)?

    【創(chuàng)龍TL3562-MiniEVM開發(fā)板試用體驗(yàn)】問題4 ubuntu鏡像,opencv不能正常工作??

    /simple --trusted-host mirrors.aliyun.com opencv-python 示例代碼 import cv2 # 初始化攝像頭對(duì)象,0通常是默認(rèn)的攝像頭索引 #cap
    發(fā)表于 08-11 22:17

    【GM-3568JHF開發(fā)板免費(fèi)體驗(yàn)】OpenCV開發(fā)環(huán)境安裝和計(jì)數(shù)程序開發(fā)

    、 Android 等系統(tǒng)上運(yùn)行,并通過Python接口簡(jiǎn)化操作。 sudo apt install libopencv-dev python3-opencv 四、OpenCV圖像識(shí)
    發(fā)表于 08-09 13:30

    如何板端編譯OpenCV并搭建應(yīng)用--基于瑞芯微米爾RK3576開發(fā)板

    INSTALL_PYTHON_EXAMPLES=OFF -D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_EXTRA_MODULES_PATH=/home/myir/Downloads
    發(fā)表于 08-08 17:14

    【Milk-V Duo S 開發(fā)板免費(fèi)體驗(yàn)】SDK編譯、人臉檢測(cè)、OpenCV測(cè)試

    -mobile-test ./opencv-mobile-test 生成 200x200 尺寸的 out.jpg 圖像,即實(shí)現(xiàn)圖片壓縮。 該測(cè)試工程可結(jié)合物體識(shí)別模型,實(shí)現(xiàn)輸入圖像的尺寸調(diào)整,為之后的推理和處理等流程提供幫助
    發(fā)表于 07-11 13:48

    itop-3568開發(fā)板機(jī)器視覺opencv開發(fā)手冊(cè)-圖像繪制-畫線

    用 imshow()函數(shù)對(duì)畫線之后的圖像進(jìn)行展示; 第 8 行使用了 waitKey()函數(shù),持續(xù)顯示展示照片直到按鍵的按下。 保存退出之后,在終端界面中輸入以下命令進(jìn)行 python
    發(fā)表于 06-04 10:38

    基于LockAI視覺識(shí)別模塊:C++使用圖像的統(tǒng)計(jì)信息

    和最大值:幫助識(shí)別圖像中的極端像素值及其位置。 2.API文檔 2.1 頭文件 #include <opencv2/opencv.hpp> 2.2 提取興趣區(qū)域(ROI) cv
    發(fā)表于 05-08 10:31

    基于LockAI視覺識(shí)別模塊:C++圖像采集例程

    本文主要演示如何使用LockAI視覺識(shí)別模塊進(jìn)行視頻流的讀取,同時(shí)使用Edit模塊進(jìn)行圖像傳輸?;A(chǔ)知識(shí)講解1.1OpenCV簡(jiǎn)介OpenCV
    的頭像 發(fā)表于 04-30 18:23 ?765次閱讀
    基于LockAI視覺識(shí)別模塊:C++<b class='flag-5'>圖像</b>采集例程

    如何用OpenCV的相機(jī)捕捉視頻進(jìn)行人臉檢測(cè)--基于米爾NXP i.MX93開發(fā)板

    攝像頭)1、安裝python3-opencvaptinstallpython3-opencv(左右移動(dòng)查看全部?jī)?nèi)容)2、查看攝像頭支持的格式與分辨率root@debi
    的頭像 發(fā)表于 04-15 11:51 ?819次閱讀
    如何用<b class='flag-5'>OpenCV</b>的相機(jī)捕捉視頻<b class='flag-5'>進(jìn)行</b>人臉檢測(cè)--基于米爾NXP i.MX93開發(fā)板

    快速部署!米爾全志T527開發(fā)板的OpenCV行人檢測(cè)方案指南

    sudo apt-get install libopencv-dev python3-opencv 2.在全志T527開發(fā)板?安裝pipsudo apt-get install python3-pip 二
    發(fā)表于 04-11 18:14

    異形拼接處理器支持哪些顯示技術(shù)?

    能夠支持液晶顯示屏的拼接,液晶顯示屏因其高分辨率、高色彩飽和度以及良好的穩(wěn)定性,在商鋪櫥窗、展覽展示等領(lǐng)域得到了廣泛應(yīng)用。 2、無縫拼接: 通過內(nèi)置的高精度圖像處理算法,異形拼接處理器
    的頭像 發(fā)表于 04-01 09:48 ?756次閱讀

    異形拼接處理器可以實(shí)現(xiàn)的效果

    異形拼接處理器可以實(shí)現(xiàn)的效果非常多樣化和創(chuàng)新,以下是對(duì)其可實(shí)現(xiàn)效果的進(jìn)一步補(bǔ)充: 一、創(chuàng)意拼接顯示 1、任意角度拼接:異形拼接處理器支持0~360度任意角度的
    的頭像 發(fā)表于 03-21 12:39 ?691次閱讀
    異形<b class='flag-5'>拼接</b>處理器可以實(shí)現(xiàn)的效果