python OpenCV學習筆記
圖像翻轉
使用Python的一個包,imutils。使用下面的指令可以安裝。
pip install imutils
imutils包的Github地址:https://github.com/jrosebr1/imutils
CSDN鏡像:https://codechina.csdn.net/mirrors/jrosebr1/imutils
可以在上面這個地址裡面學習更多的使用方式。
import cv2 import imutils ''' imutils.rotate 第一個參數是翻轉的圖像,第二個參數的翻轉角度 函數還提供翻轉中心的設置,但默認就是中心翻轉。 ''' vc = cv2.VideoCapture(0) if vc.isOpened(): flag, frame = vc.read() img = imutils.rotate(frame, 180) # 圖像翻轉 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) # 圖像翻轉 cv2.imshow("frame", img) if cv2.waitKey(10) == 27: break vc.release() cv2.destroyAllWindows()
這樣寫的話,最後的輸出圖像就是翻轉180度的。
imutils包裡還有其他好用的函數,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包內自帶的畫輪廓的函數,可以直接用,然後可以在圖片上標出輪廓序號 也可以直接使用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) # 根據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()
這樣寫的話,最後的輸出圖像就是翻轉180度的。
imutils包裡還有其他好用的函數,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包內自帶的畫輪廓的函數,可以直接用,然後可以在圖片上標出輪廓序號 也可以直接使用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) # 根據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()
顏色識別
基礎顏色識別
顏色識別是在HSV空間內進行的,因此在使用之前先進行顏色空間的轉換。
'''使用下面這個函數進行轉換,第一個參數填寫要轉換的圖片,第二個參數填寫cv2.COLOR_BGR2HSV''' cv2.cvtColor
import cv2 import numpy as np ''' cv2.inRange 函數很簡單,參數有三個 第一個參數:hsv指的是原圖 第二個參數:lower_red指的是圖像中低於這個lower_red的值,圖像值變為0 第三個參數:upper_red指的是圖像中高於這個upper_red的值,圖像值變為0 而在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) # 使用下面這個函數能顯示原來的顏色。 res_green = cv2.bitwise_and(img, img, mask=mask_green) cv2.imshow("img", res_green) cv2.waitKey(0) cv2.destroyAllWindows()
在進行顏色識別時,難免會出現“漏顏色”的現象,也就是會出現沒識別全的現象。這個時候可以再對圖像進行處理,比如說進行形態學處理,讓圖像更加飽滿之類的。
根據BGR獲取HSV
import cv2 color = np.uint8([[[193, 189, 147]]]) # 參數填寫BGR的值 hsv = cv2.cvtColor(color, cv2.COLOR_BGR2HSV) print(hsv) # 打印出來的數值就是對應的HSV值
程序運行的結果是
[[[ 93 61 193]]]
這個就是對應的HSV的值。
根據之前寫的顏色識別,就需要把對應的閾值寫出。具體寫法就是保持S和V不變,H加減10。這樣的話就可以寫出高低閾值然後應用到顏色識別裡面就可以瞭。
閾值編輯器
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學習筆記的詳細內容,更多關於python OpenCV的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- None Found