2017-08-26 8 views
0

カメラからの表示画像に問題があります。誰もが私を伝えることができJavaCVビデオキャプチャの画像をカラー表示

public void CaptureVideo() 
{ 
    VideoCapture videoCapture = new VideoCapture(0); 
    Mat frame = new Mat(); 

    while (videoCapture.isOpened() && _canWorking) 
    { 
     videoCapture.read(frame); 

     if (!frame.empty()) 
     { 
      Image img = MatToImage(frame); 
      videoView.setImage(img); 
     } 

     try { Thread.sleep(33); } catch (InterruptedException e) { e.printStackTrace(); } 
    } 
    videoCapture.release(); 
} 

private Image MatToImage(Mat original) 
{ 
    BufferedImage image = null; 
    int width = original.size().width(), height = original.size().height(), channels = original.channels(); 
    byte[] sourcePixels = MatToBytes(original, width, height, channels); 

    if (original.channels() > 1) 
    { 
     image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); 
    } 
    else 
    { 
     image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); 
    } 
    final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); 
    System.arraycopy(sourcePixels, 0, targetPixels, 0, sourcePixels.length); 

    return SwingFXUtils.toFXImage(image, null); 
} 

private byte[] MatToBytes(Mat mat, int width, int height, int channels) 
{ 
    byte[] output = new byte[width * height * channels]; 
    UByteRawIndexer indexer = mat.createIndexer(); 

    int i = 0; 
    for (int j = 0; j < mat.rows(); j ++) 
    { 
     for (int k = 0; k < mat.cols(); k++) 
     { 
      output[i] = (byte)indexer.get(j,k); 
      i++; 
     } 
    } 
    return output; 
} 

:私のソースコードの一部を link :私はカラーで表示画像をしようとしたとき、私はそのような何かを得ることを私はVideoCaptureを使用して、私はグレースケールで表示画像をしようとすると、それは完璧に動作していますが、私は何を間違っているの?私は画像処理が新しく、なぜ機能しないのか分からない。

+0

、代わりに[ツアー]を参照して明確な答えであなたのソリューションを追加します解決策は[こちら]である(https://stackoverflow.com/revisions/45897496/2)してください –

答えて

0

私はこれを解決する。 ソリューション:

byte[] output = new byte[_frame.size().width() * _frame.size().height() * _frame.channels()]; 
    UByteRawIndexer indexer = mat.createIndexer(); 

    int index = 0; 
    for (int i = 0; i < mat.rows(); i ++) 
    { 
     for (int j = 0; j < mat.cols(); j++) 
     { 
      for (int k = 0; k < mat.channels(); k++) 
      { 
       output[index] = (byte)indexer.get(i, j, k); 
       index++; 
      } 
     } 
    } 
    return output;