У меня есть MainForm, который получает изображения с камеры (15-20 кадров в секунду) и извлекает данные из этих изображений. Я хочу быть в состоянии построить эти данные, поэтому мне нужен объект Chart
, который будет обновляться при каждом полученном кадре.
К сожалению, API от камеры (Vimba), которую я использую, я думаю, странно написано, и я не могу нарисовать Chart
в том же событии, которое обрабатывает прием кадры и извлечение данных. Это просто не работает (в API, любая инструкция, которая включает графический объект, но не просто помещает полученное изображение в Bitmap
или помещает указанное растровое изображение в PictureBox
, не выполняется, я не не знаю почему).
Я боролся с этой проблемой уже несколько дней, и одну вещь, которую я еще не пробовал, - это передать данные, извлеченные из изображения, в другое Form
и нарисовать там диаграмму. Моя проблема в том, что я понятия не имею, как получить данные для отправки в новую форму в каждом полученном кадре. Я уже использовал простой метод для отправки данных другому Form
ОДИН РАЗ, но не постоянно. Может ли кто-нибудь объяснить мне, как этого добиться?
Вот событие, которое запускается, когда компьютер получает кадр от камеры (данные, которые я хочу нарисовать, хранятся в PixelColorCOuntReady
):
private void OnFrameReceived(Frame frame)
{
Bitmap myBitmap = null;
if (true == m_Acquiring)
{
mycamera.QueueFrame(frame);
}
frame.Fill(ref myBitmap);
pictureBoxLiveCamera.Image = myBitmap;
SaveBitmap = myBitmap.Clone(cloneRect, myBitmap.PixelFormat);
Array.Clear(PixelColorCount, 0, 256);
unsafe
{
int width = SaveBitmap.Width;
int height = SaveBitmap.Height;
int bytesPerPixel = 1;
int maxPointerLength = width * height * bytesPerPixel;
int stride = width * bytesPerPixel;
System.Drawing.Imaging.BitmapData bData = SaveBitmap.LockBits(new System.Drawing.Rectangle(0, 0, SaveBitmap.Width, SaveBitmap.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, SaveBitmap.PixelFormat);
byte* scan0 = (byte*)bData.Scan0.ToPointer();
byte B;
for (int i = 0; i < maxPointerLength; i++)
{
B = scan0[i];
PixelColorCount[B] += 1;
}
SaveBitmap.UnlockBits(bData);
}
PixelColorCountReady = PixelColorCount.DeepClone();
}