Python3+Opencv 学习笔记(四)摄像头捕获图像+摄像头图像处理识别

图片能处理和识别了,接下来就是摄像头了

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()

效果如下
Python3+Opencv 学习笔记(四)摄像头捕获图像+摄像头图像处理识别_第1张图片
可以识别摄像头当前所看到的图像
按一下S
输出灰度图
Python3+Opencv 学习笔记(四)摄像头捕获图像+摄像头图像处理识别_第2张图片
视频读取没什么问题了

接下来是结合之前的图像处理 对摄像头图像进行实时处理

实现原理很简答
把摄像头读取一帧,存储一帧的数据进行处理 然后输出
因为机器处理的速度的很快 可以对每一帧 每一个图像进行处理
所以看起来效果就是实时处理摄像头的所显示的视频

测试的效果
Python3+Opencv 学习笔记(四)摄像头捕获图像+摄像头图像处理识别_第3张图片
Python3+Opencv 学习笔记(四)摄像头捕获图像+摄像头图像处理识别_第4张图片
移动物品 框会跟着动
一样的按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()

觉得有用的不妨点个赞

你可能感兴趣的:(Python3+Opencv 学习笔记(四)摄像头捕获图像+摄像头图像处理识别)