C# 表单之间的连续数据传递
我有一个MainForm,它从照相机接收图像(每秒15-20帧),并从这些图像中提取数据。我希望能够绘制这些数据,因此我需要一个C# 表单之间的连续数据传递,c#,image,charts,C#,Image,Charts,我有一个MainForm,它从照相机接收图像(每秒15-20帧),并从这些图像中提取数据。我希望能够绘制这些数据,因此我需要一个图表对象,该对象将在收到的每个帧上更新 不幸的是,我使用的摄像机API(Vimba)写得很奇怪,我无法在处理帧接收和数据提取的同一事件中绘制图表。它根本不起作用(在API中,任何涉及图形对象但不只是将接收到的图像放入位图,或将所述位图放入PictureBox,的指令都不会运行,我不知道为什么) 我已经为这个问题争论了几天,有一件事我还没有尝试过,那就是将从图像中提取的数
图表
对象,该对象将在收到的每个帧上更新
不幸的是,我使用的摄像机API(Vimba)写得很奇怪,我无法在处理帧接收和数据提取的同一事件中绘制图表。它根本不起作用(在API中,任何涉及图形对象但不只是将接收到的图像放入位图
,或将所述位图放入PictureBox
,的指令都不会运行,我不知道为什么)
我已经为这个问题争论了几天,有一件事我还没有尝试过,那就是将从图像中提取的数据传递到另一个表单
,并在那里绘制图表。我的问题是,我不知道如何在收到的每一帧上将数据发送到新表单。我已经使用了一种简单的方法将数据发送到另一个表单
一次,但不是连续发送。有人能给我解释一下如何做到这一点吗
以下是计算机从相机接收到帧时运行的事件(我要绘制的数据存储在PixelColorCOuntReady
):
private void OnFrameReceived(帧)
{
位图myBitmap=null;
if(true==m_)
{
mycamera.QueueFrame(帧);
}
帧填充(参考myBitmap);
pictureBoxLiveCamera.Image=myBitmap;
SaveBitmap=myBitmap.Clone(cloneRect,myBitmap.PixelFormat);
Array.Clear(像素颜色计数,0,256);
不安全的
{
int-width=SaveBitmap.width;
int height=SaveBitmap.height;
int字节/像素=1;
int maxPointerLength=宽度*高度*字节/像素;
int步长=宽度*字节/像素;
System.Drawing.Imaging.BitmapData bData=SaveBitmap.LockBits(新的System.Drawing.Rectangle(0,0,SaveBitmap.Width,SaveBitmap.Height),System.Drawing.Imaging.ImageLockMode.ReadWrite,SaveBitmap.PixelFormat);
字节*scan0=(字节*)bData.scan0.ToPointer();
字节B;
对于(int i=0;i
也许您可以使用多个线程。每次您得到一个image=>运行线程,该线程将向全局变量收集数据。添加另一个线程,每隔几分钟读取此变量并从中绘制图表。这一切都可以从一个角度来完成。老实说,这是一个我没有想到的好主意。由于我从未使用过多线程(有点像是一个使用C#和整体编码的新手),您知道我可以阅读的一个好的新手友好文档吗?不管怎样,谢谢你的想法,我会调查的。这只是一个例子,你会在这里找到很多答案。我喜欢保持它的简单性,但您将需要了解很少关于代理的知识,以便从另一个线程更新GUI。请记住,在编写程序时,您需要关闭线程(绘制图表的线程)。
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();
}