導航:首頁 > 編程語言 > python加opencv

python加opencv

發布時間:2023-09-14 00:52:24

Ⅰ OpenCV+python特徵提取演算法與圖像描述符之SIFT / SURF / ORB

演算法效果比較博文

用於表示和量化圖像的數字列表,簡單理解成將圖片轉化為一個數字列表世灶表示。特徵向量中用來描述圖片的各種屬性的向量稱為特徵矢量。

參考
是一種演算法和方法,輸入1個圖像,返回多個特徵向量(主要用來處理圖像的局部,往往會把多個特徵向量組成一個一維的向量)。主要用於圖像匹配(視覺檢測),匹配圖像中的物品。

SIFT論文
原理
opencv官網解釋
實質是在不同的尺度空間上查找關鍵點(特徵點),並計算出關鍵點的方向。SIFT所查找到的關鍵點是一些十分突出,不會因光照,仿射變換和噪音等因素而變化的點,如角點、邊緣點、暗區的亮點及亮區的暗點等。

尺度不變特徵轉換(Scale-invariant feature transform或SIFT)是一種電腦視覺的演算法用來偵測與描述影像中的局部性特徵,它在空間尺度中尋找極值點,並提取出其位置、尺度、旋轉不變數。
其應用范圍包含物體辨識、機器人地圖感知與導航、影像縫合、3D模型建立、手勢辨識、影像追蹤和動作比對。

對現實中物體的描述一定要在一個十分重要的前提下進行,這個前提就是對自然界建模時的尺度。當用一個機器視覺系統分析未知場景時,計算機沒有辦法預先知道圖像中物體的尺度,因此我們需要同時考慮圖像在多尺度下的描述,獲知感興趣物體的最佳尺度。圖像的尺度空間表達指的是圖像的所有尺度下的描述。

KeyPoint數據結構解析

SURF論文
原理
opencv官網解釋
SURF是SIFT的加速版,它善於處理具有模糊和旋轉的圖像,但是不善於處理視角變化和光照變化。在SIFT中使用DoG對LoG進行近似,而在SURF中使用盒子濾波器對LoG進行近似,這樣就可以使用積分圖像了(計算圖像中某個窗口內所有像素和時,計算量的大小與窗口大小無關)。總之,SURF最大的特點在於採用了Haar特徵以及積分圖改團像的概念,大大加快了程序的運行效率。

因為專利原因,OpenCV3.3開核返橘始不再免費開放SIFT\SURF,需要免費的請使用ORB演算法

ORB演算法綜合了FAST角點檢測演算法和BRIEFF描述符。

演算法原理
opencv官方文檔
FAST只是一種特徵點檢測演算法,並不涉及特徵點的特徵描述。

論文
opencv官方文檔
中文版
Brief是Binary Robust Independent Elementary Features的縮寫。這個特徵描述子是由EPFL的Calonder在ECCV2010上提出的。主要思路就是在特徵點附近隨機選取若干點對,將這些點對的灰度值的大小,組合成一個二進制串,並將這個二進制串作為該特徵點的特徵描述子。文章同樣提到,在此之前,需要選取合適的gaussian kernel對圖像做平滑處理。

1:不具備旋轉不變性。
2:對雜訊敏感
3:不具備尺度不變性。

ORB論文
OpenCV官方文檔

ORB採用了FAST作為特徵點檢測運算元,特徵點的主方向是通過矩(moment)計算而來解決了BRIEF不具備旋轉不變性的問題。
ORB還做了這樣的改進,不再使用pixel-pair,而是使用9×9的patch-pair,也就是說,對比patch的像素值之和,解決了BRIEF對雜訊敏感的問題。
關於計算速度:
ORB是sift的100倍,是surf的10倍。

對圖片數據、特徵分布的一種統計
對數據空間(bin)進行量化

Kmeans

邊緣:尺度問題->不同的標准差 捕捉到不同尺度的邊緣
斑點 Blob:二階高斯導數濾波LoG

關鍵點(keypoint):不同視角圖片之間的映射,圖片配准、拼接、運動跟蹤、物體識別、機器人導航、3D重建

SIFT\SURF

Ⅱ 使用OpenCV和Python進行圖像拼接

么是圖像拼接呢?簡單來說,對於輸入應該有一組圖像,輸出是合成圖像。同時,必須保留圖像之間的邏輯流。

首先讓我們了解圖像拼接的概念。基本上,如果你想捕捉一個大的場景,你的相機只能提供一個特定解析度的圖像(如:640×480),這當然不足以捕捉大的全景。所以,我們可以做的是捕捉整個場景的多個圖像,然後把所有的碎片放在一起,形成一個大的圖像。這些有序的照片被稱為全景。獲取多幅圖像並將其轉換成全景圖的整個過程稱為圖像拼接。

首先,需要安裝opencv 3.4.2.16。

接下來我們將導入我們將在Python代碼中使用的庫:

在我們的教程中,我們將拍攝這張精美的照片,我們會將其分成兩張左右兩張照片,然後我們會嘗試拍攝相同或非常相似的照片。

因此,我將此圖像切成兩個圖像,它們會有某種重疊區域:

在此,我們將列出我們應採取的步驟,以取得最終的結果:

因此,從第一步開始,我們將導入這兩個圖像並將它們轉換為灰度,如果您使用的是大圖像,我建議您使用cv2.resize,因為如果您使用較舊的計算機,它可能會非常慢並且需要很長時間。如果要調整圖像大小,即調整50%,只需將fx = 1更改為fx = 0.5即可。

我們還需要找出兩幅圖像中匹配的特徵。我們將使用opencv_contrib的SIFT描述符。SIFT (Scale constant Feature Transform)是一種非常強大的OpenCV演算法。這些最匹配的特徵作為拼接的基礎。我們提取兩幅圖像的關鍵點和sift描述符如下:

kp1和kp2是關鍵點,des1和des2是圖像的描述符。如果我們用特徵來畫這幅圖,它會是這樣的:

左邊的圖像顯示實際圖像。右側的圖像使用SIFT檢測到的特徵進行注釋:

一旦你有了兩個圖像的描述符和關鍵點,我們就會發現它們之間的對應關系。我們為什麼要這么做?為了將任意兩個圖像連接成一個更大的圖像,我們必須找到重疊的點。這些重疊的點會讓我們根據第一幅圖像了解第二幅圖像的方向。根據這些公共點,我們就能知道第二幅圖像是大是小還是旋轉後重疊,或者縮小/放大後再fitted。所有此類信息的產生是通過建立對應關系來實現的。這個過程稱為registration。

對於匹配圖像,可以使用opencv提供的FLANN或BFMatcher方法。我會寫兩個例子證明我們會得到相同的結果。兩個示例都匹配兩張照片中更相似的特徵。當我們設置參數k = 2時,這樣我們就要求knnMatcher為每個描述符給出2個最佳匹配。「matches」是列表的列表,其中每個子列表由「k」個對象組成。以下是Python代碼:

FLANN匹配代碼:

BFMatcher匹配代碼:

通常在圖像中,圖像的許多地方可能存在許多特徵。所以我們過濾掉所有的匹配來得到最好的。因此我們使用上面得到的前2個匹配項進行比值檢驗。如果下面定義的比值大於指定的比值,則考慮匹配。

現在我們定義在圖像上繪制線條的參數,並給出輸出以查看當我們在圖像上找到所有匹配時的樣子:

這是輸出的匹配圖像:

這部分完整Python代碼:

因此,一旦我們獲得了圖像之間的最佳匹配,我們的下一步就是計算單應矩陣。如前所述,單應矩陣將與最佳匹配點一起使用,以估計兩個圖像內的相對方向變換。

在OpenCV中估計單應性是一項簡單的任務,只需一行代碼:

在開始編碼拼接演算法之前,我們需要交換圖像輸入。所以img_現在會取右圖像img會取左圖像。

那麼讓我們進入拼接編碼:

因此,首先,我們將最小匹配條件count設置為10(由MIN_MATCH_COUNT定義),並且只有在匹配良好的匹配超出所需匹配時才進行拼接。否則,只需顯示一條消息,說明匹配不夠。

因此,在if語句中,我們將關鍵點(從匹配列表)轉換為findHomography()函數的參數。

只需在這段代碼中討論cv2.imshow(「original_image_overlapping.jpg」,img2),我們就會顯示我們收到的圖像重疊區域:

因此,一旦我們建立了單應性,我們需要扭曲視角,我們將以下單應矩陣應用於圖像:

所以我們使用如下:

在上面兩行Python代碼中,我們從兩個給定的圖像中獲取重疊區域。然後在「dst」中我們只接收到沒有重疊的圖像的右側,因此在第二行代碼中我們將左側圖像放置到最終圖像。所以在這一點上我們完全拼接了圖像:

剩下的就是去除圖像的黑色,所以我們將編寫以下代碼來從所有圖像邊框中刪除黑邊:

這是我們調用修剪邊界的最終定義函數,同時我們在屏幕上顯示該圖像。如果您願意,也可以將其寫入磁碟:

使用上面的Python代碼,我們將首先收到原始圖片:

這是完整的最終代碼:

在本教程中,我們學習了如何使用OpenCV執行圖像拼接和全景構造,並編寫了最終的圖像拼接代碼。

我們的圖像拼接演算法需要四個主要步驟:檢測關鍵點和提取局部不變描述符; 獲得圖像之間的匹配描述符; 應用RANSAC估計單應矩陣; 使用單應矩陣應用warping transformation。

當僅為兩個圖像構建全景圖時,該演算法在實踐中工作良好。

Ⅲ python怎麼安裝opencv

1.安裝Numpy
安裝pip
若上面安裝出現沒找到python,先安裝pip。輸入python -m pip install -U pip
安裝pip
安裝完後將pip的路徑加到PATH里,例如」C:Python27Scripts」
再安裝numpy
現在開始安裝numpy,打開cmd,輸入pip install numpy
安裝numpy
測試:
測試numpy
1.安裝opencv
在官網自行下載,這里下載的是opencv2.4.10安裝。
(1)復制cv2.pyd
將」opencvuildpython2.7x64」或」opencvuildpython2.7x86」(根據python版本)文件夾中找到cv2.pyd」,復制到Python安裝文件的」C:Python27Libsite-packages」文件夾中。
測試:
測試opencv
使用pycharm,用下面代碼進行測試:
import cv2
import numpy as np
img = cv2.imread("C:lena.jpg")
cv2.imshow("lena",img)
cv2.waitKey(10000)

Ⅳ 在python中已經安裝過opencv了,可是運行還是報錯

我們是世紀的幸運兒,更要懂得幸福生活的來之不易。我們要發奮學習,艱苦樸素,不辜負先烈們
寄託在我們身上的希望。正因如此,我們更應該珍惜擁有的一切。我們要靠今天的努力,為祖國貢獻一
份力量,這是對革命先烈們的最好回報!
參觀過後,我們又來到了生態園野炊。同學們圍坐在一起,談笑風生,讓我感到欣慰的是:我們心
中已經埋下了愛護大自然的意識--盡管我們製造了不少垃圾,但同學們都非常自覺的清理著垃圾。
收拾得井井有條,地面上沒有一點兒殘留的剩物。

在返回的途中,我自信的對老師說:「這次春遊我受益非淺,長天後,我一定要繼承革命先烈遺
志,成為國家的有用之才。那麼,我就要從現在做起,不僅要發奮圖強,努力學習,更要懂得做一個感
因之人!"這次春遊將成為我最美好的回憶!

Ⅳ 論述在Python程序中如何導入OpenCV以及matplotlib庫中的pyplot

首先分兩個:第一個:

Python程序中如何導入OpenCV

解決方法:

找到opencv源代碼中的cv2文件夾

復制到anaconda的lib文件夾中

再導入cv2,就好了。

然後python 3.7中導入

沒有安裝anaconda,只安裝了python的也可以將cv2復制到python的安裝路徑下的(C:Program FilesPython37Libsite-packages)文件夾中。

opencv4.3.0中的cv2

是opencv4.3.0可以看到,應該是其支持這幾個版本的python。


現在僅僅是可以將cv2導入,但是由於python和opencv的版本支持問題,並不一定可以使用cv2中所有的方法,若遇到問題,可以在評論區寫下,一起探索下奧。

以上內容為學習交流使用,純屬個人經驗,採納需謹慎!

解決方式如下:

解決方法:更換低版本matplotlib

pip3 uninstall matplotlib就可以解導入matplotlib庫中的pyplot的問題了!

希望這些能幫助到你!

閱讀全文

與python加opencv相關的資料

熱點內容
台達文本編程軟體 瀏覽:716
單片機燒寫器使用視頻 瀏覽:996
拍照哪個app比較好 瀏覽:132
dhcp伺服器不能分配MAC地址 瀏覽:964
java偽隨機數 瀏覽:128
塗色書怎麼解壓 瀏覽:465
三角形圓邊編程 瀏覽:457
手機壓縮文件怎麼壓縮到十兆以下 瀏覽:987
雲主機雲伺服器品牌 瀏覽:345
安卓emulated文件夾如何打開 瀏覽:315
採用fifo頁面置換演算法是 瀏覽:194
如何上網代理伺服器 瀏覽:593
Hro系統源碼 瀏覽:847
寶庫源碼 瀏覽:342
路飛和熊排解壓力 瀏覽:625
php定時更新 瀏覽:357
數控5軸編程培訓一般多久 瀏覽:560
cadpdf圖層 瀏覽:250
用登號器出現伺服器未響應是什麼 瀏覽:905
java演算法是什麼 瀏覽:636