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其它相關文章!