编辑:升级到 OpenCV 2.4.2 和 FFMPEG 0.11.1 似乎已经解决了所有的错误和连接问题,但它仍然没有解决帧率下降的问题。
我在 Ubuntu 12.04 中使用默认的 OpenCV 包,我认为它是 2.3.1。我正在连接到流式传输 MJPEG 的 Foscam FI8910W。我看到有人说最好的方法是使用 opencv+libjpeg+curl,因为 it is faster than the gstreamer solution .但是,我偶尔(50% 的时间)可以在构建时从 OpenCV 连接到相机并获取视频流。该流以大约 30 fps 的速度开始大约 1 秒,然后减慢到 5-10 fps。我正在从事的项目需要 6 个摄像头,最好以 15-30 fps 的速度运行(越快越好)。
这是我的问题:
这是我的代码:
VideoCapture cap;
cap.open("http://10.10.1.10/videostream.asf?user=test&pwd=1234&resolution=32");
Mat frame;
cap >> frame;
wr.open("test.avi", CV_FOURCC('P','I','M','1'), 29.92, frame.size(), true);
if(!wr.isOpened())
{
cout << "Video writer open failed" << endl;
return(-1);
}
Mat dst = Mat::zeros(frame.rows + HEADER_HEIGHT, frame.cols, CV_8UC3);
Mat roi(dst, Rect(0, HEADER_HEIGHT-1, frame.cols, frame.rows));
Mat head(dst, Rect(0,0,frame.cols, HEADER_HEIGHT));
Mat zhead = Mat::zeros(head.rows, head.cols, CV_8UC3);
namedWindow("test", 1);
time_t tnow;
tm *tS;
double t1 = (double)getTickCount();
double t2;
for(int i = 0; i>-1 ; i++) // infinite loop
{
cap >> frame;
if(!frame.data)
break;
tnow = time(0);
tS = localtime(&tnow);
frame.copyTo(roi);
std::ostringstream L1, L2;
L1 << tS->tm_year+1900 << " " << coutPrep << tS->tm_mon+1 << " ";
L1 << coutPrep << tS->tm_mday << " ";
L1 << coutPrep << tS->tm_hour;
L1 << ":" << coutPrep << tS->tm_min << ":" << coutPrep << tS->tm_sec;
actValueStr = L1.str();
zhead.copyTo(head);
putText(dst, actValueStr, Point(0,HEADER_HEIGHT/2), fontFace, fontScale, Scalar(0,255,0), fontThickness, 8);
L2 << "Frame: " << i;
t2 = (double)getTickCount();
L2 << " " << (t2 - t1)/getTickFrequency()*1000. << " ms";
t1 = (double)getTickCount();
actValueStr = L2.str();
putText(dst, actValueStr, Point(0,HEADER_HEIGHT), fontFace, fontScale, Scalar(0,255,0), fontThickness, 8);
imshow("test", dst);
wr << dst; // write frame to file
cout << "Frame: " << i << endl;
if(waitKey(30) >= 0)
break;
}
下面是正确运行时列出的错误:
Opening 10.10.1.10
Using network protocols without global network initialization. Please use avformat_network_init(), this will become mandatory later.
Using network protocols without global network initialization. Please use avformat_network_init(), this will become mandatory later.
[asf @ 0x701de0] max_analyze_duration reached
[asf @ 0x701de0] Estimating duration from bitrate, this may be inaccurate
[asf @ 0x701de0] ignoring invalid packet_obj_size (21084 656 21720 21740)
[asf @ 0x701de0] freeing incomplete packet size 21720, new 21696
[asf @ 0x701de0] ff asf bad header 0 at:1029744
[asf @ 0x701de0] ff asf skip 678 (unknown stream)
[asf @ 0x701de0] ff asf bad header 45 at:1030589
[asf @ 0x701de0] packet_obj_size invalid
[asf @ 0x701de0] ff asf bad header 29 at:1049378
[asf @ 0x701de0] packet_obj_size invalid
[asf @ 0x701de0] freeing incomplete packet size 21820, new 21684
[asf @ 0x701de0] freeing incomplete packet size 21684, new 21836
Using network protocols without global network initialization. Please use avformat_network_init(), this will become mandatory later.
Using network protocols without global network initialization. Please use avformat_network_init(), this will become mandatory later.
[asf @ 0x701de0] Estimating duration from bitrate, this may be inaccurate
Successfully opened network camera
[swscaler @ 0x8cf400] No accelerated colorspace conversion found from yuv422p to bgr24.
Output #0, avi, to 'test.avi':
Stream #0.0: Video: mpeg1video (hq), yuv420p, 640x480, q=2-31, 19660 kb/s, 90k tbn, 29.97 tbc
[swscaler @ 0x9d25c0] No accelerated colorspace conversion found from yuv422p to bgr24.
Frame: 0
[swscaler @ 0xa89f20] No accelerated colorspace conversion found from yuv422p to bgr24.
Frame: 1
[swscaler @ 0x7f7840] No accelerated colorspace conversion found from yuv422p to bgr24.
Frame: 2
[swscaler @ 0xb9e6c0] No accelerated colorspace conversion found from yuv422p to bgr24.
Frame: 3
有时它会在第一个 Estimating duration from bitrate 语句之后挂起
最佳答案
您是否尝试删除写入磁盘的代码?当磁盘缓冲区填满时,我已经看到与 USB 相机非常相似的性能问题。一开始帧率很高,然后急剧下降。
如果这是问题所在,另一种选择是将您的压缩编解码器更改为压缩更显着的编解码器。
关于c++ - 初始突发后 OpenCV 网络 (IP) 相机每秒帧数变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11333698/
在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到rubygems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识