2014-06-23 9 views
1

openCV로 웹캠보기를 만들려고하지만 저장된 이미지를 다시 칠하면 깜박이고 이미지가 때때로 반 회색으로 보입니다.repaint를 호출 할 때 간단한 버퍼링 된 이미지 깜박임

import java.awt.Graphics; 
    import java.awt.image.BufferedImage; 
    import java.io.File; 
    import java.io.IOException; 
    import javax.imageio.ImageIO; 
    import javax.swing.JPanel; 

    public class Panel extends JPanel { 

    BufferedImage img; 
    public Panel() { 
     super(true); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 


     try { 
      img = ImageIO.read(new File("webcam.jpg")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     g.drawImage(img, 0, 0, 640, 480, this); 
     repaint(); 
    } 
} 

답변

4

paintComponent() 메소드에서 이미지를 읽지 마십시오. 생성자의 이미지를 읽습니다.

또한 paintComponent() 메서드에서 repaint()를 호출하지 마십시오. 계속해서 다시 그려야 할 경우 스레드 또는 타이머를 사용하십시오.

편집 :이 일부 조정이 필요할 수 있지만, 내가 이야기하고 기본적인 접근 방식 :

import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JPanel; 

public class Panel extends JPanel implements Runnable{ 

BufferedImage img; 
public Panel() { 
    super(true); 
    new Thread(this).start(); 
} 

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    if(img != null){ 
     synchronized(this){ 
      g.drawImage(img, 0, 0, 640, 480, this); 
     } 
    } 
} 

public void run(){ 
    while(true){ 
     try { 
      synchronized(this){ 
       img = ImageIO.read(new File("webcam.jpg")); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     repaint(); 

     try { 
      Thread.sleep((long) (1000.0/30)); 
     } 
     catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
} 
+0

하지만 이미지를 한 번만 읽어와이 업데이트되지 않습니다. 다른 클래스 (saveImage)는 10millisecs마다 webcam.jpg에 웹캠 이미지를 저장합니다. – Pauli

+0

아, 알겠습니다. 타이머 또는 스레드에서 이미지를 읽습니다. –

+0

그래서 이미지를 읽고 다시 그리는 생성자에 스레드를 만들어야합니까? paintcomponent에있는 이미지 만 그릴 수 있습니까? – Pauli