首先,我想对我正在做的事情发表评论。在

我有一个IP摄像机通过一个带以太网线的路由器连接到我的网络(FOSCAM 9800p),我试图用RTSP协议录制一段视频。我未来的打算是用opencv在中间添加一个小的视频处理,但目前我想做一些测试来简单地记录下来。在

主要的问题是相机每秒传送的帧数是可变的,也就是说,有时它传送到18帧,其他的传送到22帧,依此类推。当以每秒帧数的固定速率录制视频时,最终发生的情况是,视频播放的速度超过了应有的速度

奇怪的是,当我用opencv get(CAP_PROP_FPS)运行时,它返回了一个很大的值,比如180000.0

为了解决这个问题,我们要做的是读取帧并将它们放入队列中。从另一个由定时器事件()为了获得固定的帧速率,我们阅读它们并尝试以固定的时间间隔写入视频。在

代码如下:video_capture = cv2.VideoCapture("rtsp://"+user+":"+password+"@"+ip+":"+str(port)+"/videoMain")

if (video_capture.isOpened() == False):

print("Unable to read camera feed")

sys.exit()

frame_width = int(video_capture.get(3))

frame_height = int(video_capture.get(4))

video_writer =cv2.VideoWriter(output_filename,cv2.VideoWriter_fourcc(*'MP4V'), fps_to_save, (frame_width,frame_height))

input_buffer = queue.Queue(20)

finished = False

read_frames = 0

def readFile():

global finished

global read_frames

while not finished:

ret, frame = video_capture.read()

if not ret:

finished = True

while not finished:

try:

input_buffer.put_nowait(frame)

read_frames+=1

break

except queue.Full:

print("queue.Full")

pass

def processingFile():

global finished

written_frames = 0

repeated_frames = 0

time_per_frame_elapsed = 0.0

start_time=time.time()

ticker = threading.Event()

while True:

ticker.wait(time_per_frame-time_per_frame_elapsed)

time_per_frame_start=time.time()

try:

frame = input_buffer.get_nowait()

video_writer.write(frame)

writing_time = time.time()

if written_frames is 0:

start_time = writing_time

written_frames += 1

except queue.Empty:

if written_frames is not 0:

video_writer.write(frame)

writing_time = time.time()

written_frames += 1

repeated_frames += 1

except:

pass

total_elapsed_time = time.time() - start_time

print("total_elapsed_time:{:f}".format(total_elapsed_time))

if total_elapsed_time>time_to_save_seconds:

finished = True

ticker.clear()

print ("Playback terminated.")

break

time_per_frame_elapsed=time.time()-time_per_frame_start

print("Total readed frames:{:f}".format(read_frames))

print("Total frames repated:{:f}".format(repeated_frames))

print("Total frames writed:{:f}".format(written_frames))

tReadFile = threading.Thread(target=readFile)

tProcessingFile = threading.Thread(target=processingFile)

tReadFile.start()

tProcessingFile.start()

tProcessingFile.join()

tReadFile.join()

结果是接近我们想要的,但有时我们在时间上有显著的差异。我们用大约10秒的短视频进行测试,得到9.8秒的录制时间。在

一开始这似乎不是一个严重的问题,但错误是累积的,也就是说,如果我们增加时间的增加,以便录制更长时间的视频,我们会有更严重的问题。在

我们想知道如何解决这种类型的视频录制问题的相机传送帧可变率。这样做是个好主意吗?在

什么会产生《泰晤士报》的累积误差?在

从已经非常感谢你!在

大家好!在

python 摄像头录制帧率_基于opencv和python的可变帧速率IP摄像机视频记录相关推荐

  1. python 摄像头录制帧率_实践:用python实现把视频以帧数输出成连续的多图片

    在处理图像的时候,如果获取了一个视频,想把视频以帧数输出成连续的多图片构成图像数据集. 有人就想问什么软件可以把一段电影视频的每一帧连续自动保存成图片? 其实用很短的python程序就能快速实现该功能 ...

  2. python 检测图像圆弧_基于OpenCV和Python的图像圆弧检测

    尝试以下代码:它将检测所有圆.曲线和圆弧:int main() { //RANSAC //load edge image cv::Mat color = cv::imread("../cir ...

  3. python实现流媒体传输_基于OpenCV的网络实时视频流传输的实现

    很多小伙伴都不会在家里或者办公室安装网络摄像头或监视摄像头.但是有时,大家又希望能够随时随地观看视频直播. 大多数人会选择使用IP摄像机(Internet协议摄像机)而不是CCTV(闭路电视),因为它 ...

  4. 使用opencv和python进行智能图像处理_使用OpenCV在Python中进行图像处理

    编辑推荐: 本文将先讨论一些图像处理,然后再继续介绍可以方便使用图像处理的不同应用程序/场景,希望对您的学习有所帮助. 本文来自于tecdat ,由火龙果软件Alice编辑.推荐. 介绍 在本教程中, ...

  5. python找图片不同_用openCV和Python 实现图片对比,并标识出不同点的方式

    最近项目中需要实现两组图片对比,并能将两者的区别标识出来. 在网上搜索一大堆找到一篇大神的文章,最终实现该功能,在这里记录下: 想要实现此demo,首先我们得确保电脑上已安装 openCV 和 Pyt ...

  6. python实现对数转换_利用opencv在python平台上实现二值变换,伽马变换,对数变换,补色变换等...

    如何用 opencv 在 python 平台上实现灰度图像的二值化,对数变换, ,伽马变换以及补色变 换.代码如下 import cv2 import copy import math import  ...

  7. python人脸识别理论_使用OpenCV和Python进行人脸识别

    介绍 人脸识别是什么?或识别是什么?当你看到一个苹果时,你的大脑会立刻告诉你这是一个苹果.在这个过程中,你的大脑告诉你这是一个苹果水果,用简单的语言来说就是识别.那么什么是人脸识别呢?我肯定你猜对了. ...

  8. python识别银行卡数字_基于opencv -python--银行卡识别

    importcv2importnumpy as npimportmyutilsfrom imutils importcontoursdefcv_show(str,thing): cv2.imshow( ...

  9. python 扫描仪_基于Opencv和Python的多选扫描仪

    首先,我检测到图像右侧的20个黑框,然后将x和宽度添加到列表中:image = cv2.imread(args["image"]) gray = cv2.cvtColor(imag ...

最新文章

  1. Bitsocket——BCH实时API,为BCH带来无限可能
  2. IJ 自动生成构造方法
  3. WINCE6.0+2443系统大概过10分钟进入sleep状态
  4. YbtOJ#526-折纸游戏【二分,hash】
  5. 决策树之前要不要处理缺失值_不要使用这样的决策树
  6. 【CodeForces - 789C】Functions again(最大子段和变形,dp,思维)
  7. Oracle11g 统计信息——统计信息自动收集任务
  8. 深入理解Java 虚拟机
  9. java适配器有哪些_Java中适配器模式(Adapter)是什么? 适配器模式(详解)
  10. 远程监控系统集成方案
  11. 单片机c语言延时30s程序,单片机c语言中的精确延时程序
  12. infer的用法_infer使用的简单介绍
  13. React——相关js库以及使用React开发者工具调试
  14. 用tensorflow.js实现浏览器内的手写数字识别
  15. “好奇号”火星探测器正在利用AI自主寻找探测目标
  16. Ansys Zemax | 如何设计单透镜 第一部分:设置
  17. 【STM32H7教程】第85章 STM32H7的SPI 总线应用之SPI Flash的STM32CubeProg下载算法制作
  18. 输入寄送货物的重量w,根据某快递公司的运费计算方案,计算并输出快递运费p。
  19. 【python】裁剪图片为指定大小,按位置截取,cv2(批量制作主图)
  20. CentOS 升级git

热门文章

  1. wxWidgets:wxWeakRef< T >类模板的用法
  2. WxMac BadgeLabels
  3. boost::type_erasure::binding相关的测试程序
  4. 使用 BOOST_PROTO_DEFINE_OPERATORS 使用非原型类型 std::vector<> 对表达式进行原型化的示例
  5. boost::math::fisher_f用法的测试程序
  6. boost::intrusive::bucket_traits用法的测试程序
  7. boost::bron_kerbosch_all_cliques用法的测试程序
  8. boost::gil::compute_hessian_responses用法的测试程序
  9. GDCM:压缩DICOM影像文件的测试程序
  10. Boost:使用行列式函数和transform()算法计算许多4x4矩阵的行列式