3428| 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实现以上功能。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed