Opencv 學習筆記(二)——三小時精通Opencv(Project)
阿新 • • 發佈:2020-09-12
1.顏色識別
cv2.imread()和cv2.cvtColor() 的使用
cv2.imread()和cv2.cvtColor() 的使用
1、cv2.imread()介面讀影象,讀進來直接是BGR 格式資料格式在 0~255
需要特別注意的是圖片讀出來的格式是BGR,不是我們最常見的RGB格式,顏色肯定有區別。
2、cv2.cvtColor(p1,p2) 是顏色空間轉換函式,p1是需要轉換的圖片,p2是轉換成何種格式。
cv2.COLOR_BGR2RGB 將BGR格式轉換成RGB格式
cv2.COLOR_BGR2GRAY 將BGR格式轉換成灰度圖片
cv2.circle()
cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
作用
根據給定的圓心和半徑等畫圓
引數說明
img:輸入的圖片data
center:圓心位置
radius:圓的半徑
color:圓的顏色
thickness:圓形輪廓的粗細(如果為正)。負厚度表示要繪製實心圓。
lineType: 圓邊界的型別。
shift:中心座標和半徑值中的小數位數。
完整程式碼:
import cv2 import numpy as np frameWidth = 640 frameHeight = 480 cap = cv2.VideoCapture(0) #cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) cap.set(3, frameWidth) cap.set(4, frameHeight) cap.set(10,150) #新增可以識別的顏色 myColors = [[5,107,0,19,255,255], [133,56,0,159,156,255], [57,76,0,100,255,255]] myColorValues = [[51,153,255], [255,0,255], [0,255,0]] def findColor(img,myColors,myColorValues): imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) count = 0 for color in myColors: lower = np.array(color[0:3]) #返回集合中,下標0至3的集合 upper = np.array(color[3:6]) mask = cv2.inRange(imgHSV, lower, upper) x,y = getContours(mask) cv2.circle(imgResult,(x,y),10,myColorValues[count],cv2.FILLED) count += 1 #cv2.imshow(str(color[0]),mask) def getContours(img): contours,hierarchy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) x,y,w,h = 0,0,0,0 for cnt in contours: area = cv2.contourArea(cnt) print(area) if area>500: cv2.drawContours(imgResult,cnt, -1, (255, 0, 0), 3) peri = cv2.arcLength(cnt,True) approx = cv2.approxPolyDP(cnt,0.02*peri,True) x, y, w, h = cv2.boundingRect(approx) return x+w//2,y while True: success, img = cap.read() imgResult = img.copy() findColor(img, myColors, myColorValues) cv2.imshow("Result", imgResult) if cv2.waitKey(1) & 0xFF == ord('q'): break
2.識別+提取 圖片內容
完整程式碼:
import cv2 import numpy as np ################################### widthImg=540 heightImg =640 ##################################### cap = cv2.VideoCapture(0) cap.set(10,150) def preProcessing(img): imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) imgBlur = cv2.GaussianBlur(imgGray,(5,5),1) imgCanny = cv2.Canny(imgBlur,200,200) #邊緣檢測 # 給邊緣加粗 kernel = np.ones((5,5)) imgDial = cv2.dilate(imgCanny,kernel,iterations=2) imgThres = cv2.erode(imgDial,kernel,iterations=1) return imgThres def getContours(img): biggest = np.array([]) maxArea = 0 contours,hierarchy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) for cnt in contours: area = cv2.contourArea(cnt) if area>5000: #cv2.drawContours(imgContour, cnt, -1, (255, 0, 0), 3) peri = cv2.arcLength(cnt,True) approx = cv2.approxPolyDP(cnt,0.02*peri,True) #計算邊數 if area >maxArea and len(approx) == 4: biggest = approx maxArea = area cv2.drawContours(imgContour, biggest, -1, (255, 0, 0), 20) return biggest def reorder (myPoints): myPoints = myPoints.reshape((4,2)) myPointsNew = np.zeros((4,1,2),np.int32) add = myPoints.sum(1) #print("add", add) myPointsNew[0] = myPoints[np.argmin(add)] myPointsNew[3] = myPoints[np.argmax(add)] diff = np.diff(myPoints,axis=1) myPointsNew[1]= myPoints[np.argmin(diff)] myPointsNew[2] = myPoints[np.argmax(diff)] #print("NewPoints",myPointsNew) return myPointsNew def getWarp(img,biggest): biggest = reorder(biggest) pts1 = np.float32(biggest) # 獲取最大輪廓 pts2 = np.float32([[0, 0], [widthImg, 0], [0, heightImg], [widthImg, heightImg]]) matrix = cv2.getPerspectiveTransform(pts1, pts2) imgOutput = cv2.warpPerspective(img, matrix, (widthImg, heightImg)) imgCropped = imgOutput[20:imgOutput.shape[0]-20,20:imgOutput.shape[1]-20] imgCropped = cv2.resize(imgCropped,(widthImg,heightImg)) return imgCropped def stackImages(scale,imgArray): rows = len(imgArray) cols = len(imgArray[0]) rowsAvailable = isinstance(imgArray[0], list) width = imgArray[0][0].shape[1] height = imgArray[0][0].shape[0] if rowsAvailable: for x in range ( 0, rows): for y in range(0, cols): if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]: imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale) else: imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale) if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR) imageBlank = np.zeros((height, width, 3), np.uint8) hor = [imageBlank]*rows hor_con = [imageBlank]*rows for x in range(0, rows): hor[x] = np.hstack(imgArray[x]) ver = np.vstack(hor) else: for x in range(0, rows): if imgArray[x].shape[:2] == imgArray[0].shape[:2]: imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale) else: imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale) if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR) hor= np.hstack(imgArray) ver = hor return ver while True: #success, img = cap.read() #使用攝像頭 #img = cv2.resize(img,(widthImg,heightImg)) #使用圖片 img = cv2.imread("Resources/paper.jpg") imgContour = img.copy() imgThres = preProcessing(img) biggest = getContours(imgThres) if biggest.size !=0: imgWarped=getWarp(img,biggest) # imageArray = ([img,imgThres], # [imgContour,imgWarped]) imageArray = ([imgContour, imgWarped]) cv2.imshow("ImageWarped", imgWarped) else: # imageArray = ([img, imgThres], # [img, img]) imageArray = ([imgContour, img]) stackedImages = stackImages(0.6,imageArray) cv2.imshow("WorkFlow", stackedImages) if cv2.waitKey(1) & 0xFF == ord('q'): break