for (int i = 0; i < fpsNum; i++)
{
frame = cvQueryFrame(capture);
if (!frame)break;
flag = i;
}
问题出在这里
if (!frame)break;
这个break只是中断了for循环
当i为0,即刚进入for循环,视频就达到了最后一帧,则flag还没有在此次for循环赋值就跳出了,而此时flag的值为上一次for循环的最后一次赋值,即 fpsNum-1,导致这一句的break无法执行:if (flag<fpsNum - 1)break
可以这样改:
while (1)
{
bool flag = false;
for (int i = 0; i < fpsNum; i++)
{
frame = cvQueryFrame(capture);
if (!frame)
{
flag = true;
break;
}
}
if(flag)break;
(此处省略)
cvSaveImage(filename, frame);
}
还有个更简单的修改方法可以试一下
在for循环之前即这句话:for (int i = 0; i < fpsNum; i++)
之前对flag进行一次赋值,flag = 0;
现在在vc上采集视频常用的方法有三:vfw,directshow,opencv
你是要进行图像处理的话推荐opencv(具体参考:于仕琪,opencv教程基础篇中的例3-6,稍作修改,估计就能用于你的工程)
下面贴出我自己编的一个小工程:如有疑问,E-mail:zhoutingzhi@gmailcom
进行opencv的预备 *** 作你要看那本书和逛opencv中文网
如有问题可以和我讨论(我也是菜鸟,刚为解决了这个问题窃喜不已)。
1新建mfc对话框工程,在其中添加一个picture控件,除了ID以外什么都不用改
2在对话框头文件(没有Dlg那个)中添加(最好是在“#include "resourceh" // main symbols之后”):
#include "cxcoreh"
#include "cvcamh"
#include "windowsh"
#include "cvh"
#include "highguih"
3在工程-》设置-》选择所有配置-》link(连接)-》对象/库模块-》中添加:
kernel32lib user32lib gdi32lib winspoollib comdlg32lib advapi32lib shell32lib ole32lib oleaut32lib uuidlib odbc32lib odbccp32lib cxcorelib cvlib mllib cvauxlib highguilib cvcamlib
4在需要触发摄像头显示的地方添加:
void CVideomfcDlg::OnButton1()
{
// TODO: Add your control notification handler code here
int ncams = cvcamGetCamerasCount( );//返回可以访问的摄像头数目
HWND MyWin=::GetDlgItem(m_hWnd,IDC_VIDEO); //获得控件句柄(IDC_VIDEO就是控件)
cvcamSetProperty(0, CVCAM_PROP_ENABLE, CVCAMTRUE); //选择第一个摄像头
int width=240;
int height=240;
cvcamSetProperty(0,CVCAM_PROP_WINDOW, &MyWin); // Selects a window for
cvcamSetProperty(0,CVCAM_RNDWIDTH, &width);
cvcamSetProperty(0,CVCAM_RNDHEIGHT, &height);
cvcamSetProperty(0, CVCAM_PROP_CALLBACK, callback1);
//回调函数将处理每一帧
cvcamInit( );
cvcamStart( );
}
5改变显示的图像序列大小,在窗口属性设定了以后,添加如下代码:
int width=320; //这个就是需要显示的窗口大小
int height=240; //根据自己需要选择
cvcamSetProperty(0,CVCAM_RNDWIDTH, &width);
cvcamSetProperty(0,CVCAM_RNDHEIGHT, &height);
6在对话框类中添加callback成员函数(注意,在添加函数的时候,一定要选择static,不选的话你就自己郁闷去吧,反正我是为了这个郁闷了2个礼拜)
void CVideomfcDlg::callback1(IplImage image)
{
IplImage image1 = image;
int i,j;
assert (image);
//获取当前系统时间
SYSTEMTIME st2=;
GetLocalTime(&st2);
char sss[18]=; //这个是用来存储所要保存的名的,用的是一个笨办法,先定义,再修改其中的数组值。
sss[7]=st2wHour/10+48; //获取系统当前小时
sss[8]=st2wHour%10+48;
sss[9]=st2wMinute/10+48; //获取系统当前分钟
sss[10]=st2wMinute%10+48;
sss[11]=st2wSecond/10+48; //获取系统当前秒
sss[12]=st2wSecond%10+48;
cvSaveImage(sss,image1); //使用系统当前时间为名称(XXXXXXjpg)存储
}
ps:你还需要在c盘根目录下建立一个叫1的文件夹保存。
祝你成功!
视频信号(以下简称为视频)是非常重要的视觉信息来源,它是视觉处理过程中经常要处理的一类信号。
实际上,视频是由一系列图像构成的,这一系列图像被称为帧,帧是以固定的时间间隔从视频中获取的。
获取(播放)帧的速度称为帧速率,其单位通常使用“帧/秒”表示,代表在1秒内所出现的帧数,对应的英文是FPS(Frames Per Second)。
如果从视频中提取出独立的帧,就可以使用图像处理的方法对其进行处理,达到处理视频的目的。
OpenCV提供了cv2VideoCapture类和cv2VideoWriter类来支持各种类型的视频文件。在不同的 *** 作系统中,它们支持的文件类型可能有所不同,但是在各种 *** 作系统中均支持AVI格式的视频文件。
OpenCV提供了cv2VideoCapture类来处理视频。cv2VideoCapture类处理视频的方式非常简单、快捷,而且它既能处理视频文件又能处理摄像头信息。
cv2VideoCapture类的常用函数包括
计算机视觉要处理的对象是多种多样的。有时,我们需要处理的可能是某个特定的图像;有时,要处理的可能是磁盘上的视频文件;而在更多时候,要处理的是从摄像设备中实时读入的视频流。
OpenCV通过cv2VideoCapture类提供了非常方便的捕获摄像头视频的方法。
例181使用cv2VideoCapture类捕获摄像头视频。
播放视频文件时,需要将函数cv2VideoCapture()的参数值设置为视频文件的名称。在播放视频时,可以通过设置函数cv2waitKey()中的参数值,来设置播放视频时每一帧的持续(停留)时间。
例182使用cv2VideoCapture类播放视频文件。
VideoCapture和cvCapture其实是一样的,你可以去看看源码,VideoCapture其实在内部调用了cvCapture。这是不同版本的opencv导致的。我接触到的opencv有过一次大升级,函数名有很多变化,其实是向着面向对象的方向发展了,也就是开始重c++而轻c了。
cvLoadImage和imread返回值略有差异,过去的opencv处理图像倾向使用IplImage类型。升级后更倾向于将图像、矩阵等等都统一使用Mat类型上。差别不大。
你看头文件也能发现imread位于highguihpp里面是c++,cvLoadImage位于highgui_ch里,是c。
用Python处理视频 环境要求:安装OpenCV >>点此安装 练习1 从本地读取一段视频,并获取帧数,帧率以及时长 import cv2 cap=cv2VideoCapture('\lightmp4') nbFrames = int(capget
是可以的!
webcam_stream帧率太低的解决方法如下
之前在树莓派上一直使用的30fps的低帧率摄像头,所以一直没有发现opencv不能设置摄像头的帧率和分辨率,一直跑的是320x240,30fps
最近更换了一个在640x480下180fps,在1280x720下90fps的摄像头才发现opencv怎么都不能更改摄像头的分辨率,并且就算是在默认的320x240分辨率下也只有30fps
解决过程
需要直接看解决方案请下拉,这里的内容如果不全看完可能会误导
1用fswebcam拍照,尝试摄像头在树莓派上是否能切换到1280x720
安装:sudo apt-get install fswebcam
使用:fswebcam --no-banner -r 1280x720 -q imgjpg
发现能够保存下来一张1280x720分辨率的,说明摄像头调整分辨率没问题
你好,下面是相应的一个代码,你可以参考一下:
import cv2import os
# 先导入openCV
# 将一个长的视频缩短,按照比例缩短,只保存其中的一部分
# 如下面代码就是将一个长视频每10秒取10秒,合并成一个短视频
cap = cv2VideoCapture('myvideoavi')
if not capisOpened():
print('video is not opened')
else:
# 每秒25帧
num = 0
# 取10秒
needTime = 250
# 每10秒
timeSpace = 250
# 获取视频帧率
fps = capget(cv2CAP_PROP_FPS)
# AVI格式编码输出XVID
videoWriter = cv2VideoWriter('result//resultVideo_2avi',cv2VideoWriter_fourcc('X','V','I','D'),fps,frameSize=(320,288))
while(1):
success,frame = capread()
if (num%timeSpace <= needTime):
videoWriterwrite(frame)
print('write'+ str(num))
num = num + 1
if not success:
print('finished')
break
if cv2waitKey(100) & 0xFF == ord('q'):
break
caprelease()
import cv2
cap = cv2VideoCapture('E:/极乐净土mp4')#导入路径
j=1
i=1
fourcc = cv2VideoWriter_fourcc('XVID')
fps =capget(cv2CAP_PROP_FPS)
size = (int(capget(cv2CAP_PROP_FRAME_WIDTH)), int(capget(cv2CAP_PROP_FRAME_HEIGHT)))
out = cv2VideoWriter('E:/新建文件夹 (3)/' + str(j) + 'avi', fourcc,fps, size)#输出路径都是可以自己改的
while (True):
ret, frame = capread() # 捕获一帧图像
i = i + 1
outwrite(frame) # 保存帧
if (i % 200== 0): # 每n帧切割为一个新的视频
j = j + 1
out = cv2VideoWriter('E:/新建文件夹 (3)/' + str(j) + 'avi', fourcc, fps, size)#路径都是可以自己改的
cv2imshow('frame', frame) # 显示帧
# 判断按键,如果按键为q,退出循环
if cv2waitKey(25) & 0xFF == ord('q'):
break
caprelease()
outrelease()
cv2destroyAllWindows()
以上就是关于基于OpenCV C++写了一个截屏程序,但是当视频总帧数为截屏间隔整数倍时候 死循环全部的内容,包括:基于OpenCV C++写了一个截屏程序,但是当视频总帧数为截屏间隔整数倍时候 死循环、openCV采集摄像头图片并保存的方法、视频处理VideoCapture类等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)