海康威视摄像头
2021-01-29 本文已影响0人
邯山之郸
设置
- 关掉红外补光
- 自动白平衡
- 日夜转换为“白天”
网线水晶头接法
网线有两种做法,一种是交叉线,一种是平行(直通)线
交叉线的做法是:一头采用568A标准,一头采用568B标准
平行(直通)线的做法是:两头同为568A标准或568B标准,(一般用到的都是568B平行(直通)线的做法)
568A标准:白绿 绿 白橙 蓝 白蓝 橙 白棕 棕
568B标准:白橙 橙 白绿 蓝 白蓝 绿 白棕 棕
numpy.sum()函数
numpy.sum(a, axis=None, dtype=None, out=None, keepdims=np._NoValue)
在参数列表中:
a是要进行加法运算的向量/数组/矩阵
axis的值可以为None,也可以为整数和元组
其形参的注释如下:
a : array_like elements to sum.
axis的取值有三种情况:1.None,2.整数, 3.整数元组。
(在默认/缺省的情况下,axis取None)
如果axis取None,即将数组/矩阵中的元素全部加起来,得到一个和。
白平衡
白平衡,字面上的理解是白色的平衡。白平衡是描述[显示器]中红、绿、蓝三基色混合生成后白色精确度的一项指标。白平衡是[电视摄像]领域一个非常重要的概念,通过它可以解决[色彩还原]和[色调]处理的一系列问题。白平衡是随着电子影像再现色彩真实而产生的,在专业摄像领域白平衡应用的较早。家用电子产品(家用[摄像机]、数码照相机)中也广泛地使用,然而技术的发展使得[白平衡调整]变得越来越简单容易,但许多使用者还不甚了解白平衡的工作原理,理解上存在诸多误区。它是实现摄像机图像能精确反映被摄物的色彩状况,有手动白平衡和自动白平衡等方式。许多人在使用[数码摄像机]拍摄的时候都会遇到这样的问题:在[日光灯]的房间里拍摄的影像会显得发绿,在室内[钨丝灯]光下拍摄出来的景物就会偏黄,而在日光阴影处拍摄到的照片则莫名其妙地偏蓝,其原因就在于白平衡的设置上 。
打开摄像头
网卡IP地址需要和摄像头在一个ip段,才能访问。
import cv2
import numpy as np
def camera_show():
url = "rtsp://admin:zxcvbnm123@192.168.121.8/Streaming/Channels/2" # 可以使用通道1或者2
cap = cv2.VideoCapture(url)
ret, frame = cap.read()
while ret:
ret, frame = cap.read()
mtx=np.array([[939,0,638],[0,938,353],[0,0,1]])
dist=np.array([-0.3947,0.1125,0,0,0])
frame=cv2.undistort(frame,mtx,dist,None,None)# cv2.undistort(frame, mtx, dist, None, None)
cv2.imshow("frame",frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
cap.release()
if __name__ == "__main__":
camera_show()
保存视频
import cv2
import numpy as np
import time, datetime
import sys
def camera_record(fnamesave):
"""
函数名:cv2.VideoCapture()
功 能:通过摄像头捕获实时图像数据
返回值:有
参数一:摄像头代号,0为默认摄像头,笔记本内建摄像头一般为 0
或者填写视频名称直接加载本地视频文件
"""
url = "rtsp://admin:zxcvbnm123@192.168.121.8/Streaming/Channels/2" # 可以使用通道1或者2
cap = cv2.VideoCapture(url) # 创建一个 VideoCapture 对象,打开摄像头
time_begin = time.time()
"""
函数名:cap.set( propId , value )
功 能:设置视频参数。设置视频的宽高值和摄像头有关
使用笔记本内置摄像头时只能设置为 1280*720 以及 640*480,哪怕设置值不同时都会自动校正过来,并且仍然返回 True
返回值:布尔值
参数一:需要设置的视频参数
参数二:设置的参数值
"""
# cap.set(3, 480)
# cap.set(4, 320)
flag = 1; # 设置一个标志,用来输出视频信息
"""
函数名:cv2.isOpened()
功 能:返回一个布尔值( True / False ),检查是否初始化成功,成功返回 True
返回值:布尔值
"""
# fourcc = cv2.VideoWriter_fourcc(*'XVID')#视频存储的格式
# fourcc = cv2.VideoWriter_fourcc(*'MJPG')
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
fps = cap.get(cv2.CAP_PROP_FPS) # 帧率
# 视频的宽高
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), \
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
# print(fnamesave)
out = cv2.VideoWriter(fnamesave, fourcc, fps, size) # 视频存储
while (out.isOpened()): # 循环读取每一帧
"""
函数名:cap.read()
功 能:返回两个值
先返回一个布尔值,如果视频读取正确,则为 True,如果错误,则为 False,也可用来判断是否到视频末尾
再返回一个值,为每一帧的图像,该值是一个三维矩阵
通用接收方法为:
ret,frame = cap.read();
这样 ret 存储布尔值,frame 存储图像
若使用一个变量来接收两个值,如
frame = cap.read()
则 frame 为一个元组,原来使用 frame 处需更改为 frame[1]
返回值:R1:布尔值
R2:图像的三维矩阵
"""
if time.time()-time_begin > 3600: # 3600秒,即一个小时
return 0
ret_flag, Vshow = cap.read()
# gray = cv2.cvtColor(Vshow,cv2.COLOR_BGR2GRAY)
# cv2.imshow("Gray",gray)
if ret_flag is False: # ret为false则关闭
exit()
cv2.namedWindow('video', cv2.WINDOW_AUTOSIZE) # 创建一个名为video的窗口
cv2.imshow("video", Vshow) # 窗口显示,显示名为 Capture_Test
out.write(Vshow) # 将捕捉到的图像存储
k = cv2.waitKey(1) & 0xFF # 每帧数据延时 1ms,延时不能为 0,否则读取的结果会是静态帧
if k == ord('s'): # 若检测到按键 ‘s’,打印字符串
"""
函数名:cap.get( propId )
功 能:查询视频的参数
返回值:无
参数一:查询的视频参数,其中部分值可以使用 cap.set() 进行修改
"""
print(cap.get(3))
print(cap.get(4))
elif k == ord('q'): # 若检测到按键 ‘q’,退出
sys.exit(0)
break
cap.release() # 释放摄像头
out.release()
cv2.destroyAllWindows() # 删除建立的全部窗口
if __name__ == "__main__":
while True:
fname=datetime.datetime.now().strftime('outvideo%Y-%m-%d-%H') # 一个小时换一次文件名
fdir = r'D:/'
fnamesave = fdir+fname+r'.mp4'
camera_record(fnamesave)
查看所有参数
import cv2
url = "rtsp://admin:zxcvbnm123@192.168.121.8/Streaming/Channels/2"
#选择摄像头号,一般从 0 开始
cap = cv2.VideoCapture(url)
#先设置参数,然后读取参数
for i in range(47):
print("No.={} parameter={}".format(i,cap.get(i)))
while True:
ret, img = cap.read()
cv2.imshow("input", img)
# 按 ESC 键退出
key = cv2.waitKey(10)
if key == ord('q'):
break
cv2.destroyAllWindows()
cv2.VideoCapture(0).release()
运行结果:
No.=0 parameter=0.0
No.=1 parameter=0.0
No.=2 parameter=1.1111111111111112e-05
No.=3 parameter=640.0
No.=4 parameter=360.0
No.=5 parameter=25.0
No.=6 parameter=875967080.0
No.=7 parameter=-2562047788015215.0
No.=8 parameter=0.0
No.=9 parameter=0.0
No.=10 parameter=0.0
No.=11 parameter=0.0
No.=12 parameter=0.0
No.=13 parameter=0.0
No.=14 parameter=0.0
No.=15 parameter=0.0
No.=16 parameter=0.0
No.=17 parameter=0.0
No.=18 parameter=0.0
No.=19 parameter=0.0
No.=20 parameter=0.0
No.=21 parameter=0.0
No.=22 parameter=0.0
No.=23 parameter=0.0
No.=24 parameter=0.0
No.=25 parameter=0.0
No.=26 parameter=0.0
No.=27 parameter=0.0
No.=28 parameter=0.0
No.=29 parameter=0.0
No.=30 parameter=0.0
No.=31 parameter=0.0
No.=32 parameter=0.0
No.=33 parameter=0.0
No.=34 parameter=0.0
No.=35 parameter=0.0
No.=36 parameter=0.0
No.=37 parameter=0.0
No.=38 parameter=0.0
No.=39 parameter=0.0
No.=40 parameter=0.0
No.=41 parameter=1.0
No.=42 parameter=1900.0
No.=43 parameter=0.0
No.=44 parameter=0.0
No.=45 parameter=0.0
No.=46 parameter=808596553.0
灰度求和
import cv2
import numpy as np
path = r"C:\Users\Eddie\Pictures\QQplayerPic\\"
filename = r"outvideo2021-01-29-1[00_00_03][20210129-191619].png"
image = cv2.imread(path+filename) #读取图像
(b,g,r) = image[0,0] #读取(0,0)像素,Python中图像像素是按B,G,R顺序存储的
print("位置(0,0)处的像素 - 红:%d,绿:%d,蓝:%d" %(r,g,b)) #显示像素值
image[0,0] = (100,150,200)#更改位置(0,0)处的像素
(b,g,r) = image[0,0]#再次读取(0,0)像素
print("位置(0,0)处的像素 - 红:%d,绿:%d,蓝:%d" %(r,g,b))#显示更改后的像素值
corner = image[0:100,0:100]#读取像素块
print(corner.shape)
cv2.imshow("Corner",corner)#显示读取的像素块
a = np.sum(corner)/255
image[0:100,0:100] = (0,255,0);#更改读取的像素块
b = np.sum(corner)/255
print("a:",a)
print("b:",b)
cv2.imshow("Updated",image)#显示图像
cv2.waitKey(0)#程序暂停