当前位置: 首页 > 知识库问答 >
问题:

从网络摄像头更新数据时更新Jfreechart

龙飞文
2023-03-14

我的jfreeChart来自网络摄像头的帧。我通过这个框架,它生成一个图形的R,G和B颜色的这个框架。我想这个图表做自动更新,因为我通过帧。我什么都试过了,但都没用。

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;
}

}

共有1个答案

寇涵容
2023-03-14

如果其他人有这个问题,这里是答案:

Chartframe无法摆脱chartpanel,所以我把chartpanel做成了一个Atribute。之后,我更新我的数据集并执行以下操作:

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

问题解决了。

 类似资料:
  • 对于我正在进行的计算机视觉项目,我需要使用Logitech C920网络摄像头抓取图像。我使用OpenCV的视频捕获来实现这一点,但我面临的问题是,我在某个时刻拍摄的图像没有显示相机看到的最新情况。也就是说,如果我在时间戳t处拍摄一张图像,它显示了相机在时间戳(t-delta)处看到的东西,也就是说。 为此,我编写了一个程序,使计数器递增并在屏幕上显示。我把相机对准屏幕,让它录下来。当计数器达到某

  • 我想知道ehcache是否有办法检测数据库更新/插入(spring/java,hibernate web应用程序),并使用数据库中的当前(最新)数据刷新其缓存。如果没有,检测数据库更新的最佳方法是什么,以保持与缓存和数据库之间的数据同步?

  • 本文向大家介绍FFmpeg获取网络摄像头数据解码,包括了FFmpeg获取网络摄像头数据解码的使用技巧和注意事项,需要的朋友参考一下 对USB摄像头实时编码,在前面已经探讨过了。这次改变下思路,尝试去截取网络摄像头的H264码流,将其解码播放。 这里的测试代码,是在海康摄像头的基础上进行的。 解码的大致流程和以前的保持一致,只不过增加了部分函数。 FFmpeg打开媒体文件并查看媒体文件的信息,有三个

  • composer network update实用程序用于将已部署业务网络档案从本地磁盘更新到Hyperledger Fabric运行时。 composer network update -a <business-network-archive> -c <card-name> 业务网络定义必须先被部署到Fabric。业务网络定义在相同的链码容器内被替换。 选项 Options: --help

  • 我正在开发一个web应用程序,它可以浏览和拍摄本地照片,我还想通过相机拍摄图像。我使用下面的代码,我可以捕捉设备摄像头。 现在,我想获得图像和onchangeevent,转换为base64,并希望在该页面中显示。 好心帮我伙计们!

  • 这个问题可能已经得到了回答,我读过很多类似的,但对我不起作用。因此,我的具有扩展的自定义表模型。我的数据是和列名。那么,当我的数据发生更改时,如何更新表呢?我一直在使用,它正在工作,但它将我的自定义单元格呈现器重置为默认值。谢了。