2017-09-05 22 views
2

標準のカメラモジュールv2からのOpenCVでの使用のために、ラズベリーパイ3Bにプラグインされている画像をキャプチャするにはどうすればよいですか?私は高いフレームレートビデオを稼働させようとしていましたが、OpenCVのVideoCaptureを使用すると、0のインデックスを作成しようとすると空のMatが表示され、thisthisは1秒間に1フレームを生成しました。私はraspividプロセスの作成についても見てきましたが、OpenCVのVideoCaptureにそのプロセスの出力を読み込ませる方法はありません。ラズベリーパイカメラからのOpenCVキャプチャ

Javaでどのように高いFPSフレームキャプチャを取得できますか? OpenCVをOutputStreamから読み込み、別のプロセスから取得する方法がありますか?

EDIT:簡略化したコードは以下のとおりです。私は、私はこれをファイルに出力するraspividを設定し、何とかOpenCVのにそれの出力を供給するかもしれない行うための最善の方法のように感じる

abstract class Main { 
    public static Mat currentCapture = null; 
    public static final double FOV_HEIGHT = 48.8; 
    public static final int WIDTH = 480; 
    public static final int HEIGHT = 384; 
    public static final int VIDEO_WIDTH = WIDTH * 2; 
    public static final int VIDEO_HEIGHT = HEIGHT * 2; 

    static { 
     System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME); 
    } 

    public static void main(String[] args) { 
     client = new VisionClientTable("10.55.6.4", 5506); 
     new Thread(new VisionThread(VisionThread.Mode.VIDEO)).start(); 
     new Thread(new VisionThread(VisionThread.Mode.TARGETING)).start(); 
    } 

    private static class VisionThread implements Runnable { 
     private final Mode mode; 

     enum Mode { 
      VIDEO, 
      TARGETING 
     } 

     public VisionThread(Mode mode) { 
      this.mode = mode; 
     } 

     @Override 
     public void run() { 
      if (mode == Mode.TARGETING) 
       startTracking(); 
      else if (mode == Mode.VIDEO) 
       startRecording(); 
     } 
    } 

    public static void startTracking() { 
     /* this thread repeatedly captures currentCapture and processes it */ 
    } 

    // this is where I need help 
    public static void startRecording() { 
     try { 
      VideoWriter video = new VideoWriter("/home/pi/vision/videos/video-" + Files.list(Paths.get("/home/pi/vision/captures")).count() + ".mp4", VideoWriter.fourcc('X', '2', '6', '4'), 30, new Size(VIDEO_WIDTH, VIDEO_HEIGHT), true); 
      VideoCapture capture = new VideoCapture(0); 
      capture.set(Videoio.CAP_PROP_FRAME_WIDTH, VIDEO_WIDTH); 
      capture.set(Videoio.CAP_PROP_FRAME_HEIGHT, VIDEO_HEIGHT); 
      Thread.sleep(2000); 
      while (true) { 
       long start = System.currentTimeMillis(); 
       Mat mat = new Mat(); 
       capture.read(mat); 
       if (!mat.empty()) { // mat is always empty 
        Mat downscaled = new Mat(); 
        Imgproc.resize(mat, downscaled, new Size(WIDTH, HEIGHT), 0, 0, Imgproc.INTER_NEAREST); 
        currentCapture = downscaled; 
       } 
       video.write(mat); 
       long end = System.currentTimeMillis(); 
       if (end - start < 1000/60) 
        Thread.sleep(1000/60 - (end - start)); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void log(String text) { 
     System.out.println(text); 
    } 
} 

このクラスで startRecording()機能を移入する方法を知りたいですしかし、私はこれを行う方法がわかりません。

EDIT 2:これまでのところ、私は作品ファイルに出力raspividコマンドを実行するRuntime.getRuntime().exec()を使用して試してみましたが、私はOpenCVのと、そのファイルを開こうとすると、その後、capture.isOpened()がさえとして、偽のままプログラムは、ファイルを繰り返し開こうとします。

+0

あなたのコードを共有してください。 –

+0

私の質問を編集してコードを追加しました。 – tupperkion

答えて

関連する問題