videocapture java opencv camera ip jpanel

videocapture - Cámara IP con OpenCv en Java



opencv java (2)

Estoy tratando de obtener y mostrar una transmisión de video desde una cámara IP. Encontré algunos ejemplos de código aquí: http://answers.opencv.org/question/24012/reading-video-stream-from-ip-camera-in-opencv-java/

Pero no funciona para mí. mi código funciona cuando uso mi cámara web interna, pero cuando cambio la cámara a la IP, no funciona. No tengo ni idea de porqué. ¿Puede alguien ayudarme? Aquí está mi código:

import java.awt.BorderLayout; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.highgui.VideoCapture; import org.opencv.imgproc.Imgproc; public class openCVTest { public openCVTest() { // TODO Auto-generated constructor stub } /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); //VideoCapture camera = new VideoCapture("http://192.168.0.7/image.jpg"); VideoCapture camera = new VideoCapture(0); if (camera.isOpened()) { System.out.println("Video is captured"); } else { System.out.println(""); } videoCamera cam = new videoCamera(camera); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(cam); frame.setSize(800,800); frame.setVisible(true); while(camera.isOpened()) { cam.repaint(); } } } import java.awt.Graphics; import java.awt.Point; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing.JPanel; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfRect; import org.opencv.core.Rect; import org.opencv.core.Scalar; import org.opencv.highgui.VideoCapture; import org.opencv.imgproc.Imgproc; import org.opencv.objdetect.CascadeClassifier; import org.opencv.core.*; @SuppressWarnings("serial") public class videoCamera extends JPanel { VideoCapture camera; public videoCamera(VideoCapture cam) { camera = cam; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } public BufferedImage Mat2BufferedImage(Mat m) { int type = BufferedImage.TYPE_BYTE_GRAY; if (m.channels() > 1) { type = BufferedImage.TYPE_3BYTE_BGR; } int bufferSize = m.channels() * m.cols() * m.rows(); byte[] b = new byte[bufferSize]; m.get(0, 0, b); // get all the pixels BufferedImage img = new BufferedImage(m.cols(), m.rows(), type); final byte[] targetPixels = ((DataBufferByte) img.getRaster().getDataBuffer()).getData(); System.arraycopy(b, 0, targetPixels, 0, b.length); return img; } public void paintComponent(Graphics g) { super.paintComponent(g); Mat mat = new Mat(); if( camera.read(mat)) { System.out.print("IMAGE"); } BufferedImage image = Mat2BufferedImage(mat); //Mat gray = turnGray(mat); //MatOfRect objects = new MatOfRect(); //CascadeClassifier cas = new CascadeClassifier(); //cas.detectMultiScale(gray,objects); //Mat thresh = threash( gray); //BufferedImage image = Mat2BufferedImage(thresh); g.drawImage(image,10,10,image.getWidth(),image.getHeight(), null); } public Mat turnGray( Mat img) { Mat mat1 = new Mat(); Imgproc.cvtColor(img, mat1, Imgproc.COLOR_RGB2GRAY); return mat1; } public Mat threash(Mat img) { Mat threshed = new Mat(); int SENSITIVITY_VALUE = 100; Imgproc.threshold(img, threshed, SENSITIVITY_VALUE,255,Imgproc.THRESH_BINARY); return threshed; } }

Gracias por la ayuda. Pude usar lo que dijiste para encontrar la dirección IP correcta (http://192.168.0.6/VIDEO.CGI) (sí, sé que el 7 se convirtió en un 6, es una cámara diferente) para obtener un video en mi navegador . pero sigo recibiendo el siguiente error.

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Width (0) and height (0) must be > 0 at java.awt.image.SampleModel.<init>(Unknown Source) at java.awt.image.ComponentSampleModel.<init>(Unknown Source) at java.awt.image.PixelInterleavedSampleModel.<init>(Unknown Source) at java.awt.image.Raster.createInterleavedRaster(Unknown Source) at java.awt.image.Raster.createInterleavedRaster(Unknown Source) at java.awt.image.Raster.createInterleavedRaster(Unknown Source) at java.awt.image.ComponentColorModel.createCompatibleWritableRaster(Unknown Source) at java.awt.image.BufferedImage.<init>(Unknown Source) at videoCamera.Mat2BufferedImage(videoCamera.java:54) at videoCamera.paintComponent(videoCamera.java:74) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JLayeredPane.paint(Unknown Source) at javax.swing.JComponent.paintChildren(Unknown Source) at javax.swing.JComponent.paintToOffscreen(Unknown Source) at javax.swing.BufferStrategyPaintManager.paint(Unknown Source) at javax.swing.RepaintManager.paint(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source) at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source) at sun.awt.SunGraphicsCallback.runComponents(Unknown Source) at java.awt.Container.paint(Unknown Source) at java.awt.Window.paint(Unknown Source) at javax.swing.RepaintManager$3.run(Unknown Source) at javax.swing.RepaintManager$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source) at javax.swing.RepaintManager.access$1100(Unknown Source) at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source) at java.awt.event.InvocationEvent.dispatch(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$200(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

Creo que es porque VideoCapture no está agarrando el marco correctamente.

Esta es la cámara que estoy tratando de usar http://www.trendnet.com/products/proddetail.asp?prod=150_TV-IP100W-N


.jpg se refiere a un único archivo de imagen, mientras que .mjpg da acceso a la transmisión de video. Es importante definir la IP y el PUERTO utilizado para conectarse.

Dependiendo del dispositivo que tenga y la configuración definida en la interfaz web de la cámara, la URL será diferente:

VideoCapture camera = new VideoCapture("http://192.168.0.7:8080/?dummy=param.mjpg"); VideoCapture camera = new VideoCapture("http://192.168.0.7:8080/mjpeg.cgi"); VideoCapture camera = new VideoCapture("http://192.168.0.7:8080/mjpg/mjpeg.cgi"); VideoCapture camera = new VideoCapture("http://192.168.0.7:8080/video.mjpeg"); VideoCapture camera = new VideoCapture("http://192.168.0.7:8080/video.cgi?.mjpg");

Cuando accede a una URL válida a través del navegador, debe mostrar la transmisión de video. Una vez que encuentre la dirección que funciona, simplemente páselo al constructor VideoCapture . En este ejemplo, mostré cómo acceder al flujo a través de HTTP, pero el protocolo RTSP también es compatible.


Después de 3 a 4 semanas de trabajo duro, encontré una solución al 100% de trabajo para esto

En primer lugar, debe cargar el archivo dll de ffmpeg Dinámicamente, es decir, utilizando

System.loadLibrary("[NAME OF YOUR DLL FILE]") You can find the required dll file in **opencv/build/x64/vc11/bin** El nombre de DLL en mi caso es "opencv_ffmpeg2413_64.dll" copiar el archivo a la ruta predeterminada del Proyecto y uso

System.loadLibrary("opencv_ffmpeg2413_64");//You May have different File Name Depending on the Version of OpenCV Installed on your Computer

Entonces puedes simplemente usar

VideoCapture ipcamera = new VideoCapture("[RTSP URL OF THE IP Camera]")//I used this Demo Link (rtsp://184.72.239.149/vod/mp4:BigBuckBunny_175k.mov)