目錄
- 圖像翻轉(zhuǎn)
- 圖像輪廓排序
- 圖像輪廓排序
- 顏色識別
- 基礎(chǔ)顏色識別
- 根據(jù)BGR獲取HSV
- 閾值編輯器
圖像翻轉(zhuǎn)
使用Python的一個包,imutils。使用下面的指令可以安裝。
imutils包的Github地址:https://github.com/jrosebr1/imutils
CSDN鏡像:https://codechina.csdn.net/mirrors/jrosebr1/imutils
可以在上面這個地址里面學(xué)習(xí)更多的使用方式。
import cv2
import imutils
'''
imutils.rotate
第一個參數(shù)是翻轉(zhuǎn)的圖像,第二個參數(shù)的翻轉(zhuǎn)角度
函數(shù)還提供翻轉(zhuǎn)中心的設(shè)置,但默認就是中心翻轉(zhuǎn)。
'''
vc = cv2.VideoCapture(0)
if vc.isOpened():
flag, frame = vc.read()
img = imutils.rotate(frame, 180) # 圖像翻轉(zhuǎn)
cv2.imshow("frame", img)
else:
flag = False
while flag:
flag, frame = vc.read()
if frame is None:
break
if flag is True:
img = imutils.rotate(frame, 180) # 圖像翻轉(zhuǎn)
cv2.imshow("frame", img)
if cv2.waitKey(10) == 27:
break
vc.release()
cv2.destroyAllWindows()
這樣寫的話,最后的輸出圖像就是翻轉(zhuǎn)180度的。
imutils包里還有其他好用的函數(shù),resizing、4-point Perspective Transform、Sorting Contours等等。
圖像輪廓排序
這個效果同樣也是依靠imutils包完成。
from imutils import contours
import cv2
'''
contours.sort_contours
可選排序方式:"left-to-right", "right-to-left", "top-to-bottom", "bottom-to-top"
返回值為輪廓和外接矩形
contours.label_contour
contours包內(nèi)自帶的畫輪廓的函數(shù),可以直接用,然后可以在圖片上標(biāo)出輪廓序號
也可以直接使用cv2.drawContours直接畫輪廓
'''
img = cv2.imread(r"D:\opencv-workspace\Opencv\test17--VScode\shapes.png")
draw_img = img.copy()
img_rect = img.copy()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.Canny(gray, 10, 20) # Canny邊緣檢測
cnts, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) # 獲得輪廓
(cnts, boundingBoxes) = contours.sort_contours(cnts, "top-to-bottom") # 對輪廓進行排序處理
for (i, c) in enumerate(cnts):
sortedImage = contours.label_contour(draw_img, c, i, color=(240, 0, 159))
# img_out = cv2.drawContours(draw_img, cnts, -1, (240, 0, 159), 2)
# 根據(jù)boundingBoxes畫外接矩形
for (x, y, w, h) in boundingBoxes:
img_rect = cv2.rectangle(img_rect, (x, y), (x+w, y+h), (240, 0, 159), 2)
cv2.imshow("top-to-bottom", sortedImage)
cv2.imshow("rect", img_rect)
cv2.waitKey(0)
cv2.destroyAllWindows()
這樣寫的話,最后的輸出圖像就是翻轉(zhuǎn)180度的。
imutils包里還有其他好用的函數(shù),resizing、4-point Perspective Transform、Sorting Contours等等。
圖像輪廓排序
這個效果同樣也是依靠imutils包完成。
from imutils import contours
import cv2
'''
contours.sort_contours
可選排序方式:"left-to-right", "right-to-left", "top-to-bottom", "bottom-to-top"
返回值為輪廓和外接矩形
contours.label_contour
contours包內(nèi)自帶的畫輪廓的函數(shù),可以直接用,然后可以在圖片上標(biāo)出輪廓序號
也可以直接使用cv2.drawContours直接畫輪廓
'''
img = cv2.imread(r"D:\opencv-workspace\Opencv\test17--VScode\shapes.png")
draw_img = img.copy()
img_rect = img.copy()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.Canny(gray, 10, 20) # Canny邊緣檢測
cnts, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) # 獲得輪廓
(cnts, boundingBoxes) = contours.sort_contours(cnts, "top-to-bottom") # 對輪廓進行排序處理
for (i, c) in enumerate(cnts):
sortedImage = contours.label_contour(draw_img, c, i, color=(240, 0, 159))
# img_out = cv2.drawContours(draw_img, cnts, -1, (240, 0, 159), 2)
# 根據(jù)boundingBoxes畫外接矩形
for (x, y, w, h) in boundingBoxes:
img_rect = cv2.rectangle(img_rect, (x, y), (x+w, y+h), (240, 0, 159), 2)
cv2.imshow("top-to-bottom", sortedImage)
cv2.imshow("rect", img_rect)
cv2.waitKey(0)
cv2.destroyAllWindows()
顏色識別
基礎(chǔ)顏色識別
顏色識別是在HSV空間內(nèi)進行的,因此在使用之前先進行顏色空間的轉(zhuǎn)換。
'''使用下面這個函數(shù)進行轉(zhuǎn)換,第一個參數(shù)填寫要轉(zhuǎn)換的圖片,第二個參數(shù)填寫cv2.COLOR_BGR2HSV'''
cv2.cvtColor
import cv2
import numpy as np
'''
cv2.inRange
函數(shù)很簡單,參數(shù)有三個
第一個參數(shù):hsv指的是原圖
第二個參數(shù):lower_red指的是圖像中低于這個lower_red的值,圖像值變?yōu)?
第三個參數(shù):upper_red指的是圖像中高于這個upper_red的值,圖像值變?yōu)?
而在lower_red~upper_red之間的值變成255
'''
# 閾值
lower_green = np.array([50, 255, 255])
upper_green = np.array([70, 255, 255])
img = cv2.imread(r"D:\opencv-workspace\Opencv\test16--VScode\photo.jpg")
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask_green = cv2.inRange(img_hsv, lower_green, upper_green)
cv2.imshow("img_or", mask_green)
# 使用下面這個函數(shù)能顯示原來的顏色。
res_green = cv2.bitwise_and(img, img, mask=mask_green)
cv2.imshow("img", res_green)
cv2.waitKey(0)
cv2.destroyAllWindows()
在進行顏色識別時,難免會出現(xiàn)“漏顏色”的現(xiàn)象,也就是會出現(xiàn)沒識別全的現(xiàn)象。這個時候可以再對圖像進行處理,比如說進行形態(tài)學(xué)處理,讓圖像更加飽滿之類的。
根據(jù)BGR獲取HSV
import cv2
color = np.uint8([[[193, 189, 147]]]) # 參數(shù)填寫B(tài)GR的值
hsv = cv2.cvtColor(color, cv2.COLOR_BGR2HSV)
print(hsv) # 打印出來的數(shù)值就是對應(yīng)的HSV值
程序運行的結(jié)果是
這個就是對應(yīng)的HSV的值。
根據(jù)之前寫的顏色識別,就需要把對應(yīng)的閾值寫出。具體寫法就是保持S和V不變,H加減10。這樣的話就可以寫出高低閾值然后應(yīng)用到顏色識別里面就可以了。
閾值編輯器
import cv2
import numpy as np
def function(x):
lowH = cv2.getTrackbarPos("lowH", "img_666")
lowS = cv2.getTrackbarPos("lowS", "img_666")
lowV = cv2.getTrackbarPos("lowV", "img_666")
HighH = cv2.getTrackbarPos("HighH", "img_666")
HighS = cv2.getTrackbarPos("HighS", "img_666")
HighV = cv2.getTrackbarPos("HighV", "img_666")
# print(lowH, lowS, lowV, HighH, HighS, HighV)
lower = np.uint8([lowH, lowS, lowV])
upper = np.uint8([HighH, HighS, HighV])
mask = cv2.inRange(img_hsv, lower, upper)
res = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow("img", res)
img = cv2.imread(r"D:\opencv-workspace\Opencv\test16--VScode\test.jpg")
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.namedWindow("img_666")
cv2.createTrackbar("lowH", "img_666", 0, 179, function)
cv2.createTrackbar("lowS", "img_666", 0, 255, function)
cv2.createTrackbar("lowV", "img_666", 0, 255, function)
cv2.createTrackbar("HighH", "img_666", 0, 179, function)
cv2.createTrackbar("HighS", "img_666", 0, 255, function)
cv2.createTrackbar("HighV", "img_666", 0, 255, function)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
寫了一個比較垃圾的閾值編輯器。。。就不多解釋了。。
以上就是python OpenCV學(xué)習(xí)筆記的詳細內(nèi)容,更多關(guān)于python OpenCV的資料請關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- 使用python和opencv的mask實現(xiàn)摳圖疊加
- Python opencv缺陷檢測的實現(xiàn)及問題解決
- Python OpenCV快速入門教程
- python讀取并顯示圖片的三種方法(opencv、matplotlib、PIL庫)
- python opencv常用圖形繪制方法(線段、矩形、圓形、橢圓、文本)
- python基于OpenCV模板匹配識別圖片中的數(shù)字
- python-opencv中的cv2.inRange函數(shù)用法說明