2316浏览
查看: 2316|回复: 1

[教程] 【智控万物】控制海康摄像头

[复制链接]

1、安装相应的opencv库

(1)安装OpenCv
pip install opencv-python


(2)安装NumPy
pip install numpy

(3)安装 scipy
pip install scipy

(4)代码测试1(先用笔记本摄像头测试)
[mw_shl_code=python,false]import cv2
cap=cv2.VideoCapture(0)#打开内置摄像头
ret,frame=cap.read()
while ret :
ret,frame=cap.read()
cv2.resize(frame,(500,500),interpolation=cv2.INTER_AREA)#当图像缩小时候,该方法可以避免波纹出现。
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
ret, mark = cv2.threshold(gray, 70, 255, cv2.THRESH_BINARY)
cv2.imshow("image",frame)#显示窗口
cv2.imshow("gray",gray)
cv2.imshow("mark",mark)
cv2.waitKey(1)#如为0,只显示一张图
cv2.destroyAllWindows()[/mw_shl_code]

(5)代码测试——监控报警记录,加语音报警(pip install pyttsx3)
[mw_shl_code=python,false]#监控报警记录,加语音报警
import imutils,cv2,time
#import pyttsx3
#engine = pyttsx3.init()
camera = cv2.VideoCapture(0)
framefirst=None
avg=None
num=0
j=0
while True:
    text = "Unoccupied"
    # 获取当前帧并初始化occupied/unoccupied文本
    (grabbed, frame) = camera.read()
    # 如果不能抓取到一帧,说明我们到了视频的结尾
    if not grabbed:
        break

    # 调整该帧的大小,并且对其进行高斯模糊
    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个点来保存轮廓信息
    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) < 5000:
            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>20 :
    # 在当前帧上标记文本和时间戳
        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[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1)
        cv2.imwrite('.\\img\\image'+str(j) + '.jpg', imageold)
        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()[/mw_shl_code]




(6)代码测试——使用 baidu-sdk aip 识别人脸
[mw_shl_code=applescript,false]#使用 baidu-sdk aip 识别人脸
from aip import AipFace
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

""" 你的 APPID AK SK """
APP_ID = '11787634'
API_KEY = 'HMggckBKO2PAohsSQ8or9xLG'
SECRET_KEY = '3hmXHTZVQLHgOVF3uE1nrIuGbYR64qHq'

client = AipFace(APP_ID, API_KEY, SECRET_KEY)
import imutils,cv2,base64,json
num=0
j=0
camera = cv2.VideoCapture(0)
while True:
  # 获取当前帧
(grabbed, frame) = camera.read()
while grabbed :  
      
    (grabbed, frame) = camera.read()
    break
# 调整该帧的大小,
cv2.imshow("binary", frame)
    # 如果q键被按下,跳出循环
key = cv2.waitKey(1) & 0xFF
if key == ord("q"):
        break
if num>30 :
   num=0

else :
   num+=1
   continue
frame = imutils.resize(frame, width=500)
cv2.imwrite(".\\img\\image0.jpg", frame)

image =base64.b64encode(get_file_content('.\\img\\image0.jpg'))
image=str(image, encoding='utf-8')#不能传入字节

imageType = "BASE64"

#调用人脸检测 """

options = {}
options["face_field"] = "age,gender,beauty"
options["max_face_num"] = 2
options["face_type"] = "LIVE"
#res=client.detect(image, imageType, options)
res=client.detect(image,imageType,options)
if res['error_msg']=='SUCCESS' :
    if res['result']['face_list'][0]['gender']['type']=='male' :
      gender='男人'
    else :
      gender='女人'            
    print(res['result']['face_list'][0]['age'],'  ',res['result']['face_list'][0]['beauty'],'  ',gender)

[/mw_shl_code]


(7)代码测试——百度语音合成(pip install pygame)
[mw_shl_code=python,false]from aip import AipSpeech
import time,os
import pygame
""" 你的 APPID AK SK """
APP_ID = '14778722'
API_KEY = 'BFoXqkmh5ow7iyYt7A8EWMDo'
SECRET_KEY = 'ZfETPvdqpABOgwlTwQRrohFdZRcT4U6N'
def playmusic(path):
    clip = mp3play.load(path)
    clip.play()
    time.sleep(10)   
    clip.stop()

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

result  = client.synthesis('你好百度', 'zh', 1, {'vol': 5,'per':4})


# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
print(result)# isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
if not isinstance(result, dict):
    with open('auido.mp3', 'wb') as f:
        f.write(result)
os.system('auido.mp3')[/mw_shl_code]
(8)代码测试——循环手势识别

[mw_shl_code=python,false]#循环手势识别

from aip import AipBodyAnalysis
import pyttsx3,cv2
engine = pyttsx3.init()
cap = cv2.VideoCapture(0)
""" 你的 APPID AK SK """
APP_ID = '14333301'
API_KEY = '0OoR1G35nUEKt1E2xagNcr6l'
SECRET_KEY = 'kUoHSSsbMuRcuBT2xWMdWXwXv57rnxW5'

client = AipBodyAnalysis(APP_ID, API_KEY, SECRET_KEY)

def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()
ret, frame = cap.read()
num=0
while 1 :
   ret, frame = cap.read()
   while not ret :
     ret, frame = cap.read()
   cv2.imshow("capture", frame)
   
   cv2.waitKey(1)
   if num>30 :
      num=0
   else :
      num+=1
      print(num)
      continue
   cv2.imwrite('.\\img\image0.jpg', frame)
   image = get_file_content('.\\img\image0.jpg')

   """ 调用手势识别 """
   data=client.gesture(image)
   print (data)
   if data['result_num']>0 :
   
    for s in data['result'] :
        classname=s['classname']
        if classname=='Face' :
           say='只识别出人脸,没有手势'
        
        elif classname=='other' :
           say='没有人脸,没有手势,请重新拍照'

        else :
          if classname=='Point' :
           say='一'
           break
          elif classname=='Two' :
           say='二'
          elif classname=='Three' :
           say='三'
           break
          elif classname=='Four' :
           say='四'
           break
          elif classname=='Five' :
           say='五'
           break
          elif classname=='Six' :
           say='六'
           break
          elif classname=='Seven' :
           say='七'
           break
          elif classname=='Eight' :
           say='八'
           break
          elif classname=='Nine' :
           say='九'
           break
          elif classname=='Rock' :
           say='Rock'
           break
          elif classname=='Heart_3' :
           say='双手比心'
           break
          elif classname=='Heart_1' :
           say='双手比心'
           break
          elif classname=='Heart_2' :
           say='双手比心'
           break
          elif classname=='Palm_up' :
           say='掌心向上'
           break
          elif classname=='ILY' :
           say='我爱你'
           break
          elif classname=='Thumb_down' :
           say='Diss'
           break
          elif classname=='Thumb_up' :
           say='点赞'
           break
          elif classname=='Heart_single' :
           say='单手比心'
           break
          elif classname=='Honour' :
           say='作别'
           break
          elif classname=='Congratulation' :
           say='作揖'
           break
          elif classname=='Prayer' :
           say='祈祷'
           break
          elif classname=='Ok' :
           say='OK'
           break
          elif classname=='Fist' :
           say='拳头'
           break
          elif classname=='Palm' :
           say='掌心向前'
           break
    engine.say(say)
    engine.runAndWait()
   else :
      print('没有人脸,没有手势,请重新拍照')
      engine.say('没有人脸,没有手势,请重新拍照')
      engine.runAndWait()
cap.release()
cv2.destroyAllWindows()[/mw_shl_code]

演示视频识别“一”时,出问题是因为“ if classname=='Point' :”,实际识别为“One”。
2、官网下载海康的SDK(针对自己的电脑系统环境下载对应版本)将里面的HCNetSDKCom文件夹放在python代码同目录下!
https://www.hikvision.com/cn/download_more_570.html#prettyPhoto


3、python读取rtsp流
其中将下面的代码中的相应内容替换成你的就OK了,如相机用户名,密码,IP地址和端口号(常见为554)

[mw_shl_code=python,false]import cv2
cap = cv2.VideoCapture("rtsp://username:passport@ip:port/Streaming/Channels/1")
ret, frame = cap.read()
while ret:
    ret, frame = cap.read()
    cv2.imshow("frame",frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cv2.destroyAllWindows()
cap.release()
[/mw_shl_code]
4、演示
待续
5、接下来会对获取的摄像头图片进行相应的处理,比如人脸识别、人体关键点识别、姿态识别、车牌识别等,通过调用百度API实现以上功能。














pATAq  版主

发表于 2020-5-3 22:18:37

太高产了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2023 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail