我正在尝试使用OpenCV在Java中创建一个应用程序,以从Web服务中抓取视频流,该服务是一个具有多个摄像头和录像设备的相机系统。
我已经找到了地址“rtsp://login:pass@IP address:Port/cam/realmonitor?channel=1&subtype=0”,用于访问通道1上的摄像机。
为了打开摄像机流,我使用了以下代码(目前它捕获本地USB摄像机):
VideoCapture cap; Mat2Image mat2Img = new Mat2Image();
public VideoGrabber(){
cap = new VideoCapture(0);
try {
System.out.println("Sleeping..");
Thread.sleep(4000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Camera on..");
cap.open("0");
if(!cap.isOpened()){
System.out.println("Camera Error");
}
else{
System.out.println("Camera OK?");
}
}
在捕获视频流后,我将其放入了一个JFrame中。
我认为我应该将视频流服务地址放在cap.open(...)中,但使用rtsp://login:pass@http://192.168.1.14:8006/cam/realmonitor?channel=1&subtype=0会出现“Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException:宽度(0)和高度(0)必须> 0”的错误。
请帮忙解决,
编辑 我已经发现rtsp://login:pass@http://192.168.1.14:554/cam/realmonitor?channel=1&subtype=0在vlc中可以工作,但在opencv中仍然没有成功。
编辑#2 好的,在尝试了vlcl、gstreamer和大多数流行的解决方案之后,它突然开始工作了。我不知道这是否是错误的rtsp地址。代码:
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
//load the library of opencv
}
VideoCapture cap;
Mat2Image mat2Img = new Mat2Image();
Mat matFilter = new Mat();
public VideoGrabber(){
cap = new VideoCapture();
try {
System.out.println("Sleeping..");
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Camera on..");
cap.open("rtsp://login:pass@192.168.1.14:554/cam/realmonitor?channel=1&subtype=0");
if(!cap.isOpened()){
System.out.println("Camera Error");
}
else{
System.out.println("Camera OK?");
}
}