Расфокусировать график обновления в реальном времени - PullRequest
0 голосов
/ 28 мая 2018

У меня есть проект, который состоит из двух форм, MainForm и CrossCorrPlotForm.На CrossCorrPlotForm у меня есть два charts (CrossCorrExpChart и CrossCorrRefChart), для которых я включил масштабирование колеса прокрутки, используя код, описанный здесь и здесь .

Все работало идеально, пока я не добавил еще один chart (histChart) на MainForm, который обновляется для каждого кадра, поступающего с камеры (15-20 FPS), используя BackgroundWorkerсобирать и наносить данные из изображений.Теперь обе мои диаграммы на CrossCorrPlotChart больше не масштабируются.

Я предполагаю, что это как-то связано с графиком обновления в реальном времени, возвращающим фокус на каждое обновление.Я попытался добавить histChart.Focus = false в код, но безрезультатно, так как кажется, что «Control.Focused только для чтения».

У кого-нибудь есть идеи, как сделать мой charts снова масштабируемым?

Спасибо

РЕДАКТИРОВАТЬ: Вот код для BackgroundWorker, который обновляет chartHist:

    private void OnFrameReceived(Frame frame)
    {
        bgw1.RunWorkerAsync(frame);
    }

    private void bgw1_DoWork(object s, DoWorkEventArgs e)
    {
        Frame frame = (Frame)e.Argument;
        myBitmap = null;
        try
        {
            frame.Fill(ref myBitmap);
            mycamera.QueueFrame(frame);
            SaveBitmap = myBitmap.Clone(cloneRect, myBitmap.PixelFormat);
            BitmapToPrint = myBitmap.Clone(cloneRect, myBitmap.PixelFormat);
        }
        catch {}
    }

    private void bgw1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (this.InvokeRequired)
        {
            BeginInvoke((Action)(() => bgw1_RunWorkerCompleted(sender, e)));
        }
        else
        {
            new Thread(() =>
            {
                Thread.CurrentThread.IsBackground = true;
                DataFromBitmap DataFromBitmapHist = new DataFromBitmap(SaveBitmap.Clone(cloneRect, SaveBitmap.PixelFormat));
                PixelColorCount = DataFromBitmapHist.ColorCountOutput();
            }).Start();

            chartHist.Titles["Title2"].Visible = false;
            chartHist.Series["Pixel count"].Points.Clear();

            //Plotting the pixel counter, to detect saturation
            for (int i = 0; i < PixelColorCount.Length; i++)
            {
                chartHist.Series["Pixel count"].Points.AddXY(i, PixelColorCount[i]);
            }

            //If there are saturated pixels : toggle a title on chartHist to warn the user
            if (PixelColorCount.Last() > 1)
            {
                chartHist.Titles["Title1"].Visible = false;
                chartHist.Titles["Title2"].Visible = true;
            }
            else
            {
                chartHist.Titles["Title1"].Visible = true;
                chartHist.Titles["Title2"].Visible = false;
            }
        }
    }

ПРИМЕЧАНИЯ:

  • OnFrameReceived - это функция из API камеры, она содержит код, который срабатывает при получении от камеры Frame.
  • frame.Fill помещает изображение, содержащееся в объекте Frame, в Bitmap.
  • mycamera.QueueFrame отправляет обратно объект Frame на камеру, чтобы получить новое изображение.
  • Мне пришлось использовать несколько потоков, поскольку использование потока пользовательского интерфейса слишком много приводило кблокировка приема с камеры.
...