一 . opencv是什么及其作用?
OpenCV是一個基于BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法(百度百科)。
鑒于本人的工作環境主要是采用python作為開發工具,故本篇博客是基于python來做的學習記錄。
?
二 . 環境依賴和opencv包
- 環境:python3.65+windows10
- 包:opencv-python、opencv-contrib-python(pip安裝)
- 說明:裝好python以后,直接在cmd里面使用pip install 即可,若遇見下載速度過慢或超時的情況,建議換個pip源,使用方式如:pip install package -i??https://pypi.tuna.tsinghua.edu.cn/simple/
1. 讀取圖片,將其轉換為數組
from matplotlib import pyplot as pyl import cv2 import numpyimg = cv2.imread("cat.jpg") #img是一個numpy.ndarray對象,默認是以BGR三通道讀取圖片數據(三維數組) #img_gray = cv2.imread("cat.jpg",cv2.IMREAD_GRAYSCALE) 以灰度圖像方式讀取圖片數據(二維數組)
?
2. 數組數據轉換
img_BGR = cv2.imread("cat.jpg") img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #將其轉換為灰度的二維數組數據
?
3. 數組數據窗口展示
img = cv2.imread("cat.jpg")cv2.imshow("IMage",img) cv2.waitKey(0) # 按任意鍵關閉窗口,cv2.waitKey(1000) 延時一秒關閉窗口 cv2.destroyAllWindows()
?
4. 圖像保存
cv2.imwrite("mycat.jpg",img)
?
5. 圖像的截取
# 其實本質就是對np數組進行操作 img = cv2.imread("cat.jpg") cv2.imshow("IMage",img[:100,:200]) # 取前100行,前200列的像素作為圖像展示
?
?6. BGR數據切片
img = cv2.imread("cat.jpg")# 切片 b,g,r = cv2.split(img) # 得到各自顏色通道的二維數組數據# 合并 img = cv2.merge(b,g,r)
?7 同樣大小的數組像素值運算
img = cv2.imread("cat.jpg") img_2 = numpy.copy(img)# np相加,像素值只要超過255,就減掉255,比如257,結果就為2 print(img[:3,:3,0]+img_2[:3,:3,0] ) # cv2相加,像素值超過255,就等于255 print(cv2.add(img[:3,:3,0],img_2[:3,:3,0]))
?
8 圖片的融合
img_cat = cv2.imread("cat.jpg") img_dog = cv2.imread("dog.jpg")ret = cv2.addWeighted(img_cat,0.2,img_dog,0.8,0) # 數據后面的值決定圖片融合和所占的權重 cv2.imshow("IMage",ret) cv2.waitKey(0) # 按任意鍵關閉窗口,cv2.waitKey(1000) 延時一秒關閉窗口 cv2.destroyAllWindows()# 如果圖片大小不一致,使用cv2.resize(img_xx,(300,200)) ————》轉換為np.shape = 200,300的數組
9 圖片的比例縮放
img_cat = cv2.imread("cat.jpg")ret = cv2.resize(img_cat,(0,0),fx=3,fy=1) #橫向拉長三倍 ret2 = cv2.resize(img_cat,(0,0),fx=3,fy=3) #圖片擴大三
?
【實例】通過訓練? ?進行人臉識別:
import numpy as npimport cv2import os
filenames = os.listdir('./faces/')
faces = []
# targerts == labels標簽
targets = []
for f in filenames:for fn in os.listdir('./faces/%s'%(f)):faces.append(cv2.imread('./faces/%s/%s'%(f,fn)))targets.append(f.split('.')[0])
faces = np.asarray(faces)
targets = np.asarray(targets)
len(targets)
#60/
labels = np.asarray([i for i in range(1,7)]*10)
labels.sort()
labels
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3,3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5,5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6])
# face-recognizer人臉的識別
# Eigen特征,根據特征值相似,認為同一個人
fr = cv2.face.EigenFaceRecognizer_create()
labels_train = labels[::2]
len(labels_train)
#30
faces_train = faces[::2]
len(faces_train)
#30
# faces_train2=[]
# for face in faces_train:
# gray = cv2.cvtColor(face,cv2.COLOR_BGR2BGRA)
# faces_train2.append(gray)
# 灰度化處理
faces_train2 = []
for face in faces_train:gray = cv2.cvtColor(face,cv2.COLOR_BGR2GRAY)faces_train2.append(gray)
faces_train2 = np.asarray(faces_train2)
faces_train2.shape
#(30, 64, 64)
# 訓練
fr.train(faces_train2,labels_train)
face_test = faces[1::2]
#叫什么名字的標簽
labels_test =labels[1::2]
targets_labels =targets[::10]
for face in face_test:gray = cv2.cvtColor(face,cv2.COLOR_RGB2GRAY)# 1 ~ 20label,confidence = fr.predict(gray)cv2.imshow(targets_labels[label-1],face)print(label,confidence)print('------------------',targets_labels[label-1])cv2.waitKey(1000)cv2.destroyAllWindows()
print(targets_labels)