【智控万物】树莓派对接海康威视摄像头
1、树莓派4+Python3.7安装OpenCV4.1.1参考https://blog.csdn.net/Hankerchen/article/details/103510024,安装成功
2、因自己树莓派的摄像头(网上说,它特别容易坏)已损坏,只能直接使用USB摄像头测试。
参考https://blog.csdn.net/yjp19871013/article/details/80147803(树莓派接入USB摄像头)
$ sudo apt-get install luvcview$ luvcview -s 1080x720
3、树莓派4B+opencv4+python 打开摄像头的实现方法
import cv2
cap=cv2.VideoCapture(0) #调用摄像头‘0'一般是打开电脑自带摄像头,‘1'是打开外部摄像头(只有一个摄像头的情况)
width=1280
height=960
cap.set(cv2.CAP_PROP_FRAME_WIDTH,width)#设置图像宽度
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,height)#设置图像高度
#显示图像
while True:
ret,frame=cap.read()#读取图像(frame就是读取的视频帧,对frame处理就是对整个视频的处理)
#print(ret)#
#######例如将图像灰度化处理,
img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#转灰度图
cv2.imshow("img",img)
########图像不处理的情况
cv2.imshow("frame",frame)
input=cv2.waitKey(20)
if input==ord('q'):#如过输入的是q就break,结束图像显示,鼠标点击视频画面输入字符
break
cap.release()#释放摄像头
cv2.destroyAllWindows()#销毁窗口
4、树莓派4B+opencv4+python 视频捕获,异动分析,QQ报警
#监控报警记录,加语音报警
import imutils,cv2,time
#import pyttsx3
#engine = pyttsx3.init()
import smtplib
from email.header import Header # 用来设置邮件头和邮件主题
from email.mime.text import MIMEText # 发送正文只包含简单文本的邮件,引入MIMEText即可
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
def SendEmail(image_name):
# 发件人和收件人
sender = 'hbzlzx@qq.com'
receiver = 'hbzlzx@qq.com'
# 所使用的用来发送邮件的SMTP服务器
smtpServer = 'smtp.qq.com'
# 发送邮箱的用户名和授权码(不是登录邮箱的密码)
username = 'hbzlzx@qq.com'
password = '*****************'
mail_title = '监控自动报警'
mail_body = '这里是邮件的正文'
mail_msg='''
<p>监控截图如下:</p>
<p><img src="cid:image1"></p>
'''
# 创建一个实例
msg = MIMEMultipart()
msg['Subject'] = mail_title# 标题
msg['From'] = sender# 邮件中显示的发件人别称
msg['To'] = receiver# ...收件人...
msg.attach(MIMEText(mail_msg, 'html', 'utf-8'))
# 指定图片为当前目录
fp = open(image_name, 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
# 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<image1>')
msg.attach(msgImage)
ctype = 'application/octet-stream'
maintype, subtype = ctype.split('/', 1)
# 附件-图片
image = MIMEImage(open(image_name, 'rb').read(), _subtype=subtype)
image.add_header('Content-Disposition', 'attachment', filename='img.jpg')
msg.attach(image)
try:
smtp = smtplib.SMTP() # 创建一个连接
smtp.connect(smtpServer) # 连接发送邮件的服务器
smtp.login(username, password) # 登录服务器
smtp.sendmail(sender, receiver, msg.as_string())# 填入邮件的相关信息并发送
print("邮件发送成功!!!")
smtp.quit()
except smtplib.SMTPException:
print("邮件发送失败!!!")
framefirst=None
avg=None
num=0
j=0
img_name=''
camera = cv2.VideoCapture(0)
while True:
text = "Unoccupied"
# 获取当前帧并初始化occupied/unoccupied文本
# Capture frame-by-frame
ret, frame = cap.read()
# 调整该帧的大小,并且对其进行高斯模糊
frame = imutils.resize(frame, width=500)
imageold=frame.copy()
#转换为灰阶图像
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#高斯模糊 这里(21, 21)表示高斯矩阵的长与宽都是5,
#标准差取0时OpenCV会根据高斯矩阵的尺寸自己计算。概括地讲,高斯矩阵的尺寸越大,标准差越大,处理过的图像模糊程度越大。
gray = cv2.GaussianBlur(gray, (21, 21), 0)
if framefirst is None :
framefirst=gray
continue
if avg is None:
avg = gray.copy().astype("float")
continue
#图像叠加or图像混合加权实现
#cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst
#dst = src1 * alpha + src2 * beta + gamma;
cv2.accumulateWeighted(gray, avg, 0.5)
gray = cv2.absdiff(gray, cv2.convertScaleAbs(avg))
# 二值化处理,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图 ,
#像素高于阈值时,给像素赋予新值,否则,赋予另外一种颜色。函数是cv2.threshold()
ret, binary = cv2.threshold(gray,5,255,cv2.THRESH_BINARY)
#学习不同的形态学操作,例如腐蚀,膨胀,开运算,闭运算等
#我们要学习的函数有:cv2.erode(),cv2.dilate(),cv2.morphologyEx()等
#与卷积核对应的原图像的像素值中只要有一个是1,中心元 素的像素值就是1。所以这个操作会增加图像中的白色区域(前景)。
#一般在去噪声时先用腐蚀再用膨胀。因为腐蚀在去掉白噪声的同时,也会使前景对象变小。
#所以我们再对他进行膨胀。这时噪声已经被去除了,不会再回来了,但是前景还在并会增加。膨胀也可以用来连接两个分开的物体。
thresh = cv2.dilate(binary, None, iterations=2)
#binary:寻找轮廓的图像
#轮廓的检索模式:cv2.RETR_EXTERNAL表示只检测外轮廓
#cv2.RETR_TREE建立一个等级树结构的轮廓。
#cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
a,contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
#第一个参数是指明在哪幅图像上绘制轮廓;
#第二个参数是轮廓本身,在Python中是一个list。
#第三个参数指定绘制轮廓list中的哪条轮廓,如果是-1则绘制其中的所有轮廓。
#thickness表明轮廓线的宽度,如果是-1(cv2.FILLED),则为填充模式。
#
cv2.drawContours(frame,contours,-1,(0,0,255),3)
for c in contours:
# if the contour is too small, ignore it
if cv2.contourArea(c) < 1000:
continue
# 计算轮廓线的外框, 在当前帧上画出外框,
# 并且更新文本
(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
text = "Occupied"
if text=="Occupied" :
num+=1
if num>5 :
# 在当前帧上标记文本和时间戳
now = int(time.time()) # 1533952277
timeArray = time.localtime(now)
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
cv2.putText(imageold, "Room Status: {}".format(text), (10, 20),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
cv2.putText(imageold, otherStyleTime, (10, imageold.shape - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1)
img_name=r'./img/image'+str(j) + '.jpg'
cv2.imwrite(img_name, imageold)
SendEmail(img_name)
j+=1
num=0
#engine.say('报警,你的照片已记录,将作为证据。请你立刻停止违法行为')
#engine.runAndWait()
cv2.imshow("contours", frame)
cv2.imshow("Gray", gray)
cv2.imshow("binary", binary)
key = cv2.waitKey(1) & 0xFF
# 如果q键被按下,跳出循环
if key == ord("q"):
break
# 清理摄像机资源并关闭打开的窗口
camera.release()
cv2.destroyAllWindows()
5、VNC下树莓派查看监控摄像头有很大延迟。
#监控报警记录,加语音报警
import imutils,cv2,time
#import pyttsx3
#engine = pyttsx3.init()
import smtplib
from email.header import Header # 用来设置邮件头和邮件主题
from email.mime.text import MIMEText # 发送正文只包含简单文本的邮件,引入MIMEText即可
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
def SendEmail(image_name):
# 发件人和收件人
sender = 'hbzlzx@qq.com'
receiver = 'hbzlzx@qq.com'
# 所使用的用来发送邮件的SMTP服务器
smtpServer = 'smtp.qq.com'
# 发送邮箱的用户名和授权码(不是登录邮箱的密码)
username = 'hbzlzx@qq.com'
password = '*****************'
mail_title = '监控自动报警'
mail_body = '这里是邮件的正文'
mail_msg='''
<p>监控截图如下:</p>
<p><img src="cid:image1"></p>
'''
# 创建一个实例
msg = MIMEMultipart()
msg['Subject'] = mail_title# 标题
msg['From'] = sender# 邮件中显示的发件人别称
msg['To'] = receiver# ...收件人...
msg.attach(MIMEText(mail_msg, 'html', 'utf-8'))
# 指定图片为当前目录
fp = open(image_name, 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
# 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<image1>')
msg.attach(msgImage)
ctype = 'application/octet-stream'
maintype, subtype = ctype.split('/', 1)
# 附件-图片
image = MIMEImage(open(image_name, 'rb').read(), _subtype=subtype)
image.add_header('Content-Disposition', 'attachment', filename='img.jpg')
msg.attach(image)
try:
smtp = smtplib.SMTP() # 创建一个连接
smtp.connect(smtpServer) # 连接发送邮件的服务器
smtp.login(username, password) # 登录服务器
smtp.sendmail(sender, receiver, msg.as_string())# 填入邮件的相关信息并发送
print("邮件发送成功!!!")
smtp.quit()
except smtplib.SMTPException:
print("邮件发送失败!!!")
framefirst=None
avg=None
num=0
j=0
img_name=''
url = 'rtsp://admin:HikCUALGW@192.168.31.240:554/Streaming/Channels/101'
cap = cv2.VideoCapture(url)
while True:
text = "Unoccupied"
# 获取当前帧并初始化occupied/unoccupied文本
# Capture frame-by-frame
ret, frame = cap.read()
# 调整该帧的大小,并且对其进行高斯模糊
frame = imutils.resize(frame, width=500)
imageold=frame.copy()
#转换为灰阶图像
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#高斯模糊 这里(21, 21)表示高斯矩阵的长与宽都是5,
#标准差取0时OpenCV会根据高斯矩阵的尺寸自己计算。概括地讲,高斯矩阵的尺寸越大,标准差越大,处理过的图像模糊程度越大。
gray = cv2.GaussianBlur(gray, (21, 21), 0)
if framefirst is None :
framefirst=gray
continue
if avg is None:
avg = gray.copy().astype("float")
continue
#图像叠加or图像混合加权实现
#cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst
#dst = src1 * alpha + src2 * beta + gamma;
cv2.accumulateWeighted(gray, avg, 0.5)
gray = cv2.absdiff(gray, cv2.convertScaleAbs(avg))
# 二值化处理,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图 ,
#像素高于阈值时,给像素赋予新值,否则,赋予另外一种颜色。函数是cv2.threshold()
ret, binary = cv2.threshold(gray,5,255,cv2.THRESH_BINARY)
#学习不同的形态学操作,例如腐蚀,膨胀,开运算,闭运算等
#我们要学习的函数有:cv2.erode(),cv2.dilate(),cv2.morphologyEx()等
#与卷积核对应的原图像的像素值中只要有一个是1,中心元 素的像素值就是1。所以这个操作会增加图像中的白色区域(前景)。
#一般在去噪声时先用腐蚀再用膨胀。因为腐蚀在去掉白噪声的同时,也会使前景对象变小。
#所以我们再对他进行膨胀。这时噪声已经被去除了,不会再回来了,但是前景还在并会增加。膨胀也可以用来连接两个分开的物体。
thresh = cv2.dilate(binary, None, iterations=2)
#binary:寻找轮廓的图像
#轮廓的检索模式:cv2.RETR_EXTERNAL表示只检测外轮廓
#cv2.RETR_TREE建立一个等级树结构的轮廓。
#cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
a,contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
#第一个参数是指明在哪幅图像上绘制轮廓;
#第二个参数是轮廓本身,在Python中是一个list。
#第三个参数指定绘制轮廓list中的哪条轮廓,如果是-1则绘制其中的所有轮廓。
#thickness表明轮廓线的宽度,如果是-1(cv2.FILLED),则为填充模式。
#
cv2.drawContours(frame,contours,-1,(0,0,255),3)
for c in contours:
# if the contour is too small, ignore it
if cv2.contourArea(c) < 1000:
continue
# 计算轮廓线的外框, 在当前帧上画出外框,
# 并且更新文本
(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
text = "Occupied"
if text=="Occupied" :
num+=1
if num>5 :
# 在当前帧上标记文本和时间戳
now = int(time.time()) # 1533952277
timeArray = time.localtime(now)
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
cv2.putText(imageold, "Room Status: {}".format(text), (10, 20),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
cv2.putText(imageold, otherStyleTime, (10, imageold.shape - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1)
img_name=r'./img/image'+str(j) + '.jpg'
cv2.imwrite(img_name, imageold)
SendEmail(img_name)
j+=1
num=0
#engine.say('报警,你的照片已记录,将作为证据。请你立刻停止违法行为')
#engine.runAndWait()
cv2.imshow("contours", frame)
cv2.imshow("Gray", gray)
cv2.imshow("binary", binary)
key = cv2.waitKey(1) & 0xFF
# 如果q键被按下,跳出循环
if key == ord("q"):
break
# 清理摄像机资源并关闭打开的窗口
camera.release()
cv2.destroyAllWindows()
树莓智能 家居厉害了 厉害了,大神,向您学习
页:
[1]