OpenCV显示图像帧率过低

SuperHeroMario 2018-01-03 04:57:37
我编译了一个测试程序,用来从相机的连续模式中获取图像数据并显示出来,图像取出来是正确的,但是帧率很慢,每秒只有5帧左右,把图像显示的代码注释掉之后,帧率提升极大,达到每秒50帧左右,我测试用的库是opencv2.4.9,图像的数据结构是8位1通道,图像尺寸是1920*1080,相机的借口是USB3.0,传输协议用的是libusb-1.0的库,测试用的MacBook,下面是我的测试程序的图像获取和显示部分。
ret = BeginLive(camhandle);
if(ret == SUCCESS)
{
printf("BeginLive success!\n");
//cvNamedWindow("show",1);

while(ret == SUCCESS)
{
while(ret_live == ERROR){
ret_live = GetLiveFrame(camhandle,&w,&h,&bpp,&channels,ImgData);
}
//image = cvCreateImage(cvSize(w,h),bpp,channels);
//image->imageData = (char *)ImgData;

//cvShowImage("show",image);
//cvWaitKey(1);
ret_live = ERROR;
fps++;

t_end = time(NULL);
if(t_end - t_start >= 1){
t_num ++;
if(t_num % 5 == 0){
printf("Time pass:%3d | Frame rate:%5.1f\n",t_num,(float)fps/5);
fps = 0;
}else
printf("Time pass:%3d | bpp = %d channels = %d\n",t_num,bpp,channels);
t_start = time(NULL);
}

if(t_num >= 120)
{
//break;
ret = ERROR;
}
}

//cvDestroyWindow("show");
//cvReleaseImage(&image);
}
...全文
2174 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxwalkman 2019-12-19
  • 打赏
  • 举报
回复
我也遇到了,但我把mbp连到1080p显示器时帧率正常,直接在自带屏幕上显示帧率很低,同一个代码,所以我感觉是视网膜屏进行了缩放的原因。
SuperHeroMario 2018-01-05
  • 打赏
  • 举报
回复
引用 1 楼 u011258240 的回复:
waitKey(40);
谢谢,不过没效果,和原来一样
大大的道道的 2018-01-04
  • 打赏
  • 举报
回复
waitKey(40);
一、问题的提出 做运动分析检测,需要有一定的素材视频,但是素材视频的编码OpenCV不能识别,无法对指定的视频做实验,怎么素材视频通用化使得OpenCV能正常识别? 二、解决的方法 (1)素材视频总是有配套的播放器来播放,那么使用这个播放器查看总帧数,和总播放时长,计算出帧率为25,表示一秒钟播放25帧图像。 (2)用这个配套的播放器对素材视频进行逐帧步进抓图,这个操作很辛苦,一秒钟25帧,那么抓25帧是一秒,素材视频30秒就要抓750帧,很辛苦。 (3)帧抓完后,发现一帧图1.4M,以位图格式保存,那么30秒就要达到1G的存储空间,怎么办?没办法,不知道怎么去获取解码器和安装解码器,就只能这么忍受。察看到逐帧步进抓图的存储是按序列编排文件名,那么要修改好使得每个文件名都是以规则“文件名”+“帧序列”的形式存在。 (4)编写根据帧序列图生成帧率25的视频的代码 三、问题的解决: (1)解决一个字符串合并的问题: 由于字符串参数有个赋值格式化设置函数叫做Format,要实现多类型参数的字符串化,可以参照如下示例: float f = 0.0; char sz[128]; int n = 1; CString str; str.Format("%f%s%d",f,sz,n); (2)采用MJPG的编码格式依次将这些图像序列写入到视频中保存起来,采用MJPG的编码格式是因为操作系统自带了Media player播放器,这种编码格式属于无压缩的,Media player可以识别播放。 (3)实现方式是使用MFC对话框窗体的按钮事件来进行视频的逐帧写图,由于帧数多,那么在写入器循环做写这个动作的时候,整个程序是假死在那里直到写入器的写入操作终结。
(一)问题的提出 接到一个问题问我,用OpenCV将彩色视频转换为灰度视频并存储到本地磁盘的实践失败,之所以无法存储提问人怀疑是视频编码的问题。 (二)问题的分析 1.OpenCV作为一个非常好的辅助编程的东西,应该是经受得住考验的,怀疑是视频编码出问题不靠谱 2.直觉反应是在写入视频的时候,写入的帧图像存储格式和写入器定义的帧图像格式不符,导致内存报错 3.接收源代码发现有一段代码是这么写的: CvVideoWriter *writer = cvCreateVideoWriter( "myvideo.avi", CV_FOURCC('X', 'V', 'I', 'D'), fps, size); 一下子问题症结就找到了。 要转化为灰度,那这段代码里对函数cvCreateVideoWriter()的掌握程度就要体现了,函数cvCreateVideoWriter()有5个输入参数,第5个输入参数is_color=1是在类cvCreateVideoWriter的构造函数中默认好的,这段代码没有定义is_color,说明同意is_color=1,那么writer写入器写到磁盘上的视频即为彩色视频,写入的帧图像是三通道的彩色图像,而后面的代码cvWriteFrame( writer, gray_frame );中,cvCvtColor( bgr_frame,gray_frame, CV_BGR2GRAY )把彩色的bgr_frame帧图像转化为灰度的图像并存储到gray_frame图像实例中,于是这个gray_frame就与写入器要求的彩色三通道帧图像不一致,即分析2中的直觉:写入的帧图像存储格式和写入器定义的帧图像格式不符,导致内存报错 (三)问题的解决: 1.把代码进行更改,改成: //创建新的视频文件,需要输入视频文件完整路径名,格式,帧率,长宽值,默认是否为彩色值 CvVideoWriter* writer = cvCreateVideoWriter( "6.avi", //存储完整路径 CV_FOURCC('M','J','P','G'), //编码格式 fps,//帧率 size,//长宽值 0//是否为彩色,0为否,默认1为彩色 ); 2.注意到为什么把编码格式写成'M','J','P','G'?因为这个是无压缩的,直接windows操作系统的media player就可以播放了,如果是'X', 'V', 'I', 'D'格式,那多啰嗦,还要下载有编码解码的播放器才能播放,很累。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧