python和opencv
① Linux下怎麼配置python和opencv
以下說明在Linux下Python和OpenCV結合安裝的過程,Python要使用OpenCV模塊,則必須導入OpenCV提供的包,所以要提供Python支持,首先在安裝OpenCV前安裝必要的組件,一般列表如下:
1、gcc g++一般系統自帶
2、cmake 編譯OpenCV時使用,需要手動安裝
3、pkg-config命令,一般系統自帶,如果缺少,使用 yum -y install pkg-config 安裝
4、Python 2.x,系統自帶
5、NumPy 一個用於大型矩陣處理的庫,這個必須!如果不安裝則後面OpenCV安裝後也編譯不出來Python的模塊,其他庫可以後來安裝
最後一步是安裝OpenCV
在保證前4項沒問題的情況下,開始安裝NumPy模塊,官網下載地址為:http://www.scipy.org/scipylib/download.html
進入SourceForge下載,地址為:https://sourceforge.net/projects/numpy/
直接點擊Download即可下載,下載成功之後上傳到Linux伺服器,安裝過程很簡單,解壓後直接安裝即可(之前要確保python-devel已經安裝)
unzip numpy-1.11.1.zip
cd numpy-1.11.1/
python setup.py install
另外numpy還可以去python官網下載:https://pypi.python.org/pypi/numpy
安裝成功之後接下來進一步安裝OpenCV,官方網站為:http://opencv.org/進入後點擊DOWNLOADS來到下載界面:http://opencv.org/downloads.html,這里下載2.4.13的版本
下載完之後上傳到Linux,執行接下來的安裝:
unzip opencv-2.4.13.zip
cd opencv-2.4.13/
cmake -D WITH_GTK_2_X=ON -D CMAKE_INSTALL_PREFIX=/usr/local .
make # make -j4表示開4個線程來進行編譯
make install
安裝過程時間可能會有點長10~30分鍾左右,編譯完成之後OpenCV就安裝到了指定的/usr/local下面的一些目錄中,庫文件就安裝到了/usr/local/lib下,Python的模塊安裝位置是:/usr/local/lib/python2.7/site-packages,執行 ls /usr/local/lib/python2.7/site-packages/ 可以看到兩個文件,一個是cv2.so一個是cv.py
這兩個文件在剛才opencv-2.4.13編譯的目錄下面lib/下也存在著兩個python模塊文件,但是不幸的是現在並不能直接使用,原因是我們操作系統python依賴包的位置是/usr/lib/python2.7下,所以剛才如果編譯到/usr下是直接可以用的,不過這個也不重要,只要我們將這兩個文件復制到正確的目錄下,那麼就能正常使用OpenCV的功能了,執行: cp /usr/local/lib/python2.7/site-packages/cv* /usr/lib/python2.7/site-packages/ 復制過去之後進入python互動式界面執行 import cv2 沒有報錯則安裝成功
可以寫一個測試的小案例,在伺服器上有一張圖片是test.jpg現在簡單的使用cv2模塊解析成圖像矩陣,然後再寫入磁碟文件中,代碼如下:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import cv2
image = cv2.imread("test.jpg")
print image
cv2.imwrite("test1.jpg",image)
這里將原有的test.jpg生成test1.jpg,
執行 python cvtest.py 執行完後會發現輸出好多矩陣變數,並且生成了test1.jpg文件
生成的文件有可能比原文件大也有可能小,具體根據圖像來決定,現在查看一下圖片內容,和之前是一樣的
② 如何在Python中使用OpenCV的
0.下載安裝Opencv,當前版本為249.
1.下載Python,當前OPencv版本為249,不過其支持的最新版本的Python為2.7,所以可以下載276版本。
2.下載numpy,開始我使用了1.6,沒有通過,錯誤如圖。下載了最新的1.8.1版本。
3.將Opencv安裝目錄下opencvuildpython2.7x86中的cv2.pyd復制到python安裝目錄Libsite-packages下。
4.找到opencv源文件內的draw.py運行。
~如果你認可我的回答,請及時點擊【採納為滿意回答】按鈕
~~手機提問的朋友在客戶端右上角評價點【滿意】即可。
~你的採納是我前進的動力
~~O(∩_∩)O,記得好評和採納,互相幫助,謝謝。
③ opencv用c++還是python好
python更好。
opencv內置支持的主要語言為python和c++,如果你用戶不是特別大)(比如10000次以上的人臉識別每秒),一般python就綽綽有餘了。當然如果是安卓客戶端的話,還是c++或java方便點,如果是後台或者樹莓派之類的,python就更方便。
這里有個python的例子。
opencv 3.3+已經內置了人臉識別功能。
可以很輕松的完成相關畢業設計。
使用OpenCV提供的預先訓練的深度學習面部檢測器模型,可快速,准確的進行人臉識別。
Python優點:
學習難易:Python與C++對比是一門易於學習的語言所以很適合作為第一門語言來學習編程。
可視化調試:Matplotlib進行結果可視化這方法,與C++的窗體調試比起來那是好了很多啊。
④ 目標跟蹤(5)使用 Opencv 和 Python 進行對象跟蹤
在本教程中,我們將學習如何基於 Opencv 和 Python 實現對象跟蹤。
首先必須明確目標檢測和目標跟蹤有什麼區別:
我們將首先討論對象檢測,然後討論如何將對象跟蹤應用於檢測。
可能有不同的應用,例如,計算某個區域有多少人,檢查傳送帶上有多少物體通過,或者計算高速公路上的車輛。
當然,看過本教程後,您會很容易地想到數以千計的想法應用於現實生活或可能應用於工業。
在本教程中,我們將使用 3 個文件:
首先我們需要調用highway.mp4文件並創建一個mask:
正如您在示例代碼中看到的,我們還使用了 函數,該函數返回背景比率(background ratio),然後創建mask。
mask可視化結果:
但是,如您所見,圖像中有很多噪點。因此,讓我們通過刪除所有較小的元素來改進提取,並將我們的注意力集中在大於某個面積的對象上。
使用 OpenCV 的cv2.drawContours函數繪制輪廓,我們得到了這個結果。
就本教程而言,分析整個窗口並不重要。我們只對計算在某個點通過的所有車輛感興趣,因此,我們必須定義一個感興趣的區域 ROI 並僅在該區域應用mask。
結果可視化如下:
函數 cv2. 是在開始時添加的,沒有定義參數,現在讓我們看看如何進一步改進我們的結果。history是第一個參數,在這種情況下,它設置為 100,因為相機是固定的。varThreshold改為 40,因為該值越低,誤報的可能性就越大。在這種情況下,我們只對較大的對象感興趣。
在繼續處理矩形之前,我們對圖像進行了進一步的清理。為此,閾值函數就派上用場了。從我們的mask開始,我們告訴它我們只想顯示白色或黑色值,因此通過編寫254, 255,只會考慮 254 和 255 之間的值。
然後我們將找到的對象的坐標插入到 if 條件中並繪制矩形
這是最終結果:
我們現在只需導入和集成跟蹤功能。
一旦創建了對象,我們必須獲取邊界框的每個位置並將它們插入到單個數組中。
通過在屏幕上顯示結果,您可以看到所有通過 ROI 的通道是如何被識別的,以及它們的位置是如何插入到特定的數組中的。顯然,識別的摩托車越多,我們的數組就越大。
現在讓我們將帶有位置的數組傳遞給tracker.update()。我們將再次獲得一個包含位置的數組,但此外,將為每個對象分配一個唯一的 ID。
從代碼中可以看出,我們可以使用 for 循環分析所有內容。此時我們只需要繪制矩形並顯示車輛 ID。
在圖像中,您可以看到結果
main.py
從視頻中也可以看到,我們已經獲得了我們在本教程開始時設置的結果。
但是,您必須將其視為練習或起點,因為關於這個主題有很多話要說,而本教程的目的只是讓您了解對象跟蹤的原理。
如果你想將 Object Tracking 集成到你的項目中,你應該使用更可靠和先進的對象檢測方法,以及跟蹤方法。
完整代碼地址:私信「333」直接獲取或者「鏈接」
⑤ OpenCV-Python系列八:提取圖像輪廓
當你完成圖像分割之後,圖像輪廓檢測往往可以進一步篩選你要的目標,OpenCV中可以使用cv2.findContours來得到輪廓。
補充 :
再不少場景中,找輪廓的最小外接矩形是基本需求,opencv中minAreaRect得到的是一個帶有旋轉角度信息的rect,可以使用cv2.boxPoints(rect)來將其轉為矩形的四個頂點坐標(浮點類型).你也可以使用cv2.polylines來繪制這樣的輪廓信息
注意findContours參數的變化,在opencv4中,返回值只有contours和hierarchy ,這一點與opencv3中不同。對與輪廓的層級結構,比較難用,雖然可以通過輪廓的層級結構來進行索引你需要的輪廓,不過對於大部分機器視覺應用場景,二值化的結果有時候很難預料,單單通過這種層級關系索引,非常容易出錯。所以,只找最外部結構的 cv2.RETR_EXTERNAL 是不是真香呢?
處理cv2.approxPolyDP()外,你也可以使用cv2.convexHull來求輪廓的近似凸包,其中凸形狀內部--任意兩點連線都在該形狀內部。
clockwise :默認為False,即輪廓為逆時針方向進行排列;
returnPoints :設置為False會返回與凸包上對應的輪廓的點索引值,設置為True,則會返回凸包上的點坐標集,默認為True
對於opencv-python的提取圖像輪廓部分有問題歡迎留言, Have Fun With OpenCV-Python, 下期見。
⑥ 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以及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的問題了!
希望這些能幫助到你!
⑨ opencv和python下,對圖片的讀取程序報錯如何解決
1、需要用到其他模塊的函數,如:
for i in range(20) #循環次數
image=cv2.imread("D:\picture\%d.jpg"%(i))#路徑自己選擇。
2、可以先升級你的pip,另外看看你的版本是否匹配,包括py版本和32位64位。
3、關於python下使用opencv讀取圖像。首先需要導入opencv包,上面說的那個Ipython並沒有opencv包,所以想使用的請先正確導入opencv包再說,至於怎麼導入,先下載個opencv包,裡面有關於python的opencv包。
以下照片是關於Ipython的運行界面: