user17795
user17795

Reputation: 31

Java CV 1.0 Webcam video capture :Frame cannot be converted to IplImage

I am not able to record webcam video (i.e. Capture and Save .avi or .mp4 File) using JavaCV / OpenCV / FFMPEG, what am I doing wrong?

Version used (all 64-bit)

Win 7 , NetBeans8.0.2 , jdk1.7.0_10 , JavaCV 1.0 , OpenCV 3.0.0 , ffmpeg-2.1.1-win64-shared .

My system variables are set to

C:\Program Files\Java\jdk1.7.0_10;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x64;C:\Program Files (x86)\MySQL\MySQL Fabric 1.5.4 & MySQL Utilities 1.5.4 1.5\;C:\Program Files (x86)\MySQL\MySQL Fabric 1.5.4 & MySQL Utilities 1.5.4 1.5\Doctrine extensions for PHP\;C:\opencv\build\x64\vc11\bin;C:\ffmpeg\bin

After downloading and setting path variables I added jar files to Netbeans project

C:\opencv\build\java\opencv-300.jar C:\javacv-1.0-bin\javacv-bin\videoinput.jar C:\javacv-1.0-bin\javacv-bin\videoinput-windows-x86_64.jar C:\javacv-1.0-bin\javacv-bin\videoinput-windows-x86.jar C:\javacv-1.0-bin\javacv-bin\opencv.jar C:\javacv-1.0-bin\javacv-bin\opencv-windows-x86_64.jar C:\javacv-1.0-bin\javacv-bin\opencv-windows-x86.jar C:\javacv-1.0-bin\javacv-bin\libfreenect.jar C:\javacv-1.0-bin\javacv-bin\libfreenect-windows-x86_64.jar C:\javacv-1.0-bin\javacv-bin\libfreenect-windows-x86.jar C:\javacv-1.0-bin\javacv-bin\libdc1394.jar C:\javacv-1.0-bin\javacv-bin\junit.jar C:\javacv-1.0-bin\javacv-bin\javacv.jar C:\javacv-1.0-bin\javacv-bin\javacpp.jar C:\javacv-1.0-bin\javacv-bin\hamcrest-core.jar C:\javacv-1.0-bin\javacv-bin\flycapture.jar C:\javacv-1.0-bin\javacv-bin\flycapture-windows-x86_64.jar C:\javacv-1.0-bin\javacv-bin\flycapture-windows-x86.jar C:\javacv-1.0-bin\javacv-bin\flandmark.jar C:\javacv-1.0-bin\javacv-bin\flandmark-windows-x86_64.jar C:\javacv-1.0-bin\javacv-bin\flandmark-windows-x86.jar C:\javacv-1.0-bin\javacv-bin\ffmpeg.jar C:\javacv-1.0-bin\javacv-bin\ffmpeg-windows-x86_64.jar C:\javacv-1.0-bin\javacv-bin\ffmpeg-windows-x86.jar C:\javacv-1.0-bin\javacv-bin\artoolkitplus.jar C:\javacv-1.0-bin\javacv-bin\artoolkitplus-windows-x86_64.jar C:\javacv-1.0-bin\javacv-bin\artoolkitplus-windows-x86.jar

Problem 1:
First program to capture webcam video (display and save to output.avi file) is as given below.

It displays webcam and creates output.avi. But after terminating program when I open file output.avi in Media Player it doesn't display anything :)

It doesn't work

import java.io.File;
import java.net.URL;
import org.bytedeco.javacv.*;
import org.bytedeco.javacpp.*;
import org.bytedeco.javacpp.indexer.*;
import static org.bytedeco.javacpp.opencv_core.*;
import static org.bytedeco.javacpp.opencv_imgproc.*;
import static org.bytedeco.javacpp.opencv_calib3d.*;
import static org.bytedeco.javacpp.opencv_objdetect.*;

public class JCVdemo3 {
    public static void main(String[] args) throws Exception {

        // Preload the opencv_objdetect module to work around a known bug.
        Loader.load(opencv_objdetect.class);

        // The available FrameGrabber classes include OpenCVFrameGrabber (opencv_videoio),
        // DC1394FrameGrabber, FlyCaptureFrameGrabber, OpenKinectFrameGrabber,
        // PS3EyeFrameGrabber, VideoInputFrameGrabber, and FFmpegFrameGrabber.
        FrameGrabber grabber = FrameGrabber.createDefault(0);
        grabber.start();

        // CanvasFrame, FrameGrabber, and FrameRecorder use Frame objects to communicate image data.
        // We need a FrameConverter to interface with other APIs (Android, Java 2D, or OpenCV).
        OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();


        IplImage grabbedImage = converter.convert(grabber.grab());
        int width  = grabbedImage.width();
        int height = grabbedImage.height();


        FrameRecorder recorder = FrameRecorder.createDefault("output.avi", width, height);
        recorder.start();


        CanvasFrame frame = new CanvasFrame("Some Title");

        while (frame.isVisible() && (grabbedImage = converter.convert(grabber.grab())) != null) {
           // cvWarpPerspective(grabbedImage, rotatedImage, randomR);

            Frame rotatedFrame = converter.convert(grabbedImage);

            //opencv_core.IplImage grabbedImage = grabber.grab();
            frame.showImage(rotatedFrame);
            recorder.record(rotatedFrame);
        }
        frame.dispose();
        recorder.stop();
        grabber.stop();
    }
}

Problem 2: When I run following code

opencv_core.IplImage grabbedImage = grabber.grab();  

incompatible types: Frame cannot be converted to IplImage message appears

import java.io.File;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bytedeco.javacv.*;
import org.bytedeco.javacpp.*;
import org.bytedeco.javacpp.indexer.*;
import static org.bytedeco.javacpp.opencv_core.*;
import static org.bytedeco.javacpp.opencv_imgproc.*;
import static org.bytedeco.javacpp.opencv_calib3d.*;
import static org.bytedeco.javacpp.opencv_objdetect.*;

public class Demo {
    public static void main(String[] args) {  
     try {  
       OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);  
       grabber.start();  
       opencv_core.IplImage grabbedImage = grabber.grab();  
       CanvasFrame canvasFrame = new CanvasFrame("Video with JavaCV");  
       canvasFrame.setCanvasSize(grabbedImage.width(), grabbedImage.height());  
       grabber.setFrameRate(grabber.getFrameRate());  

       FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("mytestvideo.mp4", grabber.getImageWidth(), grabber.getImageHeight());
       recorder.setFormat("mp4");  
       recorder.setFrameRate(30);  
       recorder.setVideoBitrate(10 * 1024 * 1024);  


       recorder.start();  
       while (canvasFrame.isVisible() && (grabbedImage = grabber.grab()) != null) {  
         canvasFrame.showImage(grabbedImage);  
         recorder.record(grabbedImage);  
       }  
       recorder.stop();  
       grabber.stop();  
       canvasFrame.dispose();  

     } catch (FrameGrabber.Exception ex) {  
       Logger.getLogger(JCVdemo.class.getName()).log(Level.SEVERE, null, ex);  
     } catch (FrameRecorder.Exception ex) {  
       Logger.getLogger(JCVdemo.class.getName()).log(Level.SEVERE, null, ex);  
     }  
   }
}  

Question is: what am i doing wrong?

I am not able to record any sort of video; no matter what version of JavaCV/OPenCv I use.

Please tell me working example to record video from webcam and also the working JavaCV/OpenCV /FFmpeg compatible versions.

Upvotes: 1

Views: 2336

Answers (1)

Jonathan Kongolo
Jonathan Kongolo

Reputation: 21

use: OpenCVFrameConverter

OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
img = converter.convert(grabber.grab());

From: https://github.com/bytedeco/javacv#sample-usage

Upvotes: 2

Related Questions