OpenCV 顏色檢測| color detection
OpenCV 顏色檢測
1.導入必要的包并初始化相機
import cv2
import numpy as np
# Reading the image
img = cv2.imread('test.jpg')
# Showing the output
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 從輸入圖像中檢測顏色并創建MASK
# convert to hsv colorspace
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# lower bound and upper bound for Green color
lower_bound = np.array([25, 52, 72])
upper_bound = np.array([100, 255, 255])
# find the colors within the boundaries
mask = cv2.inRange(hsv, lower_bound, upper_bound)
3. 從MASK中去除不必要的噪音
np.ones((7,7),np.uint8) 創建一個 5×5 8 位整數矩陣。
cv2.MORPH_CLOSE 從白色區域中去除不必要的黑噪聲。
cv2.MORPH_OPEN 從遮罩的黑色區域去除白噪聲。
#define kernel size
kernel = np.ones((7,7),np.uint8)
# Remove unnecessary noise from mask
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
4. 在圖像上應用mask
# Segment only the detected region
segmented_img = cv2.bitwise_and(img, img, mask=mask)
5. 繪制檢測到的對象的邊界
# Find contours from the mask
contours, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
output = cv2.drawContours(segmented_img, contours, -1, (0, 0, 255), 3)
# Showing the output
imgs = np.hstack([img, output])
cv2.imshow("Image", imgs)
6. 用矩形方框畫顏色區域 (忽略4到5步驟)
找到區域面積大于300的,加入到color_bounding_rect鏈表里
# For greencolor
mask = cv2.dilate(mask, kernel)
# Creating contour to track red color
contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print('contours', contours)
# print('hierarchy', hierarchy)
color_bounding_rect = list()
min_area = 300
for pic, contour in enumerate(contours):
area = cv2.contourArea(contour)
if (area > min_area):
color_bounding_rect.append(cv2.boundingRect(contour))
7. 畫綠色顏色的方框,并且標上Green
for x, y, w, h in color_bounding_rect:
print('x, y, w, h', x, y, w, h)
img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.putText(img, "green", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255))
cv2.imshow("Image", img)
相關函數解釋
1. cv2.dilate(A, B)
- 此操作包括將圖像 A 與一些內核 (B) 進行卷積,該內核可以具有任何形狀或大小,通常是正方形或圓形。
- 內核 B 有一個定義的錨點,通常是內核的中心。
- 當內核 B 在圖像上掃描時,我們計算與 B 重疊的最大像素值,并將錨點位置的圖像像素替換為該最大值。 正如您可以推斷的那樣,這種最大化操作會導致圖像中的明亮區域“增長”(因此稱為膨脹)。
- 膨脹運算為:
效果如下:
2. cv2.erode(A, B)
和Dilate函數差不多,不一樣的地方是用B做卷機后取最小值
效果如下:
??????????????
3. image,contours,hierarchy = cv2.findContours(contour,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
輸入:
contour:帶有輪廓信息的圖像;
cv2.RETR_TREE:提取輪廓后,輸出輪廓信息的組織形式,除了cv2.RETR_TREE還有以下幾種選項:
- cv2.RETR_EXTERNAL:輸出輪廓中只有外側輪廓信息;
- cv2.RETR_LIST:以列表形式輸出輪廓信息,各輪廓之間無等級關系;
- cv2.RETR_CCOMP:輸出兩層輪廓信息,即內外兩個邊界(下面將會說到contours的數據結構);
- cv2.RETR_TREE:以樹形結構輸出輪廓信息。
cv2.CHAIN_APPROX_SIMPLE:指定輪廓的近似辦法,有以下選項:
- cv2.CHAIN_APPROX_NONE:存儲輪廓所有點的信息,相鄰兩個輪廓點在圖象上也是相鄰的;
- cv2.CHAIN_APPROX_SIMPLE:壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點坐標;
- cv2.CHAIN_APPROX_TC89_L1:使用teh-Chinl chain 近似算法保存輪廓信息。
輸出:
python3里返回三個值:image,contours,hierarchy
image:可能是跟輸入contour類似的一張二值圖;
contours:list結構,列表中每個元素代表一個邊沿信息。每個元素是(x,1,2)的三維向量,x表示該條邊沿里共有多少個像素點,第三維的那個“2”表示每個點的橫、縱坐標;
注意:如果輸入選擇cv2.CHAIN_APPROX_SIMPLE,則contours中一個list元素所包含的x點之間應該用直線連接起來,這個可以用cv2.drawContours()函數觀察一下效果。
hierarchy:返回類型是(x,4)的二維ndarray。x和contours里的x是一樣的意思。如果輸入選擇cv2.RETR_TREE,則以樹形結構組織輸出,hierarchy的四列分別對應下一個輪廓編號、上一個輪廓編號、父輪廓編號、子輪廓編號,該值為負數表示沒有對應項。
參考資料
智能推薦
Fire detection based on HSV color model and CNN
Directory HSV color model The flow chart Detect and locate fire and make CNN network training data Conclusion Reference HSV color model HSV is also been call HexconeModel. The parameters of this model...
顏色協調模型Color Harmoniztion
前言 最近做換臉,在膚色調整的那一塊,看到一個有意思的文章,復現一波玩玩。不過最后一步掉鏈子了,有興趣的可以一起討論把鏈子補上。 主要是github上大佬的那個復現代碼和原文有點差異,而且代碼復雜度過高,閱讀費勁,這里為了清晰理解理論知識,就一步一步按照論文的每個章節走,不過有很大一部分代碼都借鑒大佬了。 國際慣例,參考文獻: 論文《Color Harmonization》 opencv超像素分割...
(一)POI 4.1.2 顏色 color
(一)POI 4.1.2 顏色 color 提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加 例如:第一章 Python 機器學習入門之pandas的使用 文章目錄 (一)POI 4.1.2 顏色 color 前言 一、IndexedColors 所有顏色 二、使用步驟 1.pom.xml中引入依賴 2.運行IndexedColorsExample main方法 總結 前言 POI...
異常檢測(Anomaly Detection)
問題的動機 什么是異常檢測呢?為了解釋這個概念,讓我舉一個例子吧: 假想你是一個飛機引擎制造商,當你生產的飛機引擎從生產線上流出時,你需要進行 QA (質量控制測試),而作為這個測試的一部分,你測量了飛機擎的一些特征變量,比如引擎運轉時產生的熱量,或者引擎的振動等等。 這樣一來,你就有了一個數據集,從 x(1)到 x(m),如果你生產了 m 個引擎的話,你將這些數據繪制成圖表,看起來就是這個樣子:...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...