使用opencv获取rtsp视频流并将每一帧保存为图片

下载好opencv,加载opencv资源

static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        // 这个 一定不要忘记
        System.load("opencv_videoio_ffmpeg460_64.dll的文件路径");
    }

获取视频流,并在窗口进行预览

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgproc.Imgproc;
import org.opencv.videoio.VideoCapture;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;

public class RTSPStream {
    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        // 这个 一定不要忘记
        System.load("F:\\software\\opencv\\opencv\\build\\bin\\opencv_videoio_ffmpeg460_64.dll");
    }

    public static void main(String[] args) throws IOException {
        VideoCapture capture = new VideoCapture();

        // 设置RTSP流地址
        String rtspUrl = "rtsp://username:password@ip:port/path";
        capture.open(rtspUrl);
        Mat mat = new Mat();
        String winName = "show";
        HighGui.namedWindow(winName);
        HighGui.resizeWindow(winName,800,600);
        while (capture.read(mat)){
            // 重置大小
            Mat dst = new Mat();
            Imgproc.resize(mat, dst, new Size(800,600));
            // 显示
            HighGui.imshow(winName, dst);

            // waitkey 必须要,否则无法显示
            int key = HighGui.waitKey(1);
            System.out.println("key="+key);
            //esc键退出
            if(key == 27){
                break;
            }
        }
        HighGui.destroyAllWindows();
        capture.release();
    }

}

将每一帧数据保存为图片

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgproc.Imgproc;
import org.opencv.videoio.VideoCapture;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;

public class RTSPStream {
    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        // 这个 一定不要忘记
        System.load("F:\\software\\opencv\\opencv\\build\\bin\\opencv_videoio_ffmpeg460_64.dll");
    }

    public static void main(String[] args) throws IOException {
        VideoCapture capture = new VideoCapture();

        // 设置RTSP流地址
        String rtspUrl = "rtsp://admin:kxyzn3180@192.168.1.64:554/Streaming/Channels/101";

        capture.open(rtspUrl);
        Mat mat = new Mat();
        String winName = "show";
        HighGui.namedWindow(winName);
        HighGui.resizeWindow(winName,800,600);
        while (capture.read(mat)){
            // 重置大小
            Mat dst = new Mat();
            Imgproc.resize(mat, dst, new Size(800,600));
            BufferedImage bufferedImage = matToImage(dst);
            File file = new File("F:\\file\\111\\a.jpg");
            ImageIO.write(bufferedImage,"jpg",file);
            // 显示
            HighGui.imshow(winName, dst);

            // waitkey 必须要,否则无法显示
            int key = HighGui.waitKey(1);
            System.out.println("key="+key);
            //esc键退出
            if(key == 27){
                break;
            }
        }
        HighGui.destroyAllWindows();
        capture.release();
    }

    private static BufferedImage matToImage(Mat mat) {
        // 将Mat转换为BufferedImage
        byte[] data = new byte[mat.channels() * mat.cols() * mat.rows()];
        mat.get(0, 0, data);  // 获取Mat的数据
        BufferedImage bufferedImage = null;
        if (mat.channels() == 1) {
            bufferedImage = new BufferedImage(mat.cols(), mat.rows(), BufferedImage.TYPE_BYTE_GRAY);
        } else if (mat.channels() == 3) {
            bufferedImage = new BufferedImage(mat.cols(), mat.rows(), BufferedImage.TYPE_3BYTE_BGR);
        } else if (mat.channels() == 4) {
            bufferedImage = new BufferedImage(mat.cols(), mat.rows(), BufferedImage.TYPE_4BYTE_ABGR);
        }

        final byte[] targetPixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();
        System.arraycopy(data, 0, targetPixels, 0, data.length);

        return bufferedImage;
    }

}

### 回答1: 使用OpenCVJava获取RTSP视频流可以通过使用OpenCV的VideoCapture类实现。首先,您需要创建一个VideoCapture对象,并使用它的open()方法打开RTSP URL:VideoCapture capture = new VideoCapture(); capture.open("rtsp://<username>:<password>@<ip_address>:<port>/<path>"); 然后,您可以使用read()方法从视频流中读取帧:Mat frame = new Mat(); capture.read(frame); ### 回答2: 在Java使用OpenCV获取RTSP视频流的步骤如下: 1. 首先,确保你已经安装了OpenCV库,并且已经在你的Java项目中引入了相关的库文件。 2. 创建一个新的Java类,并在类中导入OpenCV库: ``` import org.opencv.core.*; import org.opencv.videoio.*; ``` 3. 在代码中创建一个VideoCapture对象,并将RTSP视频流的URL传递给它: ``` String rtspUrl = "rtsp://your_rtsp_video_stream_url"; VideoCapture capture = new VideoCapture(rtspUrl); ``` 4. 检查VideoCapture对象是否已经成功打开了RTSP视频流: ``` if (!capture.isOpened()) { System.out.println("无法打开RTSP视频流!"); return; } ``` 5. 进入一个循环,读取视频帧并进行处理: ``` Mat frame = new Mat(); while (true) { if (capture.read(frame)) { // 在这里对视频帧进行处理,比如显示、保存等 // ... } else { System.out.println("无法读取视频帧!"); break; } } ``` 6. 最后,记得在循环结束后释放VideoCapture对象: ``` capture.release(); ``` 这样,你就可以在Java使用OpenCV获取RTSP视频流了。注意,根据你所使用OpenCV版本和操作系统不同,可能需要进行一些额外的配置和处理。 ### 回答3: 在Java使用OpenCV获取RTSP视频流可以通过以下步骤来实现: 首先,需要确保在项目的构建路径中已经添加了OpenCV库文件。 接下来,可以使用Java中的VideoCapture类来创建一个用于从RTSP源中读取视频流的对象。可以通过传递RTSP流的URL作为参数来完成这一步骤,例如: ```java VideoCapture capture = new VideoCapture("rtsp://username:password@ip_address:port/video_stream"); ``` 在上述代码中,"username"和"password"是RTSP流的访问凭证,"ip_address"是RTSP服务器的IP地址,"port"是RTSP服务器的端口号,"video_stream"是要获取视频流名称。 接下来,可以使用while循环来持续读取视频帧,并进行处理,直到没有更多的帧可供读取为止。可以使用Mat类来存储每一帧的像素数据,如下所示: ```java Mat frame = new Mat(); while (capture.read(frame)) { // 进行帧处理的代码 } ``` 在循环中,通过调用capture.read(frame)方法来读取每一帧的像素数据,并将其存储在名为"frame"的Mat对象中。可以在循环中加入自己的帧处理代码,例如进行图像处理、人脸检测等。 最后,在不再需要时,记得释放VideoCapture对象的资源,释放内存: ```java capture.release(); ``` 以上就是使用OpenCVJava获取RTSP视频流的基本步骤。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值