虹梦鸿 2023-07-30 23:54 采纳率: 0%
浏览 33
已结题

程序无法满足要求,且不清楚问题在哪

需要读取视频流识别红绿灯的亮起情况并说明亮灯颜色 程序完成后发现只能读取初始帧的视频信息,视频后续部分无法读取,不清楚具体是什么原因

使用的软件是pycharm python解释器版本为3.7

img

import cv2
import numpy as np


cap = cv2.VideoCapture('hldeng.mp4')  #读取视频
while cap.isOpened():
   ret, frame = cap.read()
   cv2.namedWindow("frame", 0)  # 0可调大小,注意:窗口名必须imshow里面的一窗口名一致
   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 转为灰度视频
   thresh = cv2.threshold(gray, 160, 255, cv2.THRESH_BINARY)[1]#二值化处理
   R = gray[299:311, 475:483]
   Y = gray[293:301, 626:630]
   G = gray[283:292, 758:771]
   sum_R = np.sum(R)
   sum_Y = np.sum(Y)
   sum_G = np.sum(G)

   if sum_R == 0:
      # 如果R中那四个像素点的值之和=0,则显示红灯
      cv2.putText(frame, 'Red light', (100, 100), 0, 2, (0, 0, 255), 3)
   # 用法   putText(选定的视频[或赋予其的变量], "要显示的文字",
   # 要显示的文字的位置坐标(  ,  ), 字体[0为默认], 字体粗细程度, [颜色 BGR](  ,  ,  ,), 字体大小)
   elif sum_Y == 0:
      cv2.putText(frame, 'Yellow light', (100, 100), 0, 2, (0, 255, 255), 3)  # 如果Y中那四个像素点的值之和=0,则显示黄灯
   elif sum_G == 0:
      cv2.putText(frame, 'Green light', (100, 100), 0, 2, (0, 255, 0), 3)  # 如果G中那四个像素点的值之和=0,则显示绿灯

   cv2.imshow('frame', frame)  # 显示处理后的原视频
   cv2.waitKey(10)

  • 写回答

11条回答 默认 最新

  • CF2301_77400554X 2023-07-31 00:00
    关注

    采用chatgpt:
    根据您提供的代码,可能导致视频流仅读取初始帧的问题是由于视频读取过程中的一些细节错误。以下是一些可能导致问题的原因和可能的解决方案:

    1、视频文件路径错误: 确保 hldeng.mp4 视频文件与代码在同一目录下或者提供正确的绝对路径。否则,程序将无法找到视频文件并且无法读取视频流。

    2、检查视频是否成功打开: 在cv2.VideoCapture方法后,最好检查一下视频是否成功打开。您可以使用cap.isOpened()来检查。如果视频没有成功打开,可能是路径问题或视频文件本身损坏。

    3、检查视频的编解码器: 如果视频采用了某种特殊编解码器,可能会导致cv2.VideoCapture无法正确读取视频流。在这种情况下,您可能需要安装缺少的解码器或者转换视频到一个常用的编解码器格式。

    4、检查视频帧率: 您的代码中使用了 cv2.waitKey(10) 来控制视频播放速率,但这不是一个可靠的方法,因为它不能保证视频的实际帧率。建议通过cap.get(cv2.CAP_PROP_FPS)来获取视频的帧率并根据实际帧率来控制视频的播放速率。

    5、视频播放循环: 您的代码中使用了while cap.isOpened()循环来读取视频帧,但需要确保循环正常结束。可以添加一个终止循环的条件,例如按下'q'键来退出循环并释放资源。

    下面是修改后的代码,尝试解决上述问题:

    import cv2
    import numpy as np
     
    cap = cv2.VideoCapture('hldeng.mp4')  #读取视频
    
    if not cap.isOpened():
        print("Error: Unable to open video.")
        exit()
    
    while True:
        ret, frame = cap.read()
    
        if not ret:
            # 视频读取结束,退出循环
            break
    
        cv2.namedWindow("frame", 0)
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        thresh = cv2.threshold(gray, 160, 255, cv2.THRESH_BINARY)[1]
        R = gray[299:311, 475:483]
        Y = gray[293:301, 626:630]
        G = gray[283:292, 758:771]
        sum_R = np.sum(R)
        sum_Y = np.sum(Y)
        sum_G = np.sum(G)
    
        if sum_R == 0:
            cv2.putText(frame, 'Red light', (100, 100), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 0, 255), 3)
        elif sum_Y == 0:
            cv2.putText(frame, 'Yellow light', (100, 100), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 255), 3)
        elif sum_G == 0:
            cv2.putText(frame, 'Green light', (100, 100), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 3)
    
        cv2.imshow('frame', frame)
        
        # 控制视频播放速率
        fps = cap.get(cv2.CAP_PROP_FPS)
        delay = int(1000 / fps)  # 计算每帧之间的延迟,确保视频播放速率与实际帧率一致
        key = cv2.waitKey(delay)
    
        if key == ord('q'):
            # 按下'q'键,退出循环
            break
    
    cap.release()
    cv2.destroyAllWindows()
    

    如果视频中的红绿灯不在固定位置,可能需要使用更复杂的方法来检测红绿灯的状态,例如目标检测或者机器学习方法。上述代码中简单地提取了特定位置的像素来判断灯的状态,可能在更复杂的场景中并不准确。

    评论

报告相同问题?

问题事件

  • 系统已结题 8月7日
  • 创建了问题 7月30日

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上