基于OpenCV C++写了一个截屏程序,但是当视频总帧数为截屏间隔整数倍时候 死循环

基于OpenCV C++写了一个截屏程序,但是当视频总帧数为截屏间隔整数倍时候 死循环,第1张

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 cv2

import 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类等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9570436.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存