图片能处理和识别了,接下来就是摄像头了
import cv2
import numpy as np
import matplotlib.pyplot as plt
cv2.namedWindow("Photo_Detect") #定义一个窗口
cap=cv2.VideoCapture(0) #捕获摄像头图像 0位默认的摄像头 笔记本的自带摄像头 1为外界摄像头
while(True): #值为1不断读取图像
ret, frame = cap.read() #视频捕获帧
cv2.imwrite('cap_RGB.jpg',frame) #写入捕获到的视频帧 命名为cap_RGB.jpg
cv2.imshow('Photo_Detect',frame) #显示窗口 查看实时图像
#按S 读取灰度图
if (cv2.waitKey(1) & 0xFF) == ord('S'): #不断刷新图像,这里是1ms 返回值为当前键盘按键值
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #RGB图像转为单通道的灰度图像
gray = cv2.resize(gray,(640,480)) #图像大小为640*480
cv2.imshow('cap',gray) #显示灰度图窗口
cv2.imwrite('cap.jpg',gray) #写入灰度图
if cv2.waitKey(1) & 0xFF == ord('Q'): #按Q关闭所有窗口 一次没反应的话就多按几下
break
#执行完后释放窗口
cap.release()
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下
可以识别摄像头当前所看到的图像
按一下S
输出灰度图
视频读取没什么问题了
接下来是结合之前的图像处理 对摄像头图像进行实时处理
实现原理很简答
把摄像头读取一帧,存储一帧的数据进行处理 然后输出
因为机器处理的速度的很快 可以对每一帧 每一个图像进行处理
所以看起来效果就是实时处理摄像头的所显示的视频
测试的效果
移动物品 框会跟着动
一样的按Q退出
最后附上所有代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
#高斯滤波
def GausBlur(img):
gaus = cv2.GaussianBlur(img,(5,5),2) #(5, 5)表示高斯矩阵的长与宽都是5,标准差取2
return gaus
#灰度处理
def Gray_img(gaus_img):
gray = cv2.cvtColor(gaus_img,cv2.COLOR_BGR2GRAY)
return gray
#开运算操作
def open_mor(binary):
kernel = np.ones((6,6),np.uint8) #8 8 数字可以自己改变加以调整效果 数字越大强度越高
opening = cv2.morphologyEx(binary,cv2.MORPH_OPEN,kernel, iterations=5) #iterations进行7次操作 次数越多效果越强
return opening
#定义一个图像处理函数
def img_disapose():
#捕获存储完图像之后 对图像进行处理
#读取上面存储的图片
img = cv2.imread('cap_RGB.jpg') #0为灰度,1为彩色
img = cv2.resize(img,(640,480)) #设置窗口大小
#高斯滤波
gaus_img = GausBlur(img)
#灰度处理
gray_img = Gray_img(gaus_img)
#二值化处理
ret , binary = cv2.threshold(gray_img ,148 , 255 , cv2.THRESH_BINARY) #148 255 为设置阈值
#开运算操作
open_img = open_mor(binary)
#颜色反转一下
open_img=~open_img
#轮廓检测
contours, hierarchy = cv2.findContours(open_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print('hierarchy',hierarchy)
#描绘轮廓
c = sorted(contours, key=cv2.contourArea, reverse=True)[0]
rect = cv2.minAreaRect(c)
box = np.int0(cv2.boxPoints(rect))
#重点 这里的img要换成frame
cv2.drawContours(frame, [box], -1, (0, 255, 0), 3)
cv2.putText(frame, 'xuebi',(box[0][0],box[0][1]) , cv2.FONT_HERSHEY_SIMPLEX, 2, (0,0,255), 1)
cv2.namedWindow("Photo_Detect") #定义一个窗口
cap=cv2.VideoCapture(1) #捕获摄像头图像 0位默认的摄像头 笔记本的自带摄像头 1为外界摄像头
while(True): #值为1不断读取图像
ret, frame = cap.read() #视频捕获帧
cv2.imwrite('cap_RGB.jpg',frame) #写入捕获到的视频帧 命名为cap_RGB.jpg
img_disapose() #图像处理
cv2.imshow('Photo_Detect',frame) #显示窗口 查看实时图像
if cv2.waitKey(1) & 0xFF == ord('Q'): #按Q关闭所有窗口 一次没反应的话就多按几下
break
#执行完后释放窗口
cap.release()
cv2.waitKey(0)
cv2.destroyAllWindows()
觉得有用的不妨点个赞