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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步