2016-05-17 22 views
0

Mein jfreeChart stammt aus Frames einer Webcam. Ich gebe diese Frames weiter und es erzeugt eine Grafik der R-, G- und B-Farben dieses Frames. Ich möchte, dass dieses Diagramm automatisch aktualisiert wird, wenn ich die Frames übergebe. Ich habe alles versucht, aber nichts scheint zu arbeiten.Aktualisieren Sie Jfreechart, wenn Sie Daten von der Webcam aktualisieren

Jede Hilfe ist willkommen.

class DaemonThread implements Runnable 
{ 
    protected volatile boolean runnable = false; 

    @Override 
    public void run() 
    { 
     synchronized(this) 
     { 
      while(runnable) 
      { 
       if(webSource.grab()) 
       { 
        try 
        { 
         webSource.retrieve(frame); 
         Imgcodecs.imencode(".bmp", frame, mem); 
         Image im = ImageIO.read(new ByteArrayInputStream(mem.toArray())); 

         buff = (BufferedImage) im; 

         if(contHistograma==0) { 
          h = new Histo(buff); 
          contHistograma++; 
         }else{ 
          h.update(buff); 
         } 

         webcamLabel.setIcon(new ImageIcon(buff)); 

         Graphics g=webcamPanel.getGraphics(); 

         if (g.drawImage(buff, 0, 0, getWidth(), getHeight() -150 , 0, 0, buff.getWidth(), buff.getHeight(), null)) 

          if(runnable == false) 
          { 
           System.out.println("Going to wait()"); 
           this.wait(); 
          } 
        } 
        catch(Exception ex) 
        { 
         System.out.println("Error"); 

        } 
       } 
      } 
     } 
    } 
} 





public class Histo{ 
private ChartFrame lineFrame; 
private ArrayList<Integer> redArray; 
private ArrayList<Integer> greenArray; 
private ArrayList<Integer> blueArray; 


public Histo(BufferedImage originalImage){ 
    Color c; 

    redArray = new ArrayList<>(); 
    greenArray = new ArrayList<>(); 
    blueArray = new ArrayList<>(); 

    for (int i = 0; i < originalImage.getWidth(null); i++) { 
     for (int j = 0; j < originalImage.getHeight(null); j++) { 
      c = new Color(originalImage.getRGB(i,j)); 
      redArray.add(c.getRed()); 
      greenArray.add(c.getGreen()); 
      blueArray.add(c.getBlue()); 
     } 
    } 
    Collections.sort(redArray); 
    Collections.sort(greenArray); 
    Collections.sort(blueArray); 


    XYSeriesCollection dataset = creatingDataset(redArray, greenArray, blueArray); 


    JFreeChart chart = createChart(dataset); 

    ChartPanel chartPanel = new ChartPanel(chart); 

    lineFrame = new ChartFrame("teste", chart); 
    lineFrame.add(chartPanel); 
    lineFrame.setVisible(true); 
    lineFrame.setSize(600, 450); 
} 

public void update(BufferedImage originalImage){ 
    redArray.clear(); 
    greenArray.clear(); 
    blueArray.clear(); 

    Color c; 

    for (int i = 0; i < originalImage.getWidth(null); i++) { 
     for (int j = 0; j < originalImage.getHeight(null); j++) { 
      c = new Color(originalImage.getRGB(i,j)); 
      redArray.add(c.getRed()); 
      greenArray.add(c.getGreen()); 
      blueArray.add(c.getBlue()); 
     } 
    } 
    Collections.sort(redArray); 
    Collections.sort(greenArray); 
    Collections.sort(blueArray); 

    XYSeriesCollection dataset = creatingDataset(redArray, greenArray, blueArray); 
    JFreeChart chart = createChart(dataset); 
    ChartPanel chartPanel = new ChartPanel(chart); 

    lineFrame.removeAll(); 
    lineFrame.add(chartPanel); 
    lineFrame.revalidate(); 

    lineFrame.setLayout(new BorderLayout()); 
    lineFrame.repaint(); 
} 

public static XYSeriesCollection creatingDataset(ArrayList<Integer> redArray,ArrayList<Integer> greenArray,ArrayList<Integer> blueArray){ 
    int cont=1, cont2=1, cont3=1; 
    XYSeries series = new XYSeries("Red"); 
    XYSeries series2 = new XYSeries("Green"); 
    XYSeries series3 = new XYSeries("Blue"); 

    for (int i = 0; i < redArray.size()-1; i++) { 
     if(redArray.get(i).intValue() == redArray.get(i+1).intValue()) { 
      cont++; 
     }else{ 
      series.add(redArray.get(i).intValue(), cont); 
      cont=1; 
     } 
    } 

    for (int i = 0; i < greenArray.size()-1; i++) { 
     if(greenArray.get(i).intValue() == greenArray.get(i + 1).intValue()) { 
      cont2++; 
     }else{ 
      series2.add(greenArray.get(i).intValue(), cont2); 
      cont2 = 1; 
     } 
    } 

    for (int i = 0; i < blueArray.size()-1; i++) { 
     if(blueArray.get(i).intValue() == blueArray.get(i+1).intValue()) { 
      cont3++; 
     }else{ 
      series3.add(blueArray.get(i).intValue(), cont3); 
      cont3=1; 
     } 
    } 

    XYSeriesCollection dataset = new XYSeriesCollection(); 
    dataset.addSeries(series); 
    dataset.addSeries(series2); 
    dataset.addSeries(series3); 

    return dataset; 
} 

private JFreeChart createChart(final XYDataset dataset) { 
    JFreeChart result = ChartFactory.createXYLineChart("Gráfico XY", "Eixo X", "Eixo Y", dataset, PlotOrientation.VERTICAL, true, true, false); 


    final XYPlot plot = result.getXYPlot(); 

    plot.setBackgroundPaint(new Color(0xffffe0)); 
    plot.setDomainGridlinesVisible(true); 
    plot.setDomainGridlinePaint(Color.lightGray); 
    plot.setRangeGridlinesVisible(true); 
    plot.setRangeGridlinePaint(Color.lightGray); 

    final NumberAxis domainAxis = (NumberAxis) plot.getDomainAxis();    //RANGE EIXO X 
    domainAxis.setRange(0, 260); 
    final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();     //RANGE EIXO Y 
    rangeAxis.setRange(0, 5000); 

    return result; 
} 

}

+0

Cross-gepostet [hier] (http://www.jfree.org/forum/viewtopic.php?f=3&t=117579&p=179758). – trashgod

Antwort

0

Wenn jemand anderes dieses Problem hier ist die Antwort:

Chartframe kann nicht von chartpanel loswerden, so machte ich Chartpanel ein atribute. Danach habe ich meine Daten-Set aktualisieren und tat dies:

JFreeChart chart = createChart(dataset); 
chartPanel.setChart(chart); 
lineFrame.setLayout(new BorderLayout()); 
lineFrame.repaint(); 

Problem gelöst.

+1

Denken Sie auch daran, den Datensatz Ihres Diagramms mit 'SwingWorker' zu aktualisieren, für [Beispiel] (http://stackoverflow.com/a/13205322/230513). – trashgod

Verwandte Themen