执笔共著文 2022-10-08 14:08 采纳率: 11.1%
浏览 316
已结题

使用opencv获取摄像头时,运行一段时间后,有概率会断开(不稳定)

问题:
在pycharm社区版中,使用opencv获取摄像头时,运行一段时间后,rtsp流突然断开。(有时候会断开,有时候不会)

怎么解决?
求告知!

代码如下

import base64
import cv2
from flask import Flask
from flask_sockets import Sockets
from imutils.video import FileVideoStream
import asyncio
import websockets

app = Flask(__name__)
sockets = Sockets(app)
fvs = FileVideoStream(1).start()
async def video_stream(websocket, path):
    cap = cv2.VideoCapture(1)
    cap.set(6, cv2.VideoWriter.fourcc('M', 'J', 'P', 'G'))
    while True:
        ret, img = cap.read()
        if not ret:
            # 若没有帧返回,则重新刷新rtsp视频流
            cap = cv2.VideoCapture(1)
            ret, frame = cap.read()
            continue
        encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 50]
        result, img_encode = cv2.imencode('.jpg', img, encode_param)
        image_b = base64.b64encode(img_encode).decode()
        await websocket.send(image_b)
        print(type(image_b))


if __name__ == "__main__":
   start_server = websockets.serve(video_stream, 'localhost', 8778)
   asyncio.get_event_loop().run_until_complete(start_server)
   asyncio.get_event_loop().run_forever()
import base64
import datetime
import cv2
import numpy as np
import asyncio
import websockets

now = datetime.datetime.now()
print(now)


async def send_query_webSocket():
    url = "ws://localhost:8778"
    async with websockets.connect(url, ping_interval=None) as websocket:
        while True:
            greeting = await websocket.recv()
            image0 = base64.b64decode(greeting)
            image1 = np.frombuffer(image0, np.uint8)
            images = cv2.imdecode(image1, cv2.IMREAD_COLOR)

            cv2.imshow("re", images)
            cv2.waitKey(1)
            # cv2.destroyAllWindows()
            print(type(greeting))


if __name__ == "__main__":
    asyncio.get_event_loop().run_until_complete(send_query_webSocket())
  • 写回答

1条回答 默认 最新

  • 爱晚乏客游 2022-10-08 17:15
    关注

    img


    重新刷新之前先把旧的cap先release掉,并且重新 cap.set(6, cv2.VideoWriter.fourcc('M', 'J', 'P', 'G'))。
    还有一种可能,如果你的帧传递比接受后处理的速度快很多,也很可能断流的(常见的是花屏的情况),如果是这种情况,你得在接收端弄个视频缓存队列,新数据挤掉旧帧,这样虽然会掉帧,但是不会出现花屏或者断流的现象

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月25日
  • 创建了问题 10月8日

悬赏问题

  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Linux权限管理相关操作(求解答)
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表
  • ¥15 DbVisualizer Pro 12.0.7 sql commander光标错位 显示位置与实际不符
  • ¥15 求一份STM32F10X的I2S外设库
  • ¥15 android 打包报错
  • ¥15 关于stm32的问题
  • ¥15 ncode振动疲劳分析中,noisefloor如何影响PSD函数?