У меня есть проект, который состоит из двух форм, 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
на камеру, чтобы получить новое изображение. - Мне пришлось использовать несколько потоков, поскольку использование потока пользовательского интерфейса слишком много приводило кблокировка приема с камеры.