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 中捕获动态文本
如何使用 Python3 opencv 捕获 mpeg-dash 流?