如何使用 Pleora eBUS SDK c# 或 python 从 Photon Focus 相机获取“像素”数据值?

Posted

技术标签:

【中文标题】如何使用 Pleora eBUS SDK c# 或 python 从 Photon Focus 相机获取“像素”数据值?【英文标题】:How to get the "pixel" data values from a Photon Focus camera using the Pleora eBUS SDK c# or python? 【发布时间】:2021-11-16 21:13:12 【问题描述】:

我有一个 3D Photon Focus 相机 (MV1-D2048x1088-3D06-760-G2-8),我在 Windows 10 机器上使用 C# 和 Pleora eBUS SDK 版本 5.1.1。相机设置为在 LineFinder 模式下扫描激光线,DataFormat3D = 2 并返回数据(缓冲区有效负载 = 2 x 2048 = 4096 字节)。有效载荷似乎是正确的。我想保存这些数据,但我遇到了困难。如何将缓冲区放入数组(或某些结构)中以将其保存到文件流中? 我的代码使用 Pleora eBUS SDK 中的 .DataPointer 参数,但我不明白它在做什么。我在这里包含的手册 - MAN075_PhotonFocus

private unsafe static void ThreadProc(object aParameters)
    
        object[] lParameters = (object[])aParameters;
        MainForm lThis = (MainForm)lParameters[0];

        for (;;)
        
            if (lThis.mIsStopping)
            
                // Signaled to terminate thread, return.
                return;
            

            PvBuffer lBuffer = null;
            PvResult lOperationResult = new PvResult(PvResultCode.OK);                
            // Retrieve next buffer from acquisition pipeline
            PvResult lResult = lThis.mStream.RetrieveBuffer(ref lBuffer, ref lOperationResult, 100);
            if (lResult.IsOK)
            
                // Operation result of buffer is OK, display.
                if (lOperationResult.IsOK)
                
                    //lThis.displayControl.Display(lBuffer);
                    uint bSize = lBuffer.GetPayloadSize();
                    PvImage image1 = lBuffer.Image;
                    uint height1 = image1.Height;
                    uint width1 = image1.Width;
                    uint offx1 = image1.OffsetX;
                    uint offy1 = image1.OffsetY;                        
                    PvPixelType imgpixtype = image1.PixelType;                                               
                    image1.Alloc(width1, (uint)2, imgpixtype);
                    byte *data_pnt = image1.DataPointer ;
                    byte[] MSB_array = new byte[(int)width1];
                    int buff_size = 2 * (int)width1;
                    byte[] pix_array = new byte[buff_size];                       
                    
                    ulong tStamp = lBuffer.Timestamp;
                    string msgOut = (bSize.ToString() + " TimeStamp " + tStamp.ToString() + " width " + width1.ToString());
                    Console.WriteLine(msgOut);
                    for (int i = 0; i < width1; i++)
                    
                        data_pnt += 0;
                        Console.Write((uint)*data_pnt);
                        MSB_array[i] = *data_pnt;
                        data_pnt += 1;
                    
                    data_pnt += 1;
                    Console.WriteLine(height1.ToString());
                    for (int i = 0; i < width1; i++)
                    
                        ushort msb1 = MSB_array[i];
                        ushort last_4 = (ushort)(*data_pnt & 0x0F);
                        int integer1 = (msb1 << 4)+(ushort)(*data_pnt>>4);
                        double dec_part = (float)last_4 / (float)16;
                        double val1 = (float)integer1 + dec_part;
                        Console.WriteLine(val1.ToString());
                        data_pnt += 1;
                    
                    Console.WriteLine(height1.ToString());
                
                else
                
                    uint bSize = lBuffer.GetPayloadSize();
                    ulong tStamp = lBuffer.Timestamp;
                    string msgOut = (bSize.ToString() + " BAD RESULT TimeStamp " + tStamp.ToString());
                    Console.WriteLine(msgOut);
                

                // We have an image - do some processing (...) and VERY IMPORTANT,
                // re-queue the buffer in the stream object.
                lThis.mStream.QueueBuffer(lBuffer);
            
        
    

【问题讨论】:

它是将数据复制到Bitmap img_bitmap1,因此您可以使用img_bitmap1将像素数据保存为文件。 data_pnt 仅用于在控制台中显示一些值 您可以使用PvBufferConverter 将格式从8bit 转换为其他格式。使用所需的 PvPixelType 创建第二个 PvBuffer。 convertBuffer.Image.Alloc(lBuffer.Image.Width, lBuffer.Image.Height, PvPixelType.BGR8); 谢谢@JeroenvanLangen。我需要知道正在发送的数据。数据由相机编码,每 2 个字节包含“高度 Z 数据”而不是实际图像。前 12 位包含整数数据,后 4 位包含小数数据。我需要读取字节。我认为 PixelType 很好。由于某种原因,我无法正确阅读它们。 我不认为图像是交错存储的。它是平面存储的,所以首先是所有高度数据,然后是亮度,然后是数据层页面/块。 【参考方案1】:

我当前的解决方案是通过递增指针来循环缓冲区并将字节保存到新数组(MSB_array)中。这些数据的打包方式(请参阅问题中的附图)我必须读取下一行并将其移位并将其添加到 MSB_array 中的字节以获得一个

    for (int i = 0; i < width1; i++)
        
            data_pnt += 0;
            Console.Write((uint)*data_pnt);
            MSB_array[i] = *data_pnt;
            data_pnt += 1;
        
        data_pnt += 1;
        Console.WriteLine(height1.ToString());
        for (int i = 0; i < width1; i++)
        
            ushort msb1 = MSB_array[i];
            ushort last_4 = (ushort)(*data_pnt & 0x0F);
            int integer1 = (msb1 << 4)+(ushort)(*data_pnt>>4);
            double dec_part = (float)last_4 / (float)16;
            double val1 = (float)integer1 + dec_part;
            Console.WriteLine(val1.ToString());
            data_pnt += 1;
        

我现在只是将它写到控制台,但数据是正确的。可能有比使用指针的 for 循环更好/更快的方法。该帖子将不胜感激。

【讨论】:

我将发布完成的方法。现在似乎一切正常。

以上是关于如何使用 Pleora eBUS SDK c# 或 python 从 Photon Focus 相机获取“像素”数据值?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Azure SDK C# 创建和删除可用性测试

C# Google SDK 更新或补丁用户

如何使用paypal C# sdk获取直接支付方式的transactionid

使用 C++ 或 C# 实时录制声音

如何将 Astra sdk 与 Visual Studio 2013 C# 集成?

如何在 Raspberry Pi 4 上使用 Azure 语音服务 C# SDK 设置麦克风