@Author:Runsen
輪廓是連接所有具有某種顏色或強度的連續點的閉合曲線,它們代表影像中發現的物件的形狀,輪廓檢測是一種用于形狀分析和物體檢測和識別的有用技術,
輪廓檢測并不是影像分割的唯一演算法,還有很多其他演算法,例如當前最先進的語意分割、霍夫變換和K-Means 分割,
為了獲得更好的準確性,以下是檢測影像中輪廓的整個流程:
- 將影像轉換為二值影像,通常的做法是將輸入影像變為二值影像(應該是閾值影像或邊緣檢測的結果),
- 使用findContours() OpenCV函式查找輪廓,
- 繪制這些輪廓并顯示影像,
import cv2
import matplotlib.pyplot as plt
在這里,選擇的圖片如下所示,
`

image = cv2.imread("image.jpg")
將其轉換為RGB,然后灰度:
# convert to RGB
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
plt.imshow(gray, cmap="gray")
plt.show()

下一步,我們需要創建一個二值影像,這意味著影像的每個像素都是黑色或白色,這在OpenCV 中是必要的,找輪廓就像從黑色背景中找白色物體,要找的物體應該是白色的,背景應該是黑色的,
_, binary = cv2.threshold(gray, 225, 255, cv2.THRESH_BINARY_INV)
函式為cv2.threshold()這個函式有四個引數,第一個原影像,第二個進行分類的閾值,第三個是高于(低于)閾值時賦予的新值,第四個是一個方法選擇引數,常用的有:
- cv2.THRESH_BINARY(黑白二值)
- cv2.THRESH_BINARY_INV(黑白二值反轉)
- cv2.THRESH_TRUNC (得到的影像為多像素值)
- cv2.THRESH_TOZERO
- cv2.THRESH_TOZERO_INV
上面的代碼建立通過設定為二進制影像0,其具有小于一值的像素225和接通(設定為255),其具有大于一個值的像素225,這里是輸出影像:

現在這對于OpenCV來說很容易檢測輪廓:
# 從閾值影像中提取的輪廓
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 繪制所有輪廓 第三個引數定繪制輪廓list中的哪條輪廓,如果是-1,則繪制其中的所有輪廓
image = cv2.drawContours(image, contours, -1, (0, 255, 0), 2)
上面的代碼在二值影像中找到輪廓,并用粗綠線將它們繪制到影像上,讓我們展示一下:
plt.imshow(image)
plt.show()

在 OpenCV檢測影像中的輪廓關鍵是閾值的確定,在一般的計算機視覺中中設定為255 // 2,,
下面使用cv2.VideoCapture的方法呼叫攝像頭,檢測影像中的輪廓,
import cv2
cap = cv2.VideoCapture(0)
while True:
_, frame = cap.read()
# 灰度
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 閾值
_, binary = cv2.threshold(gray, 255 // 2, 255, cv2.THRESH_BINARY_INV)
# 提取的輪廓
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 畫輪廓
image = cv2.drawContours(frame, contours, -1, (0, 255, 0), 2)
# 展示
cv2.imshow("gray", gray)
cv2.imshow("image", image)
cv2.imshow("binary", binary)
if cv2.waitKey(1) == ord("q"):
break
cap.release()
cv2.destroyAllWindows()

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/286303.html
標籤:其他
上一篇:【計算機組成原理】運算器組成實驗
下一篇:每日一題----空瓶子喝可樂問題
