一 . 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 numpy

img = 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 np

import cv2

import 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 ~ 20
    label,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)
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐