抓取帧:
Iplimage* img = 0;
if(!cvGrabFrame(capture)){ // 抓取一帧,失败退出
printf("Could not grab a frame ");
exit(0);
}
img=cvRetrIEveFrame(capture); // 恢复获取的帧图像
要从多个摄像头同时获取图像,首先从每个摄像头抓取一帧. 在抓取动作都结束后再恢复帧图像.
释放抓取源(和释放单幅图像时类似):
cvReleaseCapture(&capture);
获取所抓取帧在视频序列中的位置,从首帧开始按[毫秒]算. 或者从首帧开始从0标号,获取所抓取帧的标号. 或者取相对位置,首帧为0,末帧为1,只对视频文件有效。
设定所抓取的第一帧标号:
// 从视频文件相对位置0.9处开始抓取
cvSetCaptureProperty(capture,CV_CAP_PROP_POS_AVI_RATIO,(double)0.9);
只对从视频文件抓取有效. 不过似乎也不成功!!!
二、初始化视频存储器:
CvVIDeoWriter *writer = 0;
int iscolor = 1;
int fps = 25; // or 30
int frameW = 640; // 744 for firewire cameras
int frameH = 480; // 480 for firewire cameras
writer=cvCreateVIDeoWriter("out.avi",CV_FOURCC('P','I','M','1'),
fps,cvSize(frameW,frameH),iscolor);
其他有效编码:
CV_FOURCC('P','1') = MPEG-1 codec
CV_FOURCC('M','J','P','G') = motion-jpeg codec (does not work well)
CV_FOURCC('M','4','2') = MPEG-4.2 codec
CV_FOURCC('D','V','3') = MPEG-4.3 codec
CV_FOURCC('D','X') = MPEG-4 codec
CV_FOURCC('U','2','6','3') = H263 codec
CV_FOURCC('I','3') = H263I codec
CV_FOURCC('F','L','1') = FLV1 codec
若把视频编码设为-1则将打开一个编码选择窗口(windows系统下).
存储视频文件:
三、示例1:从视频中抓取每一帧,显示并保存
#include
#include
#include
using namespace std;
int main(){
CvCapture* capture;
capture = cvCreatefileCapture("bike.avi");
assert(capture!=NulL);
Iplimage *frame;
cvnameDWindow("camera",1);
int n = 1,m = 120;
char* cstr = new char[120];
while (m--)
{
frame = cvqueryFrame(capture);
if (!frame) break;
sprintf(cstr,"%s%d%s","D:OpenCVWorkSpaceIDeo_captureIDeo_capture",n++,".jpg");
cvShowImage("camera",frame);
cvSaveImage(cstr,frame);
if (cvWaitKey(330)>=0) break;
}
cvReleaseCapture(&capture);
cvReleaseImage(&frame);
cvDestroyWindow("camera");
return 0;
}
---------------------
四、示例2:从摄像头中提取图片后并将图片重新连续播放出来。
// 该程序实现视频和图片的相互转换.
// Image_to_vIDeo()函数将一组图片合成AVI视频文件.
// VIDeo_to_image()函数将AVI视频文件读入,将每一帧存储为jpg文件.
//
////////////////////////////////////////////////////////////////////////
#include @H_404_160@
#include
#include
#include
#include
#define NUM_FRAME 300 //只处理前300帧,根据视频帧数可修改
voID VIDeo_to_image(char* filename)
{
printf("------------- vIDeo to image ... ----------------n");
//初始化一个视频文件捕捉器
CvCapture* capture = cvCaptureFromAVI(filename);
//获取视频信息
cvqueryFrame(capture);
int frameH = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT);
int frameW = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH);
int fps = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);
int numFrames = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT);
printf("tvIDeo height : %dntvIDeo wIDth : %dntfps : %dntframe numbers : %dn",frameH,frameW,fps,numFrames);
//定义和初始化变量
int i = 0;
Iplimage* img = 0;
char image_name[13];
cvnameDWindow("mainWin",CV_WINDOW_autoSIZE);
//读取和显示
while (1)
{
img = cvqueryFrame(capture); //获取一帧图片
cvShowImage("mainWin",img); //将其显示
char key = cvWaitKey(20);
sprintf(image_name,"image",++i,".jpg");//保存的图片名
cvSaveImage(image_name,img); //保存一帧图片
if (i == NUM_FRAME) break;
}
cvReleaseCapture(&capture);
cvDestroyWindow("mainWin");
}
voID Image_to_vIDeo()
{
int i = 0;
Iplimage* img = 0;
char image_name[13];
printf("------------- image to vIDeo ... ----------------n");
//初始化视频编写器,参数根据实际视频文件修改
CvVIDeoWriter *writer = 0;
int iscolor = 1;
int fps = 30; // or 25
int frameW = 400; // 744 for firewire cameras
int frameH = 240; // 480 for firewire cameras
writer = cvCreateVIDeoWriter("out.avi",CV_FOURCC('X','D'),iscolor);
printf("tvIDeo height : %dntvIDeo wIDth : %dntfps : %dn",fps);
//创建窗口
cvnameDWindow("mainWin",CV_WINDOW_autoSIZE);
while (i < NUM_FRAME)
{
sprintf(image_name,".jpg");
img = cvLoadImage(image_name);
if (!img)
{
printf("Could not load image file...n");
exit(0);
}
cvShowImage("mainWin",img);
char key = cvWaitKey(20);
cvWriteFrame(writer,img);
}
cvReleaseVIDeoWriter(&writer);
cvDestroyWindow("mainWin");
}
int main(int argc,char *argv[])
{
char filename[13] = "bike.avi";
VIDeo_to_image(filename); //视频转图片
Image_to_vIDeo(); //图片转视频
return 0;
}
私信小编007即可获取数十套pdf以及大量的学习资料哦!祝你早日入门哈!
五、示例3:从摄像头中提取图片,显示并保存。
由于本人不帅,所以这个程序就不贴效果图了,具体的效果自己贴到程序中测试,可以自我欣赏一下。
注意:
//////////////调用摄像头/////////////////
vIDeoCapture cam;
cam.open(0);
/////////////设置摄像头窗口大小///////////////////
cam.set(CV_CAP_PROP_FRAM_WIDTH,600);
cam.set(CV_CAP_PROP_FRAM_HEIGHT,400);
/////////////获取摄像头视频中的每一帧///////////////////
cv::Mat cameraFrame;
camera>>cameraFrame;
//////////////存储从视频中获取的每一帧——存储路径与存储名称/////////////////
char* cstr = new char[120];
sprintf(cstr,".jpg");
///////////////openCV3.1.0中图片存储函数/////////////
imwrite(cstr,cameraFrame);//这个函数很重要,与cvSaveImage()这个函数不同,存储的图片类型是cv::Mat类型的,所以要注意
---------------------
#include
#include
#include
#include
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/ml/ml.hpp"
using namespace std;
using namespace cv;
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/ml/ml.hpp"
using namespace std;
using namespace cv;
int main(int argc,char *argv[])
{
int cameraNumber = 0;
if (argc > 1)
cameraNumber = atoi(argv[1]);
VIDeoCapture camera;
camera.open(cameraNumber);
camera.set(CV_CAP_PROP_FRAME_WIDTH,600);//设置界面大小
camera.set(CV_CAP_PROP_FRAME_HEIGHT,400);
if (!camera.isOpened())
{
cerr << "ERROPR" << endl;
exit(1);
}
int n = 1;
while (true)
{
Mat cameraFrame;
camera >> cameraFrame;
if (cameraFrame.empty())
{
cerr << "ERROR1" << endl;
exit(1);
}
char* cstr = new char[120];
sprintf(cstr,".jpg");
imshow("VIDeo",cameraFrame);
//const CvArr* s = (CvArr*)&cameraFrame;
imwrite(cstr,cameraFrame);//这个函数很重要,与cvSaveImage()这个函数不同,存储的图片类型是cv::Mat类型的,所以要注意
char key = cv::waitKey(50);
if (key == 33)
{
break;
}
}
}
这时就要注意,imread函数最好是放在if判断语句里面:
网上的说法:
我们用opencv打开视频的时候,会自动先监测摄像头有没有读到帧,如果没有,就会报错,然后再执行你的程序,加一个if判断就是跳过系统自己的判断,直接执行我们的程序。加上后确实可以解决错误。
if (!img_src1.empty())
{
imshow("Froeground",img_src1);
}
else
{
return 0;
}
总结以上是内存溢出为你收集整理的听说蓝洞内部检测外挂软件?居然是用Python Open写出来的!全部内容,希望文章能够帮你解决听说蓝洞内部检测外挂软件?居然是用Python Open写出来的!所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)