OpenCV-使用多个IP摄像机进行运动捕捉

如何解决OpenCV-使用多个IP摄像机进行运动捕捉

我家周围有三个IP摄像机,我想在检测到运动时捕获图像。我想同时为所有3台摄像机运行运动捕捉算法。

我设法用一台摄像机完成这项工作-打开流+运动检测算法+在检测到情况下存储图像:

import cv2


cap3 = cv2.VideoCapture('http://X.X.X.X:XXXX/stream.mjpg')


ret3,frame31 = cap3.read()
ret3,frame32 = cap3.read()

while (True):
    diff3 = cv2.absdiff(frame31,frame32)
    gray3 = cv2.cvtColor(diff3,cv2.COLOR_BGR2GRAY)
    blur3 = cv2.GaussianBlur(gray3,(5,5),0)
    _,tresh3 = cv2.threshold(blur3,30,255,cv2.THRESH_BINARY)
    dilated3 = cv2.dilate(tresh3,None,iterations=3)
    contours3,_ = cv2.findContours(dilated3,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

    for contour in contours3:
        (x,y,w,h) = cv2.boundingRect(contour)
        if cv2.contourArea(contour) < 800:
            continue
        cv2.rectangle(frame31,(x,y),(x + w,y + h),(0,0),2)
        cv2.putText(frame31,"Status: {}".format('Movement'),(10,20),cv2.FONT_HERSHEY_SIMPLEX,1,255),3)
        t = time.localtime()
        filename = "RASP" + str(t[0]) + str(t[1]) + str(t[2]) + "_" + str(t[3]) + str(t[4]) + str(t[5]) + ".jpg"
        cv2.imwrite(filename,frame31)

    frame31 = frame32
    ret3,frame32 = cap3.read()

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap3.release()
cv2.destroyAllWindows()

我遇到的问题是,当我尝试同时为三个摄像机同时执行相同的工作时。 我要做的是在三个摄像机的while循环中复制相同的过程,当我这样做时,它开始运行几秒钟,然后出现此错误:

Traceback (most recent call last):
  File "C:/Users/Guillaume/PycharmProjects/IPCAM/IPCAM2.py",line 54,in <module>
    gray2 = cv2.cvtColor(diff2,cv2.COLOR_BGR2GRAY)
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

我在下面运行的代码:

import cv2
import numpy as np
from datetime import datetime
import time

cap2 = cv2.VideoCapture('rtsp://')  # IPCAM2
cap = cv2.VideoCapture('rtsp://')  # IPCAM1
cap3 = cv2.VideoCapture('http://')  # RASP

def rescale_frame(frame,percent=75):
    width = int(frame.shape[1] * percent / 100)
    height = int(frame.shape[0] * percent / 100)
    dim = (width,height)
    return cv2.resize(frame,dim,interpolation=cv2.INTER_AREA)

while (True):
    ret1,frame11 = cap.read()
    ret1,frame12 = cap.read()

    ret2,frame21 = cap2.read()
    ret2,frame22 = cap2.read()

    ret3,frame31 = cap3.read()
    ret3,frame32 = cap3.read()

    diff1 = cv2.absdiff(frame11,frame12)
    gray1 = cv2.cvtColor(diff1,cv2.COLOR_BGR2GRAY)
    blur1 = cv2.GaussianBlur(gray1,tresh1 = cv2.threshold(blur1,40,cv2.THRESH_BINARY)
    dilated1 = cv2.dilate(tresh1,iterations=3)
    contours1,_ = cv2.findContours(dilated1,cv2.CHAIN_APPROX_SIMPLE)

    for contour in contours1:
        (x,h) = cv2.boundingRect(contour)
        if cv2.contourArea(contour) < 1000:
            continue
        cv2.rectangle(frame11,2)
        cv2.putText(frame11,3)
        t = time.localtime()
        filename = str(t[0]) + str(t[1]) + str(t[2]) + "_" + str(t[3]) + str(t[4]) + str(t[5]) + ".jpg"
        cv2.imwrite(filename,frame11)

    # cv2.line(frame,300),(200,200),5)
    resizedframe11 = rescale_frame(frame11,percent=75)

    cv2.imshow('frame',resizedframe11)

    frame11 = frame12
    ret1,frame12 = cap.read()

    diff2 = cv2.absdiff(frame21,frame22)
    gray2 = cv2.cvtColor(diff2,cv2.COLOR_BGR2GRAY)
    blur2 = cv2.GaussianBlur(gray2,tresh2 = cv2.threshold(blur2,cv2.THRESH_BINARY)
    dilated2 = cv2.dilate(tresh2,iterations=3)
    contours2,_ = cv2.findContours(dilated2,cv2.CHAIN_APPROX_SIMPLE)

    for contour in contours2:
        (x,h) = cv2.boundingRect(contour)
        if cv2.contourArea(contour) < 1000:
            continue
        cv2.rectangle(frame21,2)
        cv2.putText(frame21,frame21)
    resizedframe21 = rescale_frame(frame21,percent=75)

    cv2.imshow('frame2',resizedframe21)

    frame21 = frame22
    ret2,frame22 = cap2.read()

    diff3 = cv2.absdiff(frame31,frame31)
    resizedframe31 = rescale_frame(frame31,percent=75)

    cv2.imshow('frame3',resizedframe31)

    frame31 = frame32
    ret3,frame32 = cap3.read()

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

解决方法

感谢Kartik和thekangaroo的回答。 我设法使用线程同时运行三个摄像机。我只是打开它们并显示调整大小的流。 还有一个问题,一台摄像机,然后在5到20秒之间的随机时间后停止一秒钟。流停止,然后窗口关闭,没有任何消息。 在我看来,这是由于无法从摄像机获取图像而导致的。。。

再次感谢您的帮助。

下面是我使用的代码:

import cv2
import threading
import time

class camThread(threading.Thread):
    def __init__(self,previewName,camID):
        threading.Thread.__init__(self)
        self.previewName = previewName
        self.camID = camID
    def run(self):
        print("Starting " + self.previewName)
        camPreview(self.previewName,self.camID)

def rescale_frame(frame,percent=75):
    width = int(frame.shape[1] * percent / 100)
    height = int(frame.shape[0] * percent / 100)
    dim = (width,height)
    return cv2.resize(frame,dim,interpolation=cv2.INTER_AREA)

def camPreview(previewName,camID):
    cv2.namedWindow(previewName)
    cam = cv2.VideoCapture(camID)
    if cam.isOpened():  # try to get the first frame
        rval,frame = cam.read()
    else:
        time.sleep(10)
        rval,frame = cam.read()

    percent = 50
    width = int(frame.shape[1] * percent / 100)
    height = int(frame.shape[0] * percent / 100)
    dim = (width,height)

    while rval:
        # cv2.imshow(previewName,frame)
        cv2.imshow(previewName,cv2.resize(frame,interpolation=cv2.INTER_AREA))
        time.sleep(0.5)
        rval,frame = cam.read()
        key = cv2.waitKey(20)
        print(previewName + str(cam.isOpened()))

# Create two threads as follows
thread1 = camThread("CLIO",'rtsp://xxxx')
thread2 = camThread("JARDIN",'rtsp://xxxx')
thread3 = camThread("RASPCAM",'http://xxxx')

thread1.start()
thread2.start()
thread3.start()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-