帧间差分法python,
0x00
帧间差分法,顾名思义就是计算视频前后帧对应像素的差值。
0x01原理
首先将视频逐帧转换成二值图表,即只有“白”和“黑”两种颜色的图表,然后对前后帧进行差分运算。当当前帧中同一像素的差值不为零,并且差值的绝对值超过设定的阈值时,可以判断图片发生了移动。
0x02的优点是算法简单,程序实现难度低。
不能清晰识别光线变化(如果光线变化不大,二值图像也差不多)。
能够适应各种动态变化的图像具有良好的鲁棒性。
0x03缺点对于快速运动的物体,画面容易变得“模糊”。如果太快,有时会被认为是两个物体。
对于低速运动的物体,由于速度太慢,前后帧几乎重合,无法检测到物体。
检测到的物体有一个‘洞’,只能检测到运动物体的外部,检测到的外部大于物体的实际轮廓。
0x10相邻帧差法
相邻帧差分法是一种两帧法,对相邻两帧图像进行差分运算,得到差值的绝对值,形成运动物体。
它具有实时性高、运算速度快的优点。但是光线突然变化就没有效果了。
0x11代码实现
使用opencv-python演示导入cv2
前一帧
lastFram=无
#我的视频源使用网络摄像头
cap=cv2 .视频采集(RTSP://admin:admin @ 192 . 168 . 31 . 8933608445/live)).
while(cap.isopened))):
逐帧读取相机图片。
ret,fram=cap.read(
转换为灰度
fram=cv2.cvtcolor(Fram,cv2。COLOR_BGR2GRAY)))))))).
#转换为二进制图形
FRAM=cv2。门槛(FRAM,25,255,cv2。THRESH_BINARY ) [1]
#初始帧
如果lastFram为None:
fram=fram
继续
对前一帧和当前帧执行差分操作。
帧增量=cv2。ABS diff (last fram,fram)))))))))))))))).
#使当前帧成为上一帧
lastFram=fram.copy(
#显示
cv2.imshow(f ,fram)).
ifcv2.waitkey(1)0xff==ord ) q):
黑色
cap.release(
cv2.destroyAllWindows(
0x20三帧法
所谓三格,就是在放弃两格的基础上进行AND运算。
假设有A、B、c三帧,AB进行差分运算,BC进行差分运算,然后进行两次差分运算和运算。
适合移动速度超过2帧。
0x21程序实现导入cv2
#一个框架
aFram=无
#B框架
bFram=无
#我的视频源使用网络摄像头
cap=cv2 .视频采集(RTSP://admin:admin @ 192 . 168 . 31 . 8933608445/live)).
while(cap.isopened))):
逐帧读取相机图片。
ret,fram=cap.read(
转换为灰度
fram=cv2.cvtcolor(Fram,cv2。COLOR_BGR2GRAY))))))))))))).
#转换为二进制图形
FRAM=cv2。门槛(FRAM,25,255,cv2。THRESH_BINARY ) [1]
#初始帧
如果bFram为None:
如果aFram为None:
aFram=fram
否则:
bFram=fram
全球之声
abfram=cv2。ABSdiff(afram,bFram))).
继续
BCFRAM=cv2。ABSdiff(BFram,Fram))))))))).
# and运算
thresh=cv2.bitwise_and(adFram,bcFram)).
abFram=bcFram.copy())).
#显示
CV2.imshow(f ,thresh))。
ifcv2.waitkey(1)0xff==ord ) q):
黑色
cap.release(
cv2.destroyAllWindows(
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。