00安装
pip install opencv-python
01导入模块
import cv2 #默认BGR
02.0读取图片并展示
import cv2 #默认BGR 下面rgb # import matplotlib.pyplot as plt #路径 path="../picture/cat1.jpg" #读取图片 img=cv2.imread(path,cv2.IMREAD_GRAYSCALE)#路劲 读取形式(这里以灰度图形式等下展示的为灰度图) #打印图片矩阵 print(img) cv2.imshow('image',img)#窗口名称,展示的内容 #等待 cv2.waitKey(0) cv2.destroyAllWindows()#触发关闭 任意键触发 #保存 cv2.imwrite('mycat.png',img)#名称,内容
02.1视频或摄像头读取
import cv2 #读取视频 #cap = cv2.VideoCapture("asd.mp4")#读取路径 填数字代表摄像头0代表第一个摄像头 #读取摄像头 cap = cv2.VideoCapture(0)#读取路径 填数字代表摄像头0代表第一个摄像头 while(True): ret, frame = cap.read() # 读取一帧的图像 ret是否成功读取 frame 为图片内容 cv2.imshow('Face Recognition', frame)#窗口展示与上面图片展示一样 if cv2.waitKey(1) & 0xFF == ord('q'):#等待触发与上面图片cv2.destroyAllWindows()#触发关闭 任意键触一样 这里是指定键可以换其他 break cap.release() # 释放摄像头 cv2.destroyAllWindows()
03保存
#保存 cv2.imwrite('mycat.png',img) print("格式",type(img))#格式 print(img.size,"#像素点")#像素点 print("数据类型",img.dtype)#数据类型
图片处理
04截取部分图像
import cv2 #默认BGR 下面rgb import matplotlib.pyplot as plt import numpy as np # %matplotlib inline #在jupyter才可用 #直接展示 不用调用plt.show path="../picture/cat1.jpg"#中文路径 #读取 img=cv2.imread(path) #展示(目的与处理的图片对比) cv2.imshow('image',img) #截取 cat=img[50:100,200:400] #高范围,宽范围 #展示截取的图片 cv2.imshow('cat',cat) cv2.waitKey(0)#等待 cv2.destroyAllWindows()#触发
05颜色通道提取
import cv2 #默认BGR 下面rgb #为了展示的时候不要写三行代码这么多定义一个展示的函数 def cv_show(name,img): cv2.imshow(name,img) cv2.waitKey(0) cv2.destroyAllWindows() 读取 img=cv2.imread('../picture/cat1.jpg') # cat=img[0:50,0:200] #高范围,宽范围 # cat=img[100:150,200:400] #高范围,宽范围 #cat=img[50:55,200:204] #展示原图 cv_show('cat',cat) #拆分通道 b,g,r=cv2.split(cat)#通道拆分(cv2.split) print(cat) print(b) print(g) print(r) # print(r.shape) #合并通道 img=cv2.merge((b,g,r))#合并(cv2.merge) print(img.shape) img=cv2.merge((b,g,r)) print(img.shape) # 只保留R 其他通道设为0 cur_img = img.copy() cur_img[:,:,0] = 0 cur_img[:,:,1] = 0 cv_show('R',cur_img) # 只保留G 其他通道设为0 cur_img = img.copy() cur_img[:,:,0] = 0 cur_img[:,:,2] = 0 cv_show('G',cur_img) # 只保留B 其他通道设为0 cur_img = img.copy() cur_img[:,:,1] = 0 cur_img[:,:,2] = 0 cv_show('B',cur_img)
06边界填充
import cv2 #默认BGR 下面rgb import matplotlib.pyplot as plt import numpy as np img=cv2.imread('../picture/cat1.jpg') cv2.imshow("name", img) cv2.waitKey(0) cv2.destroyAllWindows() top_size,bottom_size,left_size,right_size = (50,50,50,50) # BORDER_REPLICATE:复制法,也就是复制最边缘像素。 # BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb # BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba # BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg # BORDER_CONSTANT:常量法,常数值填充。 replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE) reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT) reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101) wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP) constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0) import matplotlib.pyplot as plt plt.subplot(231), plt.imshow(img, 'gray'), plt.title('ORIGINAL') plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE') plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT') plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101') plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP') plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT') plt.show()
07数值计算以及图片融合
import cv2 #默认BGR 下面rgb import matplotlib.pyplot as plt import numpy as np img_cat =cv2.imread('cat.jpg') img_dog=cv2.imread('dog.jpg') cv2.imshow("name", img_cat) cv2.waitKey(0) cv2.destroyAllWindows() img_cat2= img_cat +10 print(img_cat[:5,:,0]) cv2.imshow("name", img_cat2) cv2.waitKey(0) cv2.destroyAllWindows() print(img_cat2[:5,:,0]) #相当于% 256 print((img_cat + img_cat2)[:5,:,0] ) print(cv2.add(img_cat,img_cat2)[:5,:,0]) # 图像融合 # img_cat + img_dog cv2.imshow("name", img_dog) cv2.waitKey(0) cv2.destroyAllWindows() # img_cat.shape img=cv2.imread('cat.jpg') img_dog = cv2.resize(img_dog, (500, 414))#把狗变更成(500, 414) # img_dog.shape cv2.imshow("name", img_dog) cv2.waitKey(0) cv2.destroyAllWindows() res = cv2.addWeighted(img_cat, 0.5, img_dog, 0.4, 0) #融合 0.4 权重项 0为亮度微调 R = img_cat x 0.4 +img_dog x0.6 +0 plt.imshow(res) cv2.imshow("name", res) cv2.waitKey(0) cv2.destroyAllWindows() res = cv2.resize(img, (0, 0), fx=0.4, fy=0.4)#把狗变更成放大4.4 plt.imshow(res) cv2.imshow("name", res) cv2.waitKey(0) cv2.destroyAllWindows() res = cv2.resize(img, (0, 0), fx=4, fy=4)#把狗变更成放大4.4 plt.imshow(res) cv2.imshow("name", res) cv2.waitKey(0) cv2.destroyAllWindows() res = cv2.resize(img, (0, 0), fx=1, fy=3) plt.imshow(res) cv2.imshow("name", res) cv2.waitKey(0) cv2.destroyAllWindows()
08图片画像
import numpy as np import cv2 # Create a black image img=np.zeros((512,512,3), np.uint8) # Draw a diagonal blue line with thickness of 5 px cv2.line(img,(0,0),(511,511),(255,0,0),1)#图 坐标 粗细 划线的 cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)#矩形 cv2.circle(img,(447,63), 63, (0,0,255), -1)#画圆 图 圆心 半径 颜色 -1 为画圆面 正数为圆的粗细 cv2.ellipse(img,(256,256),(100,50),90,30,60,(0,255,0),-1) #中心点的位置坐标 长轴和短轴的长度 # 起点轴角度 椭圆沿逆时针方向旋转的角度 椭圆沿顺时针方向旋转的角度 如果是0和360就是整个椭圆 # 画多䥨形 pts=np.array([[10,5],[20,30],[70,20],[50,10]], np.int32) # pts=pts.reshape((-1,1,2)) cv2.polylines(img,[pts],True,(255,0,0),1) # 3 # 䦈䭻 reshape 的第一个参数为-1, 䈗明䦈一维的伮度是根据后儑的维度的䕐算出来的。 # 如果第三个参数是 False虽我们得到的多䥨形是不侜合的虹卅尾不相 # 䦍虺。 font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(img,'OpenCV Tuts!',(0,130), font, 1, (200,255,155), 2, cv2.LINE_AA) # 你䌰绘制的文字 # 你䌰绘制的位置 # 字体类型 虹䧉䥶查看 cv2.putText() 的文档找到支持的字体虺 # 字体的大小 # 文字的一般属性如 剋色 虽 粗细 虽线条的类型等。为了更好看一点推荐使用 # linetype=cv2.LINE_AA。 cv2.imshow('image',img) # cv2.imshow('image',pts) cv2.waitKey(0)#等待 cv2.destroyAllWindows()#触发
最后用9行代码做个人脸检测功能吧
# -*- coding: utf-8 -*- #opencv导入的是cv2 import cv2 import face_recognition #1读图 img = cv2.imread('../picture/zxc.jpg')#路径不可以中文 #获取人脸 locations = face_recognition.face_locations(img) for top,rigth,bottom,left in locations: cv2.rectangle(img,(left,top),(rigth,bottom),(0,0,255),2)#画框 #2展示 # cv2.putText(img, "handsome boy", (100,100-20), cv2.FONT_HERSHEY_COMPLEX, 2, (0,255,0), 3)#cv2.putText(img, str(i), (123,456)), font, 2, (0,255,0), 3) #各参数依次是:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细 cv2.imshow('11',img)#中文乱码 #3等待结束 cv2.waitKey(0)#按任意键盘解释 #4销毁窗口 cv2.destroyAllWindows()
捕获视频版人脸检测功能
pip install opencv-python face_recognition
import cv2 import face_recognition #导入包 #创建视频捕获对象 vc = cv2.VideoCapture("../vdio/aa.mp4")#0为内置摄像头 #或者放摄像头路径 # vc = cv2.VideoCapture(0)#0为内置摄像头 #或者放摄像头路径 # 循环捕获视频的图片 while True: ret,img = vc.read() if not ret: print('没有捕获到视频') break # 展示图片 locations = face_recognition.face_locations(img) for top, rigth, bottom, left in locations: cv2.rectangle(img, (left, top), (rigth, bottom), (0, 0, 255), 2)#画框 cv2.imshow('me',img) if cv2.waitKey(1) != -1: #关闭摄像头 vc.release() cv2.destroyAllWindows() break # 等待键盘事件 # 关闭摄像头销毁川