python收入波动告警分析_[计算机视觉]100行python实现摄像机偏移、抖动告警

背景

在实际项目中,利用深度学习在检测道路车辆并分析车辆行为时,需要按照事先规定的方法绘制检测区(包含道路方向、车道区域等)。由于各种原因(人为、天气),获取视频数据的摄像角度容易偏移原来设定的位置,造成检测区域和实际画面不匹配,系统容易产生误检误报等错误数据。因此需要在摄像机位置偏移第一时间告诉系统检测模块停止工作,直到摄像机归位后再进行检测。摄像机角度偏移告警属于‘视频诊断’中的一类,本文利用提取图片特征点实现摄像机偏移告警,demo全部python代码不足200行。

前面有几篇博客文字太少,发不了首页:

这里是

图像特征点

对于任何一张二维图片,从像素级别上看,都存在一些我们肉眼看不到的比较独特的像素单元(可以理解为像素块),就像我们每个人的脸都会与众不同一样,我们称这些具有特点的像素区域为“图像特征点”。已经有非常成熟的算法来提取图片的特征点:

(1)Harris:用于检测角点;

(2)SIFT:用于检测斑点;

(3)SURF:用于检测斑点;

(4)FAST:用于检测角点;

(5)BRIEF:用于检测斑点;

(6)ORB:表示带方向的FAST算法与具有旋转不变性的BRIEF算法;

详细算法原理上网搜一下(我也不是很清楚:)),OpenCV中包含以上几种算法实现。

角点:

图像中涉及到拐角的区域,比如物体有轮廓,图像中的物体有边缘区分。

斑点:

一块有特别规律的像素区域。

方向、尺寸不变性:

指特征点不会受图片尺寸、旋转而改变,比如同一张图,你缩小一倍旋转90度后,特征点还是一样的。

图像匹配

提取两张图片的特征点,然后将这些特征点进行匹配关联。如果匹配程度满足某一阈值,则认为这两张图满足匹配条件。注意,对于同一个物体,拍摄角度不同,亮度不同都应该满足匹配条件。

可以看到,对于同一个场景的不同拍摄角度的两张图片,能找到匹配到的特征点,但是误差非常大。我们设置一个阈值,满足该条件才认为两个点匹配:

误差少很多了,匹配到的特征点也非常正确。

换一组摄像机的照片,前一张和后一张在拍摄时,摄像机角度往左下角有偏移,所以对应匹配到的特征点往右上方移动了:

我们可以看到,虽然拍摄角度不同,但是由于场景类似,仍然能匹配到特征点(为了减少绘图方便看清楚,阈值设置非常严格,如果放宽一点还能看到更多匹配到的点),而且这些匹配到的点几乎都正确。对于两张完全不同的场景照片,匹配到的特征点非常少或者为零(具体看设置的阈值)

场景不同,匹配到的特征点只有视频上的文字。

角度偏移告警

如果摄像机位置不变,前后拍摄两张照片,那么这两张照片匹配到的特征点的二维物理坐标应该是一样的(可能有轻微偏移,两张照片尺寸一致)。那么我们可以根据摄像机前后两帧(或间隔时间内取得的两帧)的匹配点物理位置是否有偏移,设置一个偏移阈值,大于该阈值时则认为偏移,否则认为没偏移(或轻微偏移),当然,如果两帧匹配到的特征点非常少(低于一个阈值),那么我们认为这俩帧完全不一样了(场景不一样了),这时候摄像机完全偏移了原来的角度。

注意点:

1)阈值非常重要;

2)前后帧匹配时,要去掉类似摄像机自动加上去的“视频位置”、“当前时间”等等区域,因为这些区域很多时候能够匹配到特征点,并且物理位置坐标不会发生变化,造成误差;

3)在计算特征点物理位置偏移量时,取所有特征点物理位置偏移的平均值。

最终效果

间隔时间取视频中的帧,进行特征点对比。根据前面的思路分为4个等级:“无偏移”、“轻度偏移(抖动)”、“严重偏移”、“完全偏移”。

源代码

最重要的是代码,很简单,直接贴上来即可。加起来不到160行。测试很多场景,效果都不错。

1 '''

2 视频帧匹配脚本3 '''

4 importnumpy as np5 importcv26

7 #至少10个点匹配

8 MIN_MATCH_COUNT = 10

9 #完全匹配偏移 d<4

10 BEST_DISTANCE = 4

11 #微量偏移 4

12 GOOD_DISTANCE = 10

13

14

15 #特征点提取方法,内置很多种

16 algorithms_all ={17 "SIFT": cv2.xfeatures2d.SIFT_create(),18 "SURF": cv2.xfeatures2d.SURF_create(8000),19 "ORB": cv2.ORB_create()20 }21

22 '''

23 # 图像匹配24 # 0完全不匹配 1场景匹配 2角度轻微偏移 3完全匹配25 '''

26 defmatch2frames(image1, image2):27 img1 =cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)28 img2 =cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)29

30 size1 =img1.shape31 size2 =img2.shape32

33 img1 = cv2.resize(img1, (int(size1[1]*0.3), int(size1[0]*0.3)), cv2.INTER_LINEAR)34 img2 = cv2.resize(img2, (int(size2[1]*0.3), int(size2[0]*0.3)), cv2.INTER_LINEAR)35

36 sift = algorithms_all["SIFT"]37

38 kp1, des1 =sift.detectAndCompute(img1, None)39 kp2, des2 =sift.detectAndCompute(img2, None)40

41 FLANN_INDEX_KDTREE =042 index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)43 search_params = dict(checks = 50)44

45 flann =cv2.FlannBasedMatcher(index_params, search_params)46

47 matches = flann.knnMatch(des1, des2, k=2)48

49 #过滤

50 good =[]51 for m,n inmatches:52 if m.distance < 0.7*n.distance:53 good.append(m)54

55 if len(good) <=MIN_MATCH_COUNT:56 return 0 #完全不匹配

57 else:58 distance_sum = 0 #特征点2d物理坐标偏移总和

59 for m ingood:60 distance_sum +=get_distance(kp1[m.queryIdx].pt, kp2[m.trainIdx].pt)61 distance = distance_sum / len(good) #单个特征点2D物理位置平均偏移量

62

63 if distance <64 return>

65 elif distance < GOOD_DISTANCE and distance >=BEST_DISTANCE:66 return 2 #部分偏移

67 else:68 return 1 #场景匹配

69

70

71 '''

72 计算2D物理距离73 '''

74 defget_distance(p1, p2):75 x1,y1 =p176 x2,y2 =p277 return np.sqrt((x1-x2)**2 + (y1-y2)**2)78

79

80 if __name__ == "__main__":81 pass

测试

1 '''

2 摄像机角度偏移告警3 '''

4 importcv25 importdo_match6 importnumpy as np7 from PIL importImage, ImageDraw, ImageFont8

9 '''

10 告警信息11 '''

12 defputText(frame, text):13 cv2_im =cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)14 pil_im =Image.fromarray(cv2_im)15

16 draw =ImageDraw.Draw(pil_im)17 font = ImageFont.truetype("fonts/msyh.ttc", 30, encoding="utf-8")18 draw.text((50, 50), text, (0, 255, 255), font=font)19

20 cv2_text_im =cv2.cvtColor(np.array(pil_im), cv2.COLOR_RGB2BGR)21

22 returncv2_text_im23

24

25

26

27 texts = ["完全偏移","严重偏移", "轻微偏移", "无偏移"]28

29 cap = cv2.VideoCapture('videos/test4_new.mp4')30

31 if (cap.isOpened()==False):32 print("Error opening video stream or file")33

34 first_frame =True35 pre_frame =036

37 index =038

39 while(cap.isOpened()):40 ret, frame =cap.read()41 if ret ==True:42 iffirst_frame:43 pre_frame =frame44 first_frame =False45 continue

46

47 index += 1

48 if index % 24 ==0:49 result =do_match.match2frames(pre_frame, frame)50 print("检测结果===>", texts[result])51

52 if result > 1: #缓存最近无偏移的帧

53 pre_frame =frame54

55 size =frame.shape56

57 if size[1] > 720: #缩小显示

58 frame = cv2.resize(frame, (int(size[1]*0.5), int(size[0]*0.5)), cv2.INTER_LINEAR)59

60 text_frame =putText(frame, texts[result])61

62 cv2.imshow('Frame', text_frame)63 if cv2.waitKey(1) & 0xFF == ord('q'):64 break

65 else:66 break

67

68 cap.release()69 cv2.destroyAllWindows()

64>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进课程实践、课外项目或毕业设计。通过分析和运源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值