如何从视频中提取每一帧图像

实验目的:从一部电影里提取出一秒里面多帧图像的一帧;

实验实代码:

clc

clear
close all
 
% 创建视频读取对象,并设置参数
xyloObj = VideoReader('j.mp4');
 
nFrames = xyloObj.NumberOfFrames;
vidHeight = xyloObj.Height;
vidWidth = xyloObj.Width;
FrameRate = xyloObj.FrameRate; % 24帧播放的
 
% 创建几帧数据的空间
A=nFrames/23;
A=fix(A);
frames = 1:nFrames;
mov(1:length(frames)) = struct('cdata', zeros(vidHeight, vidWidth, 3, 'uint8'), 'colormap', []);
 
% 读数据
for k = 1 : 500
    i=23*k;
    mov(i).cdata = read(xyloObj, frames(i));
    str=strcat('D:\pictures\',int2str(k),'.jpg');
    imwrite(mov(i).cdata(:,:,:),str);
end
 


实验效果:



参考:http://blog.sina.com.cn/s/blog_84024a4a01019lbw.html

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Onvif 是一种网络视频协议,可以实现不同厂家的网络摄像机之间的互联互通。如果你想要在 Android 设备上获取网络摄像机的视频流,并提取一帧图像,可以使用 ONVIF Device Manager 应用程序和 OpenCV 库来实现。 以下是实现步骤: 1. 在 Android 设备上安装 ONVIF Device Manager 应用程序,并使用它来查找和连接到网络摄像机。 2. 使用 OpenCV 库来处理视频流。首先,你需要在 Android Studio 添加 OpenCV 库的依赖项。这可以通过在 build.gradle 文件添加以下行来完成: ``` implementation 'org.opencv:opencv-android:3.4.2' ``` 3. 创建一个新的类来处理视频流。在这个类,你需要使用 OpenCV 的 VideoCapture 类来读取视频流,并使用 Mat 类来处理每一帧图像。以下是一个示例代码: ``` import org.opencv.android.CameraBridgeViewBase; import org.opencv.android.JavaCameraView; import org.opencv.android.LoaderCallbackInterface; import org.opencv.android.OpenCVLoader; import org.opencv.core.Mat; import org.opencv.videoio.VideoCapture; public class VideoStreamProcessor implements CameraBridgeViewBase.CvCameraViewListener2 { private JavaCameraView mCameraView; private VideoCapture mVideoCapture; public VideoStreamProcessor(JavaCameraView cameraView) { mCameraView = cameraView; mCameraView.setCvCameraViewListener(this); } public void start(String url) { mVideoCapture = new VideoCapture(); mVideoCapture.open(url); } public void stop() { mVideoCapture.release(); } @Override public void onCameraViewStarted(int width, int height) { } @Override public void onCameraViewStopped() { } @Override public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { Mat frame = inputFrame.rgba(); mVideoCapture.read(frame); // 在这里对每一帧图像进行处理 return frame; } } ``` 4. 在你的应用程序创建一个 JavaCameraView 实例,并将其传递给 VideoStreamProcessor 类。然后,你可以使用 start() 方法来启动视频流,使用 stop() 方法来停止视频流。以下是一个示例代码: ``` JavaCameraView cameraView = findViewById(R.id.camera_view); VideoStreamProcessor streamProcessor = new VideoStreamProcessor(cameraView); streamProcessor.start("rtsp://192.168.1.10:554/stream"); ``` 在这个示例,我们使用 RTSP 协议来获取视频流。你需要根据你的网络摄像机的类型和配置来选择正确的协议和 URL。 5. 在 onCameraFrame() 回调方法,你可以使用 OpenCV 的图像处理功能来处理每一帧图像。例如,你可以使用 Imgproc.cvtColor() 方法将图像转换为灰度图像,使用 Imgproc.threshold() 方法对图像进行二值化,等等。以下是一个示例代码: ``` @Override public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { Mat frame = inputFrame.rgba(); mVideoCapture.read(frame); Mat grayFrame = new Mat(); Imgproc.cvtColor(frame, grayFrame, Imgproc.COLOR_RGBA2GRAY); Mat thresholdFrame = new Mat(); Imgproc.threshold(grayFrame, thresholdFrame, 128, 255, Imgproc.THRESH_BINARY); return thresholdFrame; } ``` 在这个示例,我们将每一帧图像转换为灰度图像,然后对其进行二值化处理。 6. 最后,你可以将处理后的图像显示在屏幕上。你可以使用 OpenCV 的 Imgproc.putText() 方法将文本添加到图像,使用 JavaCameraView 的 disableView() 方法停止相机预览,等等。以下是一个示例代码: ``` @Override public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { Mat frame = inputFrame.rgba(); mVideoCapture.read(frame); Mat grayFrame = new Mat(); Imgproc.cvtColor(frame, grayFrame, Imgproc.COLOR_RGBA2GRAY); Mat thresholdFrame = new Mat(); Imgproc.threshold(grayFrame, thresholdFrame, 128, 255, Imgproc.THRESH_BINARY); Imgproc.putText(thresholdFrame, "Hello, world!", new Point(50, 50), Imgproc.FONT_HERSHEY_SIMPLEX, 1.0, new Scalar(255, 255, 255)); mCameraView.disableView(); mCameraView.enableView(); return thresholdFrame; } ``` 以上是一个简单的示例,希望能帮助你开始获取网络摄像机的视频流并提取一帧图像

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值