2017-02-26 18 views
2

私はちょうどjavaでopenCVを学び始めました。私はすべてのOpenCV java依存関係を持つEclipse IDEをセットアップしました。Java - OpenCVでフレームを読む

今私は、私が.aviファイル形式で記録したビデオファイルから1つのフレームを抽出する手間があります。

私はこのlinkから検索し、以下のようにそこに与えられたコードを用い、

package vasanth; 

import org.opencv.core.Core; 
import org.opencv.core.Mat; 
import org.opencv.highgui.Highgui; 
import org.opencv.highgui.VideoCapture; 

public class Vasanth { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
    VideoCapture camera = new VideoCapture("G:\\PICTURES\\roxtar vassy\\early days in APSCE.wmv"); 



/* if(!camera.isOpened()){ 
     System.out.println("Error"); 
    } */ 


     Mat frame = new Mat(); 

     while(true){ 
      System.out.println("Looping.. \n"); 
      if (camera.read(frame)){ 
       System.out.println("Frame Obtained"); 
       System.out.println("Captured Frame Width " + 
       frame.width() + " Height " + frame.height()); 
       Highgui.imwrite("camera.jpg", frame); 

       System.out.println("OK"); 
       break; 
      } 
     } 
    } 

} 

私はこれを実行すると、プログラムはinifinitelyこの行で

camera.read(frame) 

でループしている私は、また、実行しようとしましたこのコードはループせず、私のシステム上のcamera.jpgファイルを正常に取得できましたが、ファイルが破損していました。 このフレームは、すべてのピクセルで完全に抽出されていないため、破損しているようです。

なぜここに問題があるのですか?camera.read(frame)これは常にfalseを返し、ループは壊れません。

私は10分以上待っています。 私がしたいのは、1つのフレームを抽出することだけです。この方法では起こっていません。

私がGoogleで検索したことによると、私には、入力としてビデオファイルを取得し、フレームを与えるffmpegというツールがあります。 しかし、私は自分のJavaコードをEclipseで起動してこの機能を実現したいと考えています。

答えて

0

あなたの問題を再現する際に直面したいくつかの問題があります。

  1. まず、古いバージョンのフレームワークを使用します。現在のバージョンは3.2ですので、アップグレードを検討してください。私は最新バージョンを使用しました。

  2. camera.isOpened()チェックをコメントアウトしないでください。カメラが開かれていない場合は、続行する意味がありません。私は、あなたのアプリは、そのチェックを渡すことはできませんでしたので、あなたはそれをスキップすることを決めた:)しかし、適切にカメラを開くにはthisまたはthisを行う必要があります。最初のリンクは

(唯一の変化は、3.2バージョンのパスが\opencv\build\x64\vc14\binであると私はコンピュータを再起動しなければならなかったということです)私のためのコードを働いたあなたがのための唯一の違いは、これまで持っているとほとんど同じです最新バージョン:順序でコードのこの作品は、私はシンプルなSwingのJFrameのを使用し機能することを実証することを

import org.opencv.core.Core; 
import org.opencv.core.Mat; 
import org.opencv.imgcodecs.Imgcodecs; 
import org.opencv.videoio.VideoCapture; 

import javax.swing.*; 
import java.awt.image.BufferedImage; 
import java.awt.image.DataBufferByte; 
import java.awt.image.WritableRaster; 
import java.nio.file.Paths; 

public class Vasanth { 

    public static void main(String[] args) { 
     System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
     String filePath = "G:\\PICTURES\\roxtar vassy\\early days in APSCE.wmv"; 
     if (!Paths.get(filePath).toFile().exists()){ 
      System.out.println("File " + filePath + " does not exist!"); 
      return; 
     } 

     VideoCapture camera = new VideoCapture(filePath); 

     if (!camera.isOpened()) { 
      System.out.println("Error! Camera can't be opened!"); 
      return; 
     } 
     Mat frame = new Mat(); 

     while(true){ 
      if (camera.read(frame)){ 
       System.out.println("Frame Obtained"); 
       System.out.println("Captured Frame Width " + 
         frame.width() + " Height " + frame.height()); 
       Imgcodecs.imwrite("camera.jpg", frame); 
       System.out.println("OK"); 
       break; 
      } 
     } 

     BufferedImage bufferedImage = matToBufferedImage(frame); 
     showWindow(bufferedImage); 
     camera.release(); 
    } 

    private static BufferedImage matToBufferedImage(Mat frame) { 
     int type = 0; 
     if (frame.channels() == 1) { 
      type = BufferedImage.TYPE_BYTE_GRAY; 
     } else if (frame.channels() == 3) { 
      type = BufferedImage.TYPE_3BYTE_BGR; 
     } 
     BufferedImage image = new BufferedImage(frame.width(), frame.height(), type); 
     WritableRaster raster = image.getRaster(); 
     DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer(); 
     byte[] data = dataBuffer.getData(); 
     frame.get(0, 0, data); 

     return image; 
    } 

    private static void showWindow(BufferedImage img) { 
     JFrame frame = new JFrame(); 
     frame.getContentPane().add(new JLabel(new ImageIcon(img))); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setSize(img.getWidth(), img.getHeight() + 30); 
     frame.setTitle("Image captured"); 
     frame.setVisible(true); 
    } 
} 

注:

enter image description here

+0

THAあなたはこのEnigoであなたの時間を過ごしていますので、この作業を行うための唯一の変更は、バージョンアップグレードとネイティブOpen cv libsへのパスです。 また、このフレームをキャプチャするのに、どれくらいの時間がかかりましたか? –

+0

@VasanthNagKV正確に!正直言って、もしあなたがすべてを正しく追加すればあなたが使っているバージョンでもうまくいくはずです[this(http://stackoverflow.com/q/11699298/5151575))。私は本当に短いビデオ(長さ5秒)でテストし、画像は即座にキャプチャされました。 – Enigo

+0

1つのフレームをキャプチャするのにかかる時間はビデオの長さによって異なりますか? –