Java OpenCV如何从HTTP URL捕获视频

Posted

技术标签:

【中文标题】Java OpenCV如何从HTTP URL捕获视频【英文标题】:Java OpenCV how to capture video from HTTP URL 【发布时间】:2017-12-21 09:24:23 【问题描述】:

我的小机器人可以捕捉视频,但没有足够的性能在本地处理图像文件。我得到了一些简单的视频流代码,可以在我的桌面 Chrome 浏览器中远程查看。机器人上的这个“服务器代码”,如下所示,工作正常。

public class HttpStreamOpenCV 
    public static void main(String[] args) throws Exception 
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat mat = new Mat();
        VideoCapture vid = new VideoCapture(0);
        vid.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, 160);
        vid.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, 120);
        vid.open(0);
        System.out.println("Camera open");

        ServerSocket ss = new ServerSocket(8080);
        Socket sock = ss.accept();
        System.out.println("Socket connected");
        String boundary = "Thats it folks!";
        writeHeader(sock.getOutputStream(), boundary);
        System.out.println("Written header");

        long stime = System.currentTimeMillis();
        int cnt = 0;
        while (Button.ESCAPE.isUp()) 
            vid.read(mat);
            if (!mat.empty()) 
                writeJpg(sock.getOutputStream(), mat, boundary);
                System.out.println("Written jpg");
                if (cnt++ >= 100)
                
                    long stop = System.currentTimeMillis();
                    System.out.println("Frame rate: " + (cnt*1000/(stop - stime)));
                    cnt = 0;
                    stime = stop;
                
             else  System.out.println("No picture");
        
        sock.close();
        ss.close();    
    

    private static void writeHeader(OutputStream stream, String boundary) throws IOException 
        stream.write(("HTTP/1.0 200 OK\r\n" +
            "Connection: close\r\n" +
            "Max-Age: 0\r\n" +
            "Expires: 0\r\n" +
            "Cache-Control: no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0\r\n" +
            "Pragma: no-cache\r\n" + 
            "Content-Type: multipart/x-mixed-replace; " +
            "boundary=" + boundary + "\r\n" +
            "\r\n" +
            "--" + boundary + "\r\n").getBytes());
    

    private static void writeJpg(OutputStream stream, Mat img, String boundary) throws IOException 
        MatOfByte buf = new MatOfByte();
        Highgui.imencode(".jpg", img, buf);
        byte[] imageBytes = buf.toArray();
        stream.write(("Content-type: image/jpeg\r\n" +
            "Content-Length: " + imageBytes.length + "\r\n" +
            "\r\n").getBytes());
        stream.write(imageBytes);
        stream.write(("\r\n--" + boundary + "\r\n").getBytes());
    

我想在我的桌面机器上使用 Java OpenCV 来读取这个流。从 OpenCV 的 sn-ps 我推断我应该能够使用这样的 URL 打开视频捕获..

String url = "http://192.168.1.86:8080/?dummy=param.jpg";
VideoCapture capture =new VideoCapture(url); 

但是这个“客户端代码”什么也没做。我没有抛出错误,它甚至没有尝试打开套接字(使用 Wireshark 检查)。我已经尝试过 openCV 2411 和 331。我四处搜索并没有看到任何证据表明其他人让它工作,所以它应该工作吗?如果不是,我需要将互惠客户端代码写入上面的 writeJpg 方法(ReadJpg)来缓冲图像并将图像传递给 OpenCV 方法,目前这超出了我的范围。

【问题讨论】:

【参考方案1】:

大多数浏览器不允许通过 javascript 进行客户端捕获(由于跨脚本规则。Mozilla 确实有一个从 iframe 获取的过期缩略图,但仅支持 firefox。或者,在服务器端,php 中有 imagecreatefromwebp应该能够读取页面/嵌入,然后在服务器端截屏,然后使用 imagejpeg 函数保存为 jpg。

会是这样的:

         <?php

           $im = imagecreatefromwebp('URL');

        // Convert it to a jpeg file with 100% quality
             $newimage=imagejpeg($im, './example.jpeg', 100);
             imagedestroy($im);
              echo  $newimage;
          ?>

【讨论】:

以上是关于Java OpenCV如何从HTTP URL捕获视频的主要内容,如果未能解决你的问题,请参考以下文章

Protractor-nodejs:如何从 url 中捕获动态文本

如何从opencv中的捕获设备(相机)获取最新帧

如何使用 Python3 opencv 捕获 mpeg-dash 流?

Jetson --- 人脸识别(OpenCV安装)

如何在 OpenCV 中使用网络摄像头捕获 Mat 图像的像素值

一次从 OpenCV 中的两个摄像头捕获视频