基于Python的Opencv入門教程第二大部分(P1.識別物體的前置工作)
書接上文(doge)
計算對象
現(xiàn)在,我們將改變方向,開始編寫另外一個圖片的相關(guān)程序。
在接下來的幾節(jié)中,我們將學(xué)習(xí)如何使用創(chuàng)建一個簡單的Python+OpenCV腳本來計算下圖中俄羅斯方塊的數(shù)量:

一路上,我們將:
學(xué)習(xí)如何使用OpenCV將圖像轉(zhuǎn)換為灰度
執(zhí)行邊緣檢測
灰度圖像閾值化
查找、計數(shù)和繪制等高線
傳導(dǎo)侵蝕和膨脹
掩蔽圖像
繼續(xù)并關(guān)閉下載的第一個腳本,然后打開opencv_tutorial_02.py開始第二個示例:
在第3-5行,我們導(dǎo)入我們的包。這在每個Python腳本開始時都是必需的。對于第二個腳本,我導(dǎo)入了argparse—一個命令行參數(shù)解析包,它是所有Python安裝都附帶的。(就是不需要額外安裝的)
快速瀏覽第8-11行。這些行允許我們在運行時從終端內(nèi)部向程序提供附加信息。命令行參數(shù)在PyImageSearch博客和所有其他計算機(jī)科學(xué)領(lǐng)域中都大量使用。
我鼓勵您在本文中閱讀它們:Python、argparse和命令行參數(shù)。
(以下是“Python、argparse和命令行參數(shù)”所指的網(wǎng)址:https://pyimagesearch.com/2018/03/12/python-argparse-command-line-arguments/?_ga=2.27194741.919642978.1642226886-1706104520.1639213599)
我們有一個必需的命令行參數(shù)--image,如第9行和第10行所定義的。
下面我們將學(xué)習(xí)如何使用所需的命令行參數(shù)運行腳本?,F(xiàn)在,只要知道在腳本中遇到args[“image”]時,我們指的是輸入圖像的路徑。
轉(zhuǎn)換圖片的灰度
我們將圖像加載到第14行的內(nèi)存中。將參數(shù)設(shè)置為CV2。imread函數(shù)是包含在args字典中的路徑,該字典由“image”鍵args[“image”]引用。
從那里,我們顯示圖像,直到遇到第一個按鍵(第15行和第16行)。
我們將很快對圖像中的邊緣進(jìn)行閾值化和檢測。因此,我們在第19行通過調(diào)用CV2將圖像轉(zhuǎn)換為灰度。cvtColor并提供圖像和CV2。顏色為灰旗。
我們再次顯示圖像并等待按鍵(第20行和第21行)。

轉(zhuǎn)換為灰度的結(jié)果如下圖所示。(上圖為還未經(jīng)過處理的原圖)

邊緣檢測
邊緣檢測對于在圖像中查找對象的邊界非常有用-它對于分割非常有效。
讓我們執(zhí)行邊緣檢測,以了解該過程是如何工作的:
使用流行的Canny算法(由John F.Canny于1986年開發(fā)),我們可以找到圖像中的邊緣。
我們?yōu)?a class='article-link' target='_blank' href='//www.bilibili.com/read/cv2?from=articleDetail'>CV2提供了三個參數(shù)。Canny函數(shù):
img:灰色圖像。
minVal:最小閾值,在我們的例子中是30。
maxVal:最大閾值,在我們的示例中為150。
aperture_size(孔徑大小):Sobel內(nèi)核大小。默認(rèn)情況下,該值為3,因此不會顯示在第24行。
最小和最大閾值的不同值將返回不同的邊貼圖。
在下圖中,請注意俄羅斯方塊的邊緣是如何與組成俄羅斯方塊的子方塊一起顯示的:

閾值
圖像閾值處理是圖像處理流程中的一個重要中間步驟。閾值化可以幫助我們?nèi)コ龍D像中較亮或較暗的區(qū)域和輪廓。
我強烈建議您嘗試閾值設(shè)置。我通過嘗試和錯誤(以及經(jīng)驗)調(diào)整了以下代碼以適用于我們的示例:
在一行(第29行)中,我們是:
抓取灰度圖像中大于225的所有像素,并將其設(shè)置為0(黑色),這與圖像的背景相對應(yīng)
將像素值設(shè)置為小于225到255(白色),對應(yīng)于圖像的前景(即俄羅斯方塊自身)。
有關(guān)CV2的更多信息。閾值函數(shù),包括閾值標(biāo)志如何工作,請務(wù)必參考官方OpenCV文檔。
用二值圖像分割前景和背景是找到輪廓的關(guān)鍵(我們的下一步)。

請注意,在上圖中,前景對象為白色,背景為黑色。

備注
閾值?[ yù zhí ]:
閾值又叫臨界值,是指一個效應(yīng)能夠產(chǎn)生的最低值或最高值。
注意:這個程序與普通的程序運行的方式不同,不能直接使用Pycharm的Run鍵運行,也不能在終端中直接使用 python?文件名.py 運行,不然會報錯?。?!
運行代碼如下:(要在終端打開程序所在我文件夾才能打開)

還有,一定要先配置好你的虛擬環(huán)境!!!不然會一直報錯。(預(yù)計之后會出一個教程)
挖坑ing(doge)