为了能到远方,脚下的每一步都不能少.|

园龄:粉丝:关注:

OpenCV入门笔记

1、简单使用

https://www.cnblogs.com/Undo-self-blog/p/8423851.html

复制代码
#简单使用
# opencv C++ 模块叫cv2
import cv2
import numpy as np
#加载 imread,imshow
# numpy类型的数据
rose = cv2.imread('./rose.jpg')
rose.shape

cv2.imshow('rose',rose)

cv2.waitKey(0)

cv2.destroyAllWindows()


#resize 调整图片的尺寸
rose = cv2.resize(rose,dsize = (600,676))
#addWeighted将两张图片合并
# 将两张图片合并到一张

mix = cv2.addWeighted(xi,0.7,rose,0.3,0)

cv2.imshow('xa',mix)

cv2.waitKey(0)

cv2.destroyAllWindows()


#split 和 merge,组合出新的图片
# 红绿蓝,opencv:蓝绿红
b,g,r = cv2.split(rose)
# 颜色通道数量只有一个,那么显示图片的时候,只能显示黑白
cv2.imshow('b',b)
cv2.waitKey(0)
cv2.destroyAllWindows()


#将图片的亮度进行提升
# 超过了255,按255
xi2 = cv2.add(xi,50)

cv2.imshow('xi',xi2)

cv2.waitKey(0)

cv2.destroyAllWindows()
复制代码

 

2、检测人脸

复制代码
import numpy as np
import cv2
img = cv2.imread('./physic.jpg')

img = cv2.resize(img,(1063,552))

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 级联分类器(多个小分类器合到工作,级联)
# haar特征:嘴唇,嘴唇上的颜色深度,比周边深
# 算法级联分类器,根据haar特征进行检测,符合特征,识别出来
#xml 文件中的数据,是训练出来的
#目标不限,训练参数
face_detector = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')


# 返回的数据是目标区域左上角的坐标,与目标区域宽度和高度,正方形区域
#for 循环形式遍历整张图片,1000亿脑细胞
face_zones = face_detector.detectMultiScale(gray,scaleFactor = 1.1,
                                            minNeighbors = 1,
                                            minSize = (22,22)
                                            ,maxSize = (60,60))

print(face_zones)
for x,y,w,h in face_zones:
#     cv2.rectangle(img,pt1 = (x,y),pt2 = (x+w,y+h),color = [0,0,255],thickness = 2)
    cv2.circle(img,center = (x + w//2,y + h//2),radius = w//2,color = [0,0,255],thickness = 2)
    
cv2.imshow('face',img)

cv2.waitKey(0)

cv2.destroyAllWindows()
复制代码

3、视频中的人脸检测

复制代码
import numpy as np
import cv2


win = cv2.namedWindow('dzd',cv2.WINDOW_NORMAL)
cv2.resizeWindow('dzd',640,200)
rose = cv2.imread('./rose.jpg')
cv2.imshow('dzd',rose)
cv2.waitKey(0)
cv2.destroyWindow('dzd')

v = cv2.VideoCapture(0)#打开摄像头
#v = cv2.VideoCapture('./dzd2.mp4')
face_detector = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')
# 视频是由一张张图片组成,每一张图片,帧
while True:
    flag,frame = v.read()
    if not flag:
        break
#     frame = cv2.resize(frame,(640,360))
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    face_zones = face_detector.detectMultiScale(gray,scaleFactor = 1.1,
                                                minNeighbors = 3)
    for x,y,w,h in face_zones:
        #cv2.rectangle(frame,pt1 = (x,y),pt2 = (x+w,y+h),color = [0,0,255],thickness=2)
        cv2.circle(frame,center = (x + w//2,y + h//2),radius = w//2,color = [0,0,255],thickness = 2)
    cv2.imshow('dzd',frame)
    key = cv2.waitKey(1)
    if key == ord('q'):
        break
v.release()#释放视频流
cv2.destroyAllWindows()
复制代码

4、人脸采集

复制代码
import numpy as np
import cv2
v = cv2.VideoCapture(0)
face_detector = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')
# 视频是由一张张图片组成,每一张图片,帧
num = 1
while True:
    flag,frame = v.read()
    if not flag:
        break
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    face_zones = face_detector.detectMultiScale(gray,scaleFactor = 1.1,
                                                minNeighbors = 3)
    for x,y,w,h in face_zones[:1]:
        cv2.rectangle(frame,pt1 = (x,y),pt2 = (x+w,y+h),color = [0,0,255],thickness=2)
    cv2.imshow('dzd',frame)
    key = cv2.waitKey(41)
    if key == ord('Y'):
        if len(face_zones) > 0:
            face = frame[y+2:y+h-1,x+2:x+w-1]
            face = cv2.resize(face,(64,64))
            cv2.imwrite('./faces/sbn/%d.jpg'%(num),face)
            num +=1
        if num == 11:
            break
    elif key == ord('q'):
        break
v.release()#释放视频流
cv2.destroyAllWindows()

f = cv2.imread('./faces/sbn/1.jpg')
f = cv2.equalizeHist(f[:,:,0])
cv2.imshow('f',f)
cv2.waitKey(0)
cv2.destroyAllWindows()
复制代码

5、数据预处理

复制代码
import numpy as np
import os
import random
import cv2
# 文件名修改,1~10文件名
filename = os.listdir('./faces/wuao/')
for i,name in enumerate(filename):
    print(i,name)
    os.rename('./faces/wuao/%s'%(name),'./faces/wuao/%d.jpg'%(i+1))


dirs = os.listdir('./faces/')
l_name = set([i for i in range(1,11)])
for d in dirs:
    filename = [int(f.split('.')[0]) for f in os.listdir('./faces/%s'%(d))]
    if len(filename) < 10:
        for i in range(10 - len(filename)):
            fn = random.choice(filename)
            cv2.imwrite('./faces/%s/%d.jpg'%(d,i+50),cv2.imread('./faces/%s/%s.jpg'%(d,fn)))


dirs = os.listdir('./faces/')
l_name = set([i for i in range(1,11)])
for d in dirs:
    filename = [int(f.split('.')[0]) for f in os.listdir('./faces/%s'%(d))]
    print(d,len(filename))


dirs = os.listdir('./faces/')
l_name = set([i for i in range(1,11)])
for d in dirs:
    filename = set([int(f.split('.')[0]) for f in os.listdir('./faces/%s'%(d))])
    
    no_change = l_name.intersection(filename)
    
    chang = filename.difference(no_change)
    
    change_name = l_name.difference(no_change)
    
    for c1,c2 in zip(chang,change_name):
        os.rename('./faces/%s/%d.jpg'%(d,c1),'./faces/%s/%d.jpg'%(d,c2))


dirs = os.listdir('./faces/')
for d in dirs:
    filename = set([int(f.split('.')[0]) for f in os.listdir('./faces/%s'%(d))])
    print(filename)


s1 = set([1,2,3,4,5,6,7,8,9,10])
s2 = set([3,4,5,6,11,12,13,14,15,16])
s3 = s1.intersection(s2)
print('不需要修改的文件',s3)
print('需要修改的文件',s2.difference(s3))
print('备选要修改的名字是:',s1.difference(s3))


a = np.array([1,2,3,4,5])

b = np.array(list('abcde'))

for s1,s2 in zip(a,b):
    print(s1,s2)

# 图片的尺寸,不统一,将图片尺寸,统一化操作
dirs = os.listdir('./faces/')
for d in dirs:
    filename = [f for f in os.listdir('./faces/%s'%(d))]
    for fn in filename:
        img = cv2.imread('./faces/%s/%s'%(d,fn))
        w,h,c = img.shape
        if w != 64:
            img2 = cv2.resize(img,(64,64))
            cv2.imwrite('./faces/%s/%s'%(d,fn),img2)
复制代码

6、人脸识别

复制代码
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)
faces.shape 
labels = np.asarray([i for i in range(1,21)]*10)
labels.sort()

#算法生成
#LDA降维,线性判别
#cv2.face.FisherFaceRecognizer_create()


# face-recognizer人脸的识别
# Eigen特征,根据特征值相似,认为同一个人
#人脸识别的算法,128个特征点,根据远近进行判断
fr = cv2.face.EigenFaceRecognizer_create()


# 训练数据,取出100个
labels_train = labels[::2]
faces_train = faces[::2]
print(labels_train,faces_train)


# 灰度化处理
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


# 训练,数据不合格,训练结束了
fr.train(faces_train2,labels_train)

# 测试数据
faces_test = faces[1::2]

# 这个人叫什么标签 1 ~ 20
labels_test = labels[1::2]


targets_labels = targets[::10]
for face in faces_test:
    gray = cv2.cvtColor(face,cv2.COLOR_RGB2GRAY)
    
#   1 ~ 20
    label,confidence = fr.predict(gray)
    
    cv2.imshow(targets_labels[label-1],face)
    print('------------------',targets_labels[label-1])
    cv2.waitKey(5000)
    
cv2.destroyAllWindows()
复制代码

7、opencv处理图片

复制代码
# 1、灰度化处理 颜色通道只有一个数值了(0 ~ 255)
# 2、二值化处理 0,255
# 3、8邻域过滤 噪声,分散周围邻居少
# 4、侵蚀 由粗变细 过滤掉噪声
# 5、膨胀 由细变粗 特征加强

import cv2
import numpy as np

# 1、灰度化处理
img = cv2.imread('./captcha.jpg')
# 加权,灰度化,红0.299 绿0.587 蓝0.114
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(img.shape,gray.shape)

# 灰度化的方法
img2 = img.min(axis = 2)
cv2.imshow('min_gray',img2)

cv2.waitKey(0)
 
cv2.destroyAllWindows()

# 灰度化的方法
img3 = img.max(axis = 2)

cv2.imshow('max_gray',img3)

cv2.waitKey(0)

cv2.destroyAllWindows()


# 降维,黑白,权重一样1/3
img4 = img.mean(axis = 2).astype(np.uint8)

cv2.imshow('mean_gray',img4)

cv2.waitKey(0)

cv2.destroyAllWindows()


# 降维,黑白
# 蓝0.114绿0.587红0.299
w = np.array([0.114,0.587,0.299])
img5 = img.dot(w).astype(np.uint8)

cv2.imshow('mean_gray',img5)

cv2.waitKey(0)

cv2.destroyAllWindows()



# 二值化处理
# gray 灰度化图片
# 参数二,是阈值,调整,220意味着,大于220变成255;小于220,变成纯黑
t,gray2 = cv2.threshold(gray,220,255,cv2.THRESH_BINARY)

cv2.imshow('threshold',gray2)

cv2.waitKey(0)

cv2.destroyAllWindows()


#8邻域过滤,距离最近的8个点
def remove_noise(img,k=4):
    
    img2 = img.copy()
    
#     img处理数据,k过滤条件
    w,h = img2.shape
    def get_neighbors(img3,r,c):
        count = 0
        for i in [r-1,r,r+1]:
            for j in [c-1,c,c+1]:
                if img3[i,j] > 220:#纯白色
                    count+=1
        return count
#     两层for循环判断所有的点
    for x in range(w):
        for y in range(h):
            if x == 0 or y == 0 or x == w -1 or y == h -1:
                img2[x,y] = 255
            else:
                n = get_neighbors(img2,x,y)#获取邻居数量,纯白色的邻居
                if n > k:
                    img2[x,y] = 255
    return img2
result = remove_noise(gray2)
cv2.imshow('8neighbors',result)

cv2.waitKey(0)

cv2.destroyAllWindows()

#形态学处理,侵蚀和膨胀

image = cv2.imread('./fushi.png')

# 加减乘除,指数幂运算,对数运算,矩阵运算,卷积(数学操作)
# 核,正方形的,3*3,5*5,7*7,卷积操作,高等计算
# 神经网络,基于卷积运算而来,卷积神经网络--------->循环神经网络,长短记忆神经网络
kernel = np.ones(shape = (3,3),dtype = np.uint8)

erode_image = cv2.erode(image,kernel,iterations = 3)

# 膨胀,变粗
dilate_image = cv2.dilate(erode_image,kernel,iterations=2)

cv2.imshow('image',dilate_image)

cv2.waitKey(0)

cv2.destroyAllWindows()

# 形态学的开运算

image = cv2.imread('./fushi.png')

# kernel = np.ones(shape = (3,3),dtype = np.uint8)

kernel = np.random.randn(5,5)

opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)

cv2.imshow('image',opening)

cv2.waitKey(0)

cv2.destroyAllWindows()





# 1、灰度化处理
img = cv2.imread('./captcha3.jpg')
# 加权,灰度化,红0.299 绿0.587 蓝0.114
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 2、二值化处理
# gray 灰度化图片
# 参数二,是阈值,调整,220意味着,大于220变成255;小于220,变成纯黑
t,gray2 = cv2.threshold(gray,235,255,cv2.THRESH_BINARY)

# 3、8邻域过滤
result = remove_noise(gray2)


# 4、形态学开运算,先腐蚀,在膨胀
kernel = np.random.randn(3,3)
# result = cv2.morphologyEx(result,cv2.MORPH_OPEN,kernel)

dilate = cv2.dilate(result,kernel,iterations = 1)

kernel = np.full(shape = [5,5],fill_value=1/25)

erode = cv2.erode(dilate,kernel,iterations = 1)


cv2.imshow('8neighbors',erode)

cv2.waitKey(0)

cv2.destroyAllWindows()
复制代码

本文作者:CxAgoni

本文链接:https://www.cnblogs.com/CxAgoni/p/12124239.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   CxAgoni  阅读(229)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起