Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 表单之间的连续数据传递_C#_Image_Charts - Fatal编程技术网

C# 表单之间的连续数据传递

C# 表单之间的连续数据传递,c#,image,charts,C#,Image,Charts,我有一个MainForm,它从照相机接收图像(每秒15-20帧),并从这些图像中提取数据。我希望能够绘制这些数据,因此我需要一个图表对象,该对象将在收到的每个帧上更新 不幸的是,我使用的摄像机API(Vimba)写得很奇怪,我无法在处理帧接收和数据提取的同一事件中绘制图表。它根本不起作用(在API中,任何涉及图形对象但不只是将接收到的图像放入位图,或将所述位图放入PictureBox,的指令都不会运行,我不知道为什么) 我已经为这个问题争论了几天,有一件事我还没有尝试过,那就是将从图像中提取的数

我有一个MainForm,它从照相机接收图像(每秒15-20帧),并从这些图像中提取数据。我希望能够绘制这些数据,因此我需要一个
图表
对象,该对象将在收到的每个帧上更新

不幸的是,我使用的摄像机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();
    }