利用OpenCV进行”视频的读取”与”保存视频文件或者图像”源码

合集下载

c++的opencv使用方法总结

c++的opencv使用方法总结

C++的OpenCV使用方法总结在计算机视觉和图像处理领域,OpenCV是一个非常强大的开源库,它提供了丰富的功能和工具,用于处理图像和视频。

作为C++程序员,了解并熟练使用OpenCV库是非常重要的。

本文将对C++中使用OpenCV的方法进行总结,并探讨一些常见的应用和技巧。

一、安装和配置OpenCV在开始使用OpenCV之前,首先需要安装和配置这个库。

在Windows评台上,可以通过下载预编译的二进制文件进行安装;在Linux评台上,可以通过包管理器进行安装。

安装完毕后,还需进行一些环境配置,确保编译器能够正确信息OpenCV库文件。

二、基本图像处理1. 读取和显示图像在C++中使用OpenCV读取和显示图像非常简单,只需几行代码即可完成。

首先需要使用imread函数读取图像文件,然后使用imshow 函数显示图像。

在进行图像显示后,需要使用waitKey函数等待用户按下某个键,以便关闭显示窗口。

2. 图像的基本操作OpenCV提供了丰富的图像处理函数,包括图像缩放、旋转、平移、通道拆分与合并等。

这些函数可以帮助我们对图像进行各种基本操作,从而满足不同的需求。

三、特征提取与描述1. Harris角点检测Harris角点检测是一种经典的特征点检测方法,它可以用来识别图像中的角点。

在OpenCV中,我们可以使用cornerHarris函数来实现Harris角点检测,然后对检测结果进行筛选和标记。

2. SIFT特征提取SIFT是一种广泛应用的特征提取算法,它具有旋转不变性和尺度不变性。

在OpenCV中,我们可以使用SIFT算法来提取图像的关键点和特征描述子,从而实现图像匹配和目标识别等功能。

四、图像分类与识别1. 使用支持向量机(SVM)进行图像分类OpenCV提供了对机器学习算法的支持,包括SVM分类器。

我们可以使用SVM对图像进行分类,从而实现图像识别和目标检测等功能。

2. 使用深度学习模型进行图像识别近年来,深度学习在图像识别领域取得了显著的成就。

Opencv实现读取摄像头和视频数据

Opencv实现读取摄像头和视频数据

Opencv实现读取摄像头和视频数据实际上,按⼀定速度读取摄像头视频图像后,便可以对图像进⾏各种处理了。

那么获取主要⽤到的是VideoCapture类,⼀个demo如下://如果有外接摄像头,则ID为0,内置为1,否则⽤0就可以表⽰内置摄像头cv::VideoCapture cap(0);//判断摄像头是否打开if(!cap.isOpened()){return -1;}cv::Mat myframe;cv::Mat edges;bool stop = false;while(!stop){//获取当前帧cap>>myframe;//转化为灰度图cv::cvtColor(myframe, edges, CV_BGR2GRAY);//⾼斯滤波器cv::GaussianBlur(edges, edges, cv::Size(7,7), 1.5, 1.5);//Canny算⼦检测边缘cv::Canny(edges, edges, 0, 30, 3);//显⽰边缘cv::imshow("current frame",edges);if(cv::waitKey(30) >=0)stop = true;}cv::waitKey(0);同样的,如果要读取⼀段视频⽂件,视频⽂件可以看做是⼀连串的视频帧组成,⽽显⽰时设置⼀定延时,便可以按⼀定速度显⽰,⼀个demo如下:// Open the video filecv::VideoCapture capture("../images/bike.avi");// check if video successfully openedif (!capture.isOpened())return 1;// Get the frame ratedouble rate= capture.get(CV_CAP_PROP_FPS);bool stop(false);cv::Mat frame; // current video framecv::namedWindow("Extracted Frame");// Delay between each frame// corresponds to video frame rateint delay= 1000/rate;//⽤于设置帧的移动位置。

opencv实现读取视频保存视频

opencv实现读取视频保存视频

opencv实现读取视频保存视频首先,我们需要安装OpenCV库。

可以使用pip来安装OpenCV库,命令如下:```pip install opencv-python```完成安装后,我们可以使用Python编写代码来读取并保存视频。

首先,导入所需的库:```pythonimport cv2```然后,我们需要使用`cv2.VideoCapture(`函数来创建一个视频读取对象。

可以通过传递视频文件的路径作为参数来读取视频文件,如下所示:```pythoncap = cv2.VideoCapture('video.mp4')```创建了视频读取对象后,我们可以使用`read(`方法来逐帧读取视频帧。

`read(`方法返回两个值,第一个是一个布尔值,表示当前帧是否被正确读取,第二个值是一个包含当前帧的NumPy数组对象。

我们可以使用一个循环来遍历所有的帧,并对每一帧进行处理。

以下是一个示例代码:```pythonwhile cap.isOpened(:ret, frame = cap.readif not ret:break#在这里进行对当前帧的处理cv2.imshow('Video', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.releasecv2.destroyAllWindows```在上述示例中,我们使用`cv2.imshow(`方法来显示当前帧,`cv2.waitKey(`方法用于等待键盘输入,如果按下“q”键,循环将会终止。

要保存视频,我们需要创建一个视频写入对象。

我们可以使用`cv2.VideoWriter(`函数来创建一个视频写入对象,并传递参数来设置输出视频的文件名、编解码器、帧率和分辨率等。

以下是一个示例代码:```pythonwidth = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))fps = cap.get(cv2.CAP_PROP_FPS)out = cv2.VideoWriter('output.mp4',cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, height)) ```创建了视频写入对象后,我们可以在循环中使用`write(`方法来将帧写入到输出视频文件中。

OpenCV2从摄像头获取帧并写入视频文件的方法

OpenCV2从摄像头获取帧并写入视频文件的方法

OpenCV2从摄像头获取帧并写⼊视频⽂件的⽅法⼀段基于OpenCV2的代码。

作⽤是从摄像头获取帧并将帧写⼊指定的视频⽂件中。

需要注意的是,视频⽂件所在的路径需要存在,例如D:/images/1.avi。

images这个⽬录需要存在。

调⽤VideoWrite类对象的成员函数open时,编解码⽅式参数设置为-1,代码运⾏时会弹出对话框,⼿动选择编解码⽅式。

#include<opencv2\highgui\highgui.hpp>#include<opencv2\imgproc\imgproc.hpp>#include<opencv2\core\core.hpp>int main(){//打开摄像头cv::VideoCapture captrue(0);//视频写⼊对象cv::VideoWriter write;//写⼊视频⽂件名std::string outFlie = "D:/1.avi";//获得帧的宽⾼int w = static_cast<int>(captrue.get(CV_CAP_PROP_FRAME_WIDTH));int h = static_cast<int>(captrue.get(CV_CAP_PROP_FRAME_HEIGHT));cv::Size S(w, h);//获得帧率double r = captrue.get(CV_CAP_PROP_FPS);//打开视频⽂件,准备写⼊write.open(outFlie, -1, r, S, true);//打开失败if (!captrue.isOpened()){return 1;}bool stop = false;cv::Mat frame;//循环while (!stop){//读取帧if (!captrue.read(frame))break;cv::imshow("Video", frame);//写⼊⽂件write.write(frame);if (cv::waitKey(10) > 0){stop = true;}}//释放对象captrue.release();write.release();}以上这篇OpenCV2从摄像头获取帧并写⼊视频⽂件的⽅法就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

opencv 演示例子 带python 代码

opencv 演示例子 带python 代码

opencv 演示例子带python 代码OpenCV演示例子是计算机视觉领域的经典案例之一,它可以帮助我们理解和应用图像处理和计算机视觉技术。

Python是一种流行的编程语言,通过结合OpenCV和Python的使用,我们可以更加轻松地实现各种图像处理任务。

在本文中,我们将详细介绍一些常见的OpenCV演示例子,并提供相应的Python代码。

1. 图像读取和显示首先,让我们来学习如何使用OpenCV读取和显示图像。

在Python中,我们可以使用以下代码实现:pythonimport cv2# 读取图像image = cv2.imread('example.jpg')# 显示图像cv2.imshow('Image', image)cv2.waitKey(0)cv2.destroyAllWindows()在代码中,我们首先通过`imread`函数读取了一个名为example.jpg的图像,并将其保存在变量image中。

然后,我们使用`imshow`函数显示该图像。

`waitKey(0)`用于等待用户按下键盘上的任意按键,`destroyAllWindows`用于关闭所有打开的窗口。

2. 图像灰度化图像灰度化是一种常见的图像处理操作,它将彩色图像转换为灰度图像。

在Python中,我们可以使用以下代码实现:pythonimport cv2# 读取彩色图像image = cv2.imread('example.jpg')# 将彩色图像转换为灰度图像gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 显示灰度图像cv2.imshow('Gray Image', gray_image)cv2.waitKey(0)cv2.destroyAllWindows()在代码中,我们首先读取了一幅彩色图像,并将其保存在变量image中。

PythonOpenCV视觉智能感知001_读取摄像头或视频文件并播放显示

PythonOpenCV视觉智能感知001_读取摄像头或视频文件并播放显示

Python OpenCV视觉智能感知第一讲——读取摄像头或视频文件并播放显示本部分内容将深入、全面、详细地介绍如何使用Anaconda Python和OpenCV读取摄像头或视频文件,并进行播放。

1任务描述使用Anaconda Python和OpenCV,读取摄像头或本地视频文件并播放显示。

2解题思路要从摄像头或视频文件读取视频,首先应获取摄像头或视频文件,并判断是否获取成功。

获取摄像头或视频文件成功后,逐帧读取视频,播放显示。

为了能够连续读取和播放视频的每帧图像,需要将读取和播放视频帧放在一个循环体里。

由于不知道摄像头的视频帧数,可以构造一个无限循环体。

对视频文件,可以构造一个无限循环体或以视频帧数为上限的有限循环体。

在循环体内部应设置循环结束控制条件,以便能够控制结束读取和播放视频。

视频读取和播放结束后,应释放摄像头或视频文件,并销毁视频播放窗口。

3主要方法介绍(1)导入OpenCV库cv2要使用OpenCV,首先导入OpenCV库cv2.导入方法为:import cv2导入OpenCV库cv2的前提是确保计算机已经安装了OpenCV.Anaconda Python安装OpenCV的方法为在Anaconda Prompt窗口执行以下命令:pip install opencv-python(2)cv2.VideoCapture()方法cv2.VideoCapture()方法用于创建一个VideoCapture对象,以捕获摄像头或视频文件。

该方法接收摄像头的索引或视频文件名。

如果只有一个摄像头,则以整数0进行索引。

如果有多个摄像头,则分别以0,1,2…等整数进行索引。

如果要读取视频文件,则需传入视频文件的全名称(包括路径和扩展名)字符串,形如’D:/opencv/videos/myvideo.mp4’.(3)while方法Python中使用while语句构造循环体,循环执行程序。

即在条件满足情况下,循环执行某段程序,以重复处理相同任务。

Java使用OpenCV3.2实现视频读取与播放

Java使用OpenCV3.2实现视频读取与播放

Java使⽤OpenCV3.2实现视频读取与播放Java使⽤OpenCV3.2实现视频读取与播放,供⼤家参考,具体内容如下OpenCV从3.x版本开始其JAVA语⾔的SDK⽀持视频⽂件读写,这样就极⼤的⽅便了⼴⼤Java语⾔开发者学习与使⽤OpenCV,通过摄像头或者视频⽂件读取帧的内容与播放,完成视频内容分析与对象跟踪等各种应⽤开发任务。

可以说OpenCV C++ SDK可以做到绝⼤多数事情,在OpenCV3.x版本上⽤Java都可以完成,这样就为很多Java开发者学习OpenCV 打开了⽅便之门。

实现思路⾸先⽤OpenCV相关API读取视频流或者视频⽂件的每⼀帧,然后通过Swing JComponent组件实现视频每⼀帧的更新显⽰,我模仿了C++的HIGHGUI⾥⾯创建窗⼝与显⽰图像接⼝,基于Swing实现了⼀个视频播放窗⼝类,把读取到的每⼀帧都传给它就可以实现连续显⽰即播放。

每帧之间相隔100毫秒,我是通过Java线程Sleep⽅法实现。

运⾏效果 - USB摄像头读取每帧运⾏效果 - 视频⽂件读取每帧代码实现视频⽂件读取package com.gloomyfish.video.demo;import java.awt.Dimension;import java.awt.image.BufferedImage;import org.opencv.core.Core;import org.opencv.core.Mat;import org.opencv.videoio.VideoCapture;public class VideoDemo {public static void main(String[] args) {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);// 打开摄像头或者视频⽂件VideoCapture capture = new VideoCapture();//capture.open(0);capture.open("D:/vcprojects/images/768x576.avi");if(!capture.isOpened()) {System.out.println("could not load video data...");return;}int frame_width = (int)capture.get(3);int frame_height = (int)capture.get(4);ImageGUI gui = new ImageGUI();gui.createWin("OpenCV + Java视频读与播放演⽰", new Dimension(frame_width, frame_height));Mat frame = new Mat();while(true) {boolean have = capture.read(frame);Core.flip(frame, frame, 1);// Win上摄像头if(!have) break;if(!frame.empty()) {gui.imshow(conver2Image(frame));gui.repaint();}try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}public static BufferedImage conver2Image(Mat mat) {int width = mat.cols();int height = mat.rows();int dims = mat.channels();int[] pixels = new int[width*height];byte[] rgbdata = new byte[width*height*dims];mat.get(0, 0, rgbdata);BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);int index = 0;int r=0, g=0, b=0;for(int row=0; row<height; row++) {for(int col=0; col<width; col++) {if(dims == 3) {index = row*width*dims + col*dims;b = rgbdata[index]&0xff;g = rgbdata[index+1]&0xff;r = rgbdata[index+2]&0xff;pixels[row*width+col] = ((255&0xff)<<24) | ((r&0xff)<<16) | ((g&0xff)<<8) | b&0xff;}if(dims == 1) {index = row*width + col;b = rgbdata[index]&0xff;pixels[row*width+col] = ((255&0xff)<<24) | ((b&0xff)<<16) | ((b&0xff)<<8) | b&0xff;}}}setRGB( image, 0, 0, width, height, pixels);return image;}/*** A convenience method for setting ARGB pixels in an image. This tries to avoid the performance * penalty of BufferedImage.setRGB unmanaging the image.*/public static void setRGB( BufferedImage image, int x, int y, int width, int height, int[] pixels ) {int type = image.getType();if ( type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )image.getRaster().setDataElements( x, y, width, height, pixels );elseimage.setRGB( x, y, width, height, pixels, 0, width );}}视频与图像显⽰窗⼝类package com.gloomyfish.video.demo;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import javax.swing.JComponent;import javax.swing.JDialog;public class ImageGUI extends JComponent {/****/private static final long serialVersionUID = 1L;private BufferedImage image;public ImageGUI() {}@Overrideprotected void paintComponent(Graphics g) {Graphics2D g2d = (Graphics2D)g;if(image == null) {g2d.setPaint(Color.BLACK);g2d.fillRect(0, 0, this.getWidth(), this.getHeight());} else {g2d.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null);System.out.println("show frame...");}}public void createWin(String title) {JDialog ui = new JDialog();ui.setTitle(title);ui.getContentPane().setLayout(new BorderLayout());ui.getContentPane().add(this, BorderLayout.CENTER);ui.setSize(new Dimension(330, 240));ui.setVisible(true);}public void createWin(String title, Dimension size) {JDialog ui = new JDialog();ui.setTitle(title);ui.getContentPane().setLayout(new BorderLayout());ui.getContentPane().add(this, BorderLayout.CENTER);ui.setSize(size);ui.setVisible(true);}public void imshow(BufferedImage image) {this.image = image;this.repaint();}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

[转]使用opencv提取视频每一帧及将连续图片合成视频

[转]使用opencv提取视频每一帧及将连续图片合成视频

[转]使用opencv提取视频每一帧及将连续图片合成视频/////////////////////////////////////////////////////////////////// ///////// test3.cpp//// 该程序实现视频和图片的相互转换.// Image_to_video()函数将一组图片合成AVI视频文件.// Video_to_image()函数将AVI视频文件读入,将每一帧存储为jpg文件.///////////////////////////////////////////////////////////////////// /////#include <stdlib.h>#include <stdio.h>#include <math.h>#include <cv.h>#include <highgui.h>#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 : %d\n\tvideo width : %d\n\tfps : %d\n\tframe numbers : %d\n", 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, "%s%d%s", "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 25int frameW = 400; // 744 for firewire camerasint frameH = 240; // 480 for firewire cameraswriter=cvCreateVideoWriter("out.avi",CV_FOURCC('X','V','I',' D'),fps,cvSize(frameW,frameH),isColor);printf("\tvideo height : %d\n\tvideo width : %d\n\tfps : %d\n", frameH, frameW, fps);//创建窗口cvNamedWindow( "mainWin", CV_WINDOW_AUTOSIZE );while(i<NUM_FRAME){sprintf(image_name, "%s%d%s", "image", ++i, ".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] = "infile.avi";Video_to_image(filename); //视频转图片Image_to_video(); //图片转视频return 0;}//--------------------------------------------------------------------------------。

C++openCV图像的读取、显示、保存、信息

C++openCV图像的读取、显示、保存、信息

C++openCV图像的读取、显⽰、保存、信息OpenCV⽀持bmp、jpg、png、tiff等常⽤图像格式的解析#include <opencv2/opencv.hpp> //头⽂件int main(){cv::Mat img = cv::imread("./tu/马.jpg", cv::IMREAD_UNCHANGED); //读⼊⼀张图⽚/*参数2:图像⽂件解析的⽅式,⽀持的⽅式有如下:cv::IMREAD_UNCHANGED 不对图像⽂件进⾏任何转换,直接读取【读⼊完整图⽚,包括alpha通道(png有,jpg⽆)】IMREAD_GRAYSCALE 将任何图像均转换为灰度图像(单通道)进⾏读取IMREAD_COLOR 将任何图像均转为RGB彩⾊图像(三通道)进⾏读取【默认参数,读⼊⼀副彩⾊图⽚,忽略alpha通道】IMREAD_ANYDEPTH 如果不设置这个参数,16/32位图像将会⾃动转为8位图像IMREAD_ANYCOLOR 将按照图像⽂件设定的颜⾊格式进⾏图像读取IMREAD_LOAD_GDAL 调⽤gdal库进⾏图像⽂件读取。

(可以简单地理解为读取TIFF图像⽂件)*/imshow("new", img); //在窗⼝中显⽰载⼊的图⽚//参数1:窗⼝标题,如果找不到参数1的窗⼝就新建⼀个//imread读⼊的图像//imshow函数只⽀持8位灰度图像、8位彩⾊图像和32位灰度图像(像素值范围0-1)cv::waitKey(6000);img = cv::imread("./tu/猫.jpg", cv::IMREAD_UNCHANGED);imshow("new", img);cv::waitKey(6000); // 等待6000 ms}#include <opencv2/opencv.hpp>int main(){cv::Mat img = cv::imread("./tu/马.jpg", cv::IMREAD_UNCHANGED);int w = img.cols; //返回图⽚的宽度int h = img.rows; //返回图⽚的⾼度unsigned char* p = img.data; //数据缓存区指针unsigned int x = (unsigned int)p;x = img.channels(); //返回通道数x = img.elemSize();//返回的是⼀个像素占⽤的字节数x = img.elemSize() / img.channels() * 8; //深度std::cout << x << std::endl;cv::waitKey(6000);}cv::Mat img = cv::imread("./tu/马.jpg", cv::IMREAD_UNCHANGED);std::vector<int> compression_params;compression_params.push_back(cv::IMWRITE_JPEG_QUALITY);compression_params.push_back(50);cv::imwrite("my.jpg", img, compression_params); //保存图⽚//参数1:⽂件名//参数2:Mat类型的矩阵/*参数3:[可选]表⽰为特定格式保存的参数编码,std::vector<int>类型看:https:///mars_xiaolei/article/details/62233900?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCom */。

OpenCV2学习笔记之视频流读取与处理

OpenCV2学习笔记之视频流读取与处理

前言由于项目需要,计划实现九路视频拼接,因此必须熟悉OpenCV对视频序列的处理。

视频信号处理是图像处理的一个延伸,所谓的视频序列是由按一定顺序进行排放的图像组成,即帧(Frame)。

在这里,主要记录下如何使用Qt+OpenCV读取视频中的每一帧,之后,在这基础上将一些图像处理的算法运用到每一帧上(如使用Canny算子检测视频中的边缘)。

一. 读取视频序列OpenCV提供了一个简便易用的框架以提取视频文件和USB摄像头中的图像帧,如果只是单单想读取某个视频,你只需要创建一个cv::VideoCapture实例,然后在循环中提取每一帧。

新建一个Qt控制台项目,直接在main函数添加:#include <QCoreApplication>#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui/highgui.hpp>#include <QDebug>int main(int argc, char *argv[]){QCoreApplication a(argc, argv);// 读取视频流cv::VideoCapture capture("e:/BrokeGirls.mkv");// 检测视频是否读取成功if (!capture.isOpened()){qDebug() << "No Input Image";return 1;}// 获取图像帧率double rate= capture.get(CV_CAP_PROP_FPS);bool stop(false);cv::Mat frame; // 当前视频帧cv::namedWindow("Extracted Frame");// 每一帧之间的延迟int delay= 1000/rate;// 遍历每一帧while (!stop){// 尝试读取下一帧if (!capture.read(frame))break;cv::imshow("Extracted Frame",frame);// 引入延迟if (cv::waitKey(delay)>=0)stop= true;}return a.exec();}(注意:要正确打开视频文件,计算机中必须安装有对应的解码器,否则cv::VideoCapture无法理解视频格式!)运行后,将出现一个窗口,播放选定的视频(需要在创建cv::VideoCapture对象时指定视频的文件名)。

pythonopencv读取本地视频文件修改ffmpeg的方法

pythonopencv读取本地视频文件修改ffmpeg的方法

pythonopencv读取本地视频⽂件修改ffmpeg的⽅法Python + opencv 读取视频的三种情况:情况⼀:通过摄像头采集视频情况⼆:通过本地视频⽂件获取视频情况三:通过摄像头录制视频,再读取录制的视频摄像头采集、本地视频⽂件的读取、写视频⽂件,⽹上都有代码。

我发现情况⼀和情况三都没有问题,⼤家注意读取⾃⼰通过摄像头录制的视频⽂件是没有问题的。

但读取其他视频都会发现帧率为0(如果你获取视频的帧率并打印出来的话),并且退出读取。

这时候读取是不成功的。

进去正题:如何解决读取视频失败的情况。

这个问题很普遍,以⾄在官⽅教程的程序下⾯都提⽰说请确认ffmpeg或者gstreamer已经正确安装。

解决办法:解决⽅法有两种,⾸先找到opencv安装路径下的 /sources/3rdparty/ffmpeg ⽂件夹,如D:\ProgramFiles\opencv\sources\3rdparty\ffmpeg。

如果你安装的opencv版本是2.4.9的话,将⽂件夹中的opencv_ffmpeg.dll⽂件名修改为opencv_ffmpeg249.dll;如果你安装的是opencv2.4.10,那就修改成opencv_ffmpeg2410.dll;其他版本依次类推。

如果你是64位的系统,那就修改opencv_ffmpeg_64.dll⽂件名为opencv_ffmpeg249_64.dll。

⽅法1:将opencv_ffmpeg249.dll复制到python的安装⽬录下,我的路劲是D:\Python27。

⽅法2:在windows的环境变量中添加上D:\Program Files\opencv\sources\3rdparty\ffmpeg以上这篇python opencv 读取本地视频⽂件修改ffmpeg的⽅法就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

详解使用JavaCVOpenCV抓取并存储摄像头图像

详解使用JavaCVOpenCV抓取并存储摄像头图像

详解使⽤JavaCVOpenCV抓取并存储摄像头图像本程序通过JFrame实时显⽰本机摄像头图像,并将图像存储到⼀个缓冲区,当⽤户⽤⿏标点击JFrame中任何区域时,显⽰抓取图像的简单动画,同时保存缓冲区的图像到磁盘⽂件中。

点击JFrame关闭按钮可以退出程序。

实现:import java.awt.Graphics2D;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.Timer;import com.googlecode.javacv.CanvasFrame;import com.googlecode.javacv.OpenCVFrameGrabber;import com.googlecode.javacv.cpp.opencv_core.IplImage;import static com.googlecode.javacv.cpp.opencv_core.cvReleaseImage;/**** Use JavaCV/OpenCV to capture camera images** There are two functions in this demo:* 1) show real-time camera images* 2) capture camera images by mouse-clicking anywhere in the JFrame,* the jpg file is saved in a hard-coded path.** @author ljs* 2011-08-19**/public class CameraCapture {public static String savedImageFile = "c:\\tmp\\my.jpg";//timer for image capture animationstatic class TimerAction implements ActionListener {private Graphics2D g;private CanvasFrame canvasFrame;private int width,height;private int delta=10;private int count = 0;private Timer timer;public void setTimer(Timer timer){this.timer = timer;}public TimerAction(CanvasFrame canvasFrame){this.g = (Graphics2D)canvasFrame.getCanvas().getGraphics();this.canvasFrame = canvasFrame;this.width = canvasFrame.getCanvas().getWidth();this.height = canvasFrame.getCanvas().getHeight();}public void actionPerformed(ActionEvent e) {int offset = delta*count;if(width-offset>=offset && height-offset >= offset) {g.drawRect(offset, offset, width-2*offset, height-2*offset);canvasFrame.repaint();count++;}else{//when animation is done, reset count and stop timer.timer.stop();count = 0;}}}public static void main(String[] args) throws Exception {//open camera sourceOpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);grabber.start();//create a frame for real-time image displayCanvasFrame canvasFrame = new CanvasFrame("Camera");IplImage image = grabber.grab();int width = image.width();int height = image.height();canvasFrame.setCanvasSize(width, height);//onscreen buffer for image capturefinal BufferedImage bImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D bGraphics = bImage.createGraphics();//animation timerTimerAction timerAction = new TimerAction(canvasFrame);final Timer timer=new Timer(10, timerAction);timerAction.setTimer(timer);//click the frame to capture an imagecanvasFrame.getCanvas().addMouseListener(new MouseAdapter(){public void mouseClicked(MouseEvent e){timer.start(); //start animationtry {ImageIO.write(bImage, "jpg", new File(savedImageFile));} catch (IOException e1) {e1.printStackTrace();}}});//real-time image displaywhile(canvasFrame.isVisible() && (image=grabber.grab()) != null){if(!timer.isRunning()) { //when animation is on, pause real-time displaycanvasFrame.showImage(image);//draw the onscreen image simutaneouslybGraphics.drawImage(image.getBufferedImage(),null,0,0);}}//release resourcescvReleaseImage(image);grabber.stop();canvasFrame.dispose();}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

利用OpenCV进行”视频的读取”与”保存视频文件或者图像”源码

利用OpenCV进行”视频的读取”与”保存视频文件或者图像”源码

利用OpenCV进行”视频的读取”与”保存视频文件或者图像”源码#include <afx.h>#include <iostream>#include <cv.h>#include <cxcore.h>#include <highgui.h>using namespace std;///////////////////////////////////////////////////////////作者:Flobert_Young//日期:2008-05-22//说明:// 需要配置OpenCV的开发环境,并且一定要确保当前Project里加入了cv.lib cxcore.lib highgui.lib库//链接错误解决方法:// 编译时出现unresolved external symbol __endthreadex 的处理方法// 菜单 Project->Settings…在 C/C++ 页,// 在 Category 下拉框里选择 Code Generation,// 然后在 Use run-time library 里选择// Debug Multithreaded ( Debug 版本时用 )// 或者 Multithreaded ( release 版本时用)./////////////////////////////////////////////////////////enum CaptureCase{CAP_FROM_CAM = 0,CAP_FROM_VIDEO = 1,};enum PlayVideoCase{FRAME_BY_FRAME = 0,FRAME_BY_INDEX = 1,};////////////////////////////////////////函数声明int FrameByFrame(CvVideoWriter * pVideoWriter,IplImage *pFrame,bool bSave,CvCapture * pCapture,char *pVideoSaveName,int nWaitKeyTime);int FrameByIndex(CvCapture * pCapture,IplImage *pFrame,int cap_prop,int cap_prop_value,CString strSaveImagePath);////////////////////////////////////////主函数部分int main(){int ret = 0;bool bErr = 0;bool bSave = 0; //0 –不保存视频文件;1 –保存视频文件CaptureCase cap_case = CAP_FROM_VIDEO; //设置成从视频文件中获取图像PlayVideoCase play_case = FRAME_BY_FRAME; //设置成一帧一帧的播放视频文件int nWaitKeyTime = 40; //显示图像所间隔的时间,以“毫秒”为单位////////////////////////////////////////变量声明CvCapture * pCapture = NULL; //用于在视频中捕获图像char szVideoFileName[] = “C:\\电影.AVI”; //!将打开的视频文件名设置成”C:\\1.mpg”char szVideoSaveName[] = “C:\\VideoSave.avi”; //!将保存视频文件的名字设置成”C:\\VideoSave.avi”CString strSaveImagePath = “C:\\”; //!保存图片的目录名CvVideoWriter * pVideoWriter = NULL; //用于保存视频文件IplImage * pFrame = NULL;IplImage * pImage = NULL;switch(cap_case){case CAP_FROM_CAM://函数cvCaptureFromCAM()参数说明://要使用的摄像头索引。

基于OpenCV的机器视觉图像处理技术实现

基于OpenCV的机器视觉图像处理技术实现

基于OpenCV的机器视觉图像处理技术实现机器视觉是计算机科学领域中涉及图像处理、模式识别以及计算机视觉的一个探究领域。

近年来,随着计算机技术的快速进步,机器视觉在工业、医疗、军事等领域得到了广泛应用。

在机器视觉中,图像处理是一个基础而重要的环节,它能够对图像进行预处理、分析和处理,从而为后续的模式识别和计算机视觉任务提供有效的基础。

在图像处理领域,OpenCV是一个分外流行和强大的开源库。

它提供了丰富的图像处理功能,包括图像的读取、显示、保存,以及各种滤波器、边缘检测、图像增强等算法。

本文将介绍基于OpenCV的机器视觉图像处理技术的实现方法和应用案例。

一、图像预处理图像预处理是图像处理中的第一步,它主要用于提取图像中的有用信息、消除图像中的噪声、调整图像的亮度和对比度等。

在OpenCV中,可以使用不同的方法进行图像的预处理,如灰度化、二值化、直方图均衡化等。

1. 灰度化灰度化是将彩色图像转换为灰度图像的过程。

在机器视觉中,由于灰度图像只有一个通道,处理起来更加高效。

在OpenCV中,可以使用cvtColor函数将彩色图像转换为灰度图像。

2. 二值化二值化是将灰度图像转化为二值图像的过程。

将图像中的每个像素值与一个阈值进行比较,大于阈值的像素设置为255,小于阈值的像素设置为0。

在OpenCV中,可以使用threshold 函数实现图像的二值化。

3. 直方图均衡化直方图均衡化是一种调整图像亮度和对比度的方法。

它通过重新分布图像的像素值来增强图像的细节。

在OpenCV中,可以使用equalizeHist函数实现直方图均衡化。

二、特征提取特征提取是机器视觉中的一个重要环节,它通过从图像中提取有用的特征信息,为后续的模式识别和计算机视觉任务提供基础。

在OpenCV中,可以使用各种特征提取算法,如HOG、SIFT和SURF等。

1. HOG特征提取HOG(Histogram of Oriented Gradients)是一种用于目标检测和行人识别的特征提取算法。

opencv编程案例详解 源码

opencv编程案例详解 源码

opencv编程案例详解源码一、图像读取与显示```pythonimport cv2# 读取图像image = cv2.imread('image.jpg')# 显示图像cv2.imshow('image', image)cv2.waitKey(0)cv2.destroyAllWindows()```这段代码演示了使用OpenCV读取图像文件并显示的基本步骤。

首先,使用cv2.imread函数读取图像文件,该函数返回一个表示图像的多维数组。

然后,使用cv2.imshow函数显示图像,第一个参数为窗口名称,第二个参数为要显示的图像。

最后,使用cv2.waitKey函数等待用户按下任意键后关闭图像窗口,并使用cv2.destroyAllWindows函数销毁所有创建的窗口。

二、图像灰度化处理```pythonimport cv2# 读取图像image = cv2.imread('image.jpg')# 灰度化处理gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 显示灰度图像cv2.imshow('gray image', gray_image)cv2.waitKey(0)cv2.destroyAllWindows()```这段代码演示了使用OpenCV将彩色图像转换为灰度图像的过程。

首先,使用cv2.cvtColor函数将彩色图像转换为灰度图像,第一个参数为输入图像,第二个参数为颜色转换代码。

然后,使用cv2.imshow函数显示灰度图像。

三、图像缩放与裁剪```pythonimport cv2# 读取图像image = cv2.imread('image.jpg')# 缩放图像scaled_image = cv2.resize(image, (800, 600))# 裁剪图像cropped_image = image[100:400, 200:500]# 显示缩放后的图像cv2.imshow('scaled image', scaled_image)# 显示裁剪后的图像cv2.imshow('cropped image', cropped_image)cv2.waitKey(0)cv2.destroyAllWindows()```这段代码演示了使用OpenCV对图像进行缩放和裁剪的过程。

PythonOpenCV读取显示视频的方法示例

PythonOpenCV读取显示视频的方法示例

PythonOpenCV读取显⽰视频的⽅法⽰例⽬标学习读取视频,显⽰视频和保存视频。

学习从相机捕捉并显⽰它。

你将学习以下功能:cv.VideoCapture(),cv.VideoWriter()从相机中读取视频通常情况下,我们必须⽤摄像机捕捉实时画⾯。

提供了⼀个⾮常简单的界⾯。

让我们从摄像头捕捉⼀段视频(我使⽤的是我笔记本电脑内置的⽹络摄像头) ,将其转换成灰度视频并显⽰出来。

只是⼀个简单的任务开始。

要捕获视频,你需要创建⼀个 VideoCapture 对象。

它的参数可以是设备索引或视频⽂件的名称。

设备索引就是指定哪个摄像头的数字。

正常情况下,⼀个摄像头会被连接(就像我的情况⼀样)。

所以我简单地传0(或-1)。

你可以通过传递1来选择第⼆个相机,以此类推。

在此之后,你可以逐帧捕获。

但是在最后,不要忘记释放俘虏。

import numpy as npimport cv2 as cvcap = cv.VideoCapture(0)if not cap.isOpened():print("Cannot open camera")exit()while True:# 逐帧捕获ret, frame = cap.read()# 如果正确读取帧,ret为Trueif not ret:print("Can't receive frame (stream end?). Exiting ...")break# 我们在框架上的操作到这⾥gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 显⽰结果帧ecv.imshow('frame', gray)if cv.waitKey(1) == ord('q'):break# 完成所有操作后,释放捕获器cap.release()cv.destroyAllWindows()cap.read()返回布尔值(True/ False)。

PythonOpenCV调用摄像头并截图保存功能的实现代码

PythonOpenCV调用摄像头并截图保存功能的实现代码

PythonOpenCV调⽤摄像头并截图保存功能的实现代码0x01 OpenCV安装通过命令pip install opencv-python 安装pip install opencv-python0x02 ⽰例import cv2cap = cv2.VideoCapture(0) #打开摄像头while(1):# get a frameret, frame = cap.read()# show a framecv2.imshow("capture", frame) #⽣成摄像头窗⼝if cv2.waitKey(1) & 0xFF == ord('q'): #如果按下q 就截图保存并退出cv2.imwrite("D:/test.png", frame) #保存路径breakcap.release()cv2.destroyAllWindows()ps:下⾯看下python 调⽤麦克风;摄像头;截屏;# -*- coding: utf-8 -*-"""Created on Mon Jun 24 14:47:35 2019@author: erio"""from PIL import Image,ImageGrabimport cv2import pyaudioimport wave'''#录⾳input_filename = "record.wav" # 麦克风采集的语⾳输⼊input_filepath = "E:" # 输⼊⽂件的pathin_pathrec = input_filepath + input_filename #通俗解释就是wav⽂件路径def get_audio(filepath):CHUNK = 256 #定义数据流块FORMAT = pyaudio.paInt16 #量化位数(⾳量级划分)CHANNELS = 1 # 声道数;声道数:可以是单声道或者是双声道RATE = 8000 # 采样率;采样率:⼀秒内对声⾳信号的采集次数,常⽤的有8kHz, 16kHz, 32kHz, 48kHz, 11.025kHz, 22.05kHz, 44.1kHzRECORD_SECONDS = 10 #录⾳秒数WAVE_OUTPUT_FILENAME = filepath #wav⽂件路径p = pyaudio.PyAudio() #实例化stream = p.open(format=FORMAT,channels=CHANNELS,rate=RATE,input=True,frames_per_buffer=CHUNK)# print("*"*10, "开始录⾳:请在5秒内输⼊语⾳")frames = [] #定义⼀个列表for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): #循环,采样率11025 / 256 * 5data = stream.read(CHUNK) #读取chunk个字节保存到data中frames.append(data) #向列表frames中添加数据data# print(frames)# print("*" * 10, "录⾳结束\n")stream.stop_stream()stream.close() #关闭p.terminate() #终结wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb') #打开wav⽂件创建⼀个⾳频对象wf,开始写WAV⽂件wf.setnchannels(CHANNELS) #配置声道数wf.setsampwidth(p.get_sample_size(FORMAT)) #配置量化位数wf.setframerate(RATE) #配置采样率wf.writeframes(b''.join(frames)) #转换为⼆进制数据写⼊⽂件wf.close() #关闭get_audio(in_pathrec)'''#截屏input_filenamescr = "screen.jpg"input_filepath = "E:"in_pathscr = input_filepath + input_filenamescrdef get_screen(filepath):img = ImageGrab.grab()img.save(filepath)get_screen(in_pathscr)'''#拍照input_filenamecam = "camera.jpg"input_filepath = "E:"in_pathcam = input_filepath + input_filenamecamdef get_camera(filepath):cap=cv2.VideoCapture(0)ret,frame = cap.read()i=0;cv2.imwrite(filepath,frame)cap.release()cv2.destroyAllWindows()get_camera(in_pathcam)''''''#录制视频cap = cv2.VideoCapture(0)#创建⼀个 VideoCapture 对象flag = 1 #设置⼀个标志,⽤来输出视频信息num = 1 #递增,⽤来保存⽂件名while(cap.isOpened()):#循环读取每⼀帧ret_flag, Vshow = cap.read() #返回两个参数,第⼀个是bool是否正常打开,第⼆个是照⽚数组,如果只设置⼀个则变成⼀个tumple包含bool和图⽚cv2.imshow("Capture_Test",Vshow) #窗⼝显⽰,显⽰名为 Capture_Testk = cv2.waitKey(1) & 0xFF #每帧数据延时 1ms,延时不能为 0,否则读取的结果会是静态帧if k == ord('s'): #若检测到按键 ‘s',打印字符串cv2.imwrite("D:/pycharmthings/IMF/getpics/"+ str(num) + ".jpg", Vshow)print(cap.get(3)); #得到长宽print(cap.get(4));print("success to save"+str(num)+".jpg")print("-------------------------")num += 1elif k == ord('q'): #若检测到按键 ‘q',退出breakcap.release() #释放摄像头cv2.destroyAllWindows()#删除建⽴的全部窗⼝'''总结以上所述是⼩编给⼤家介绍的Python OpenCV 调⽤摄像头并截图保存功能的实现代码,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。

opencv基本知识及其操作

opencv基本知识及其操作

opencv基本知识及其操作OpenCV是一个开源的计算机视觉和机器学习软件库,它包含了丰富的计算机视觉和机器学习算法。

以下是OpenCV的一些基本知识和操作:1. 图像读取、显示和保存:OpenCV提供了读取、显示和保存图像的函数。

例如,使用()函数可以读取图像,()函数可以显示图像,()函数可以保存图像。

2. 摄像头和视频读取:OpenCV提供了读取摄像头和视频文件的函数。

例如,使用()函数可以打开摄像头或视频文件,并读取其中的帧。

3. 图像处理:OpenCV提供了许多图像处理函数,包括裁剪、旋转、缩放、模糊等。

例如,使用()函数可以调整图像大小,使用()函数可以应用模糊效果。

4. 颜色空间转换:OpenCV支持多种颜色空间,包括BGR、HSV、灰度等。

可以使用()函数进行颜色空间转换。

5. 特征检测和匹配:OpenCV提供了特征检测和匹配的算法,例如SIFT、SURF、ORB等。

这些算法可以在图像中检测关键点和特征,并进行匹配。

6. 图像变换:OpenCV提供了多种图像变换算法,包括透视变换、仿射变换等。

可以使用()和()函数进行透视变换,使用()函数进行仿射变换。

7. 图像滤波:OpenCV提供了多种图像滤波算法,包括高斯滤波、中值滤波、边缘检测等。

可以使用()函数进行高斯滤波,()函数进行中值滤波,()函数进行边缘检测。

8. 深度学习:OpenCV支持使用深度学习算法进行目标检测和识别。

可以使用预训练的模型进行人脸识别、物体检测等任务。

以上是OpenCV的一些基本知识和操作,通过学习和实践这些内容,可以更好地掌握OpenCV并进行计算机视觉任务的开发。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利用OpenCV进行”视频的读取”与”保存视频文件或者图像”源码#include <afx.h>#include <iostream>#include <cv.h>#include <cxcore.h>#include <highgui.h>using namespace std;///////////////////////////////////////////////////////////作者:Flobert_Young//日期:2008-05-22//说明:// 需要配置OpenCV的开发环境,并且一定要确保当前Project里加入了cv.lib cxcore.lib highgui.lib库//链接错误解决方法:// 编译时出现unresolved external symbol __endthreadex 的处理方法// 菜单 Project->Settings…在 C/C++ 页,// 在 Category 下拉框里选择 Code Generation,// 然后在 Use run-time library 里选择// Debug Multithreaded ( Debug 版本时用 )// 或者 Multithreaded ( release 版本时用)./////////////////////////////////////////////////////////enum CaptureCase{CAP_FROM_CAM = 0,CAP_FROM_VIDEO = 1,};enum PlayVideoCase{FRAME_BY_FRAME = 0,FRAME_BY_INDEX = 1,};////////////////////////////////////////函数声明int FrameByFrame(CvVideoWriter * pVideoWriter,IplImage *pFrame,bool bSave,CvCapture * pCapture,char *pVideoSaveName,int nWaitKeyTime);int FrameByIndex(CvCapture * pCapture,IplImage *pFrame,int cap_prop,int cap_prop_value,CString strSaveImagePath);////////////////////////////////////////主函数部分int main(){int ret = 0;bool bErr = 0;bool bSave = 0; //0 –不保存视频文件;1 –保存视频文件CaptureCase cap_case = CAP_FROM_VIDEO; //设置成从视频文件中获取图像PlayVideoCase play_case = FRAME_BY_FRAME; //设置成一帧一帧的播放视频文件int nWaitKeyTime = 40; //显示图像所间隔的时间,以“毫秒”为单位////////////////////////////////////////变量声明CvCapture * pCapture = NULL; //用于在视频中捕获图像char szVideoFileName[] = “C:\\电影.AVI”; //!将打开的视频文件名设置成”C:\\1.mpg”char szVideoSaveName[] = “C:\\VideoSave.avi”; //!将保存视频文件的名字设置成”C:\\VideoSave.avi”CString strSaveImagePath = “C:\\”; //!保存图片的目录名CvVideoWriter * pVideoWriter = NULL; //用于保存视频文件IplImage * pFrame = NULL;IplImage * pImage = NULL;switch(cap_case){case CAP_FROM_CAM://函数cvCaptureFromCAM()参数说明://要使用的摄像头索引。

如果只有一个摄像头或者用哪个摄像头也无所谓,那使用参数-1应该便可以。

pCapture = cvCaptureFromCAM(-1); //和函数cvCreateCameraCapture()有什么区别???if(NULL==pCapture) //打开摄像头{cout<<”ERROR: 摄像头读取失败!”<<endl;bErr = 1;}break;case CAP_FROM_VIDEO: //打开视频文件pCapture = cvCaptureFromFile(szVideoFileName); //和函数cvCreateFileCapture()有什么区别???if(NULL==pCapture){cout<<”ERROR: 视频文件读取失败!”<<endl;bErr = 1;}break;}if(!bErr){switch(play_case){case FRAME_BY_FRAME:FrameByFrame(pVideoWriter,pFrame,bSave,pCapture,szVideoFileName,nWaitKeyTime); break;case FRAME_BY_INDEX://在窗口上显示视频的61%部分的那一帧图像int cap_prop_value = 61;FrameByIndex(pCapture,pFrame,CV_CAP_PROP_POS_AVI_RATIO,cap_prop_value,strSaveIma gePath);break;}}char ch;cin>>ch;return ret;}int FrameByFrame(CvVideoWriter * pVideoWriter,IplImage *pFrame,bool bSave,CvCapture * pCapture,char *pVideoSaveName,int nWaitKeyTime){int ret = 0;/****************************************//////////////////////////////1.逐帧读取视频int nCurFrameIndex = 0;cvNamedWindow(“Frame_By_Frame”,1);//在图像窗口左上角显示“Current Frame: **”字符串CString strFrameString;CvFont font;cvInitFont( &font,CV_FONT_HERSHEY_SIMPLEX,0.5,0.5,0,2,8 );//创建视频文件写入器//第二个参数fourcc –四个字符用来表示压缩帧的codec//例如,CV_FOURCC(‘P’,'I’,'M’,’1′)是MPEG-1 codec,//CV_FOURCC(‘M’,'J’,'P’,'G’)是motion-jpeg codec等。

//在Win32下,如果传入参数-1,可以从一个对话框中选择压缩方法和压缩参数。

//这里是按20帧/s进行写入视频文件的,但是当右键”C:\\VideoSave.avi”属性 -> 摘要,//发现“持续时间: 0:00:02 帧速率: 500帧/秒”???//如果改成30帧/s,则发现属性改为“持续时间: 0:00:01 帧速率: 750帧/秒”???if(1==bSave){pVideoWriter = cvCreateVideoWriter(pVideoSaveName,-1,20,cvSize(640,480),1); }if((NULL!=pVideoWriter&&bSave)||(!bSave)){while(pFrame = cvQueryFrame(pCapture)){if(1==bSave){//将获取的视频文件一帧一帧的写入要保存的视频文件中cvWriteFrame(pVideoWriter,pFrame);}nCurFrameIndex++;strFrameString.Format(“Current Frame: %d”,nCurFrameIndex);cvPutText( pFrame,strFrameString,cvPoint( 5,pFrame->height-15 ),&font,cvScalar( 0,255,0 ) );cvShowImage(“Frame_By_Frame”,pFrame);if(0==bSave) //如果是保存视频时,则加快显示速度{cvWaitKey(nWaitKeyTime);}else{cvWaitKey(10); //如果选择保存视频时,好像不能够正常显示图像???}}if(1==bSave){//释放视频写入器cvReleaseVideoWriter(&pVideoWriter);}cvDestroyWindow(“Frame_By_Frame”);cvReleaseCapture(&pCapture);}else{cout<<”ERROR:创建CvVideoWriter * 失败!”<<endl;}/****************************************/ret = 1;return ret;}int FrameByIndex(CvCapture * pCapture,IplImage *pFrame,int cap_prop,int cap_prop_value,CString strSaveImagePath){int ret = 0;/****************************************//////////////////////////////2.读取第i帧视频cvNamedWindow(“FrameIndex_i”,1);//目前这个函数对视频文件只支持://CV_CAP_PROP_POS_MSEC, CV_CAP_PROP_POS_FRAMES, CV_CAP_PROP_POS_AVI_RATIOswitch(cap_prop){case CV_CAP_PROP_POS_MSEC://读取视频中第cap_prop_value秒的图像cvSetCaptureProperty(pCapture,CV_CAP_PROP_POS_MSEC,cap_prop_value);break;case CV_CAP_PROP_POS_FRAMES://读取视频中第cap_prop_value帧的图像cvSetCaptureProperty(pCapture,CV_CAP_PROP_POS_FRAMES,cap_prop_value);break;case CV_CAP_PROP_POS_AVI_RATIO://读取视频中cap_prop_value%处的图像double ratio = cap_prop_value/100.0; //100.0是为了将除法的结果转化成“浮点型” cvSetCaptureProperty(pCapture,CV_CAP_PROP_POS_AVI_RATIO,ratio);break;}if(pFrame = cvQueryFrame(pCapture)){//保存当前图像CString strSaveImageName;CString strTmp;strTmp.Format(“SaveImage_%d.bmp”,cap_prop_value);strSaveImageName = strSaveImagePath + strTmp;cvSaveImage(strSaveImageName,pFrame);cvShowImage(“FrameIndex_i”,pFrame);cvWaitKey(-1);}cvDestroyWindow(“FrameIndex_i”);cvReleaseCapture(&pCapture);/****************************************/ret = 1;return ret;}。

相关文档
最新文档