Hassan猿 2021-11-30 14:18
浏览 117
已结题

DALSA彩色相机C#保存图像开发,出现报错以及黑图

1.背景:
硬件:DALSA的2K彩色相机,内触发。
软件:C#开发,原本是一套黑白相机代码,使用DALSA提供的SDK,没有用OPENCV或者HALCON来进行图片保存,用的DALSA自己给的write和save方法,这一套代码在以前的4k黑白相机上运行无问题,最近设备换成了2k彩色相机,存图出现了问题。

2.代码大致思路:
相机各参数已经保存为ccf文件,代码读取ccf文件的内容,在回调函数中,用marshal.copy将数据从非托管内存指针赋值到托管数组,然后自己创建了一个imageData类,用这个对象来接收内存数据,然后将对象放入一个队列中。另起一个线程,判断之前的队列是否为空,不为空则拿队列内的数据,然后保存。

回调函数代码:

void m_Xfer_XferNotify(object sender, SapXferNotifyEventArgs argsNotify)
        {
            if (argsNotify.Trash) return;
            //获取m_Buffers的地址(指针)
            IntPtr addr = IntPtr.Zero;
            m_Buffers.GetAddress(out addr);
            int count = m_Buffers.Count;  
            SapFormat format = m_Buffers.Format;  
            int height = m_Buffers.Height;  //1000
            int width = m_Buffers.Width;  //2048
            //2021-11-18黑白转彩色,由于彩色rgb图像为三通道,所以将size做*3处理。
            int size = width * height*3;//图片大小
            byte[] data = new byte[size];
            //将数据从非托管内存指针复制到托管8位无符号整数数组(0至size)
            Marshal.Copy(addr, data, 0, size);
            ImageData imageData = new ImageData(data, width, height, size);
            inQueue.Enqueue(imageData);
            m_Buffers.ReleaseAddress(addr);
        }

另外一个线程,保存图片用:

void save()
        {
            while (true)
            {
                if (!inQueue.IsEmpty)
                {
                        ImageData imageData;
                        inQueue.TryDequeue(out imageData);
                        SapBuffer m_Buffers_save = new SapBuffer(3, imageData.ImageWidth, imageData.ImageHeight, sapFormat, memoryType);
                        m_Buffers_save.Create();
                        long datasize = imageData.ImageDataSize;
                        GCHandle dataBufHandle = GCHandle.Alloc(imageData.DataBuffer, GCHandleType.Pinned);
                        IntPtr saveBuffer = dataBufHandle.AddrOfPinnedObject();
                        m_Buffers_save.Write(0, (int)datasize, saveBuffer);
                        m_Buffers_save.Save(urlFromJava + saveCunt + ".bmp", "-format bmp");
                        Console.WriteLine(saveCunt);
                        saveCunt++;
                        dataBufHandle.Free();
                        m_Buffers_save.Clear();
                        m_Buffers_save.Destroy();
                        m_Buffers_save.Dispose();
                }
            }
        }

3.问题点:
①刚开始采图,C#报错保存方法中的write方法有问题,就是那个存图用的临时对象,不够大:

img

②上述错误,点击是,则很快又弹窗一次错误,点击否则可以正常采图,但是保存下来的图片很多是纯黑的,没有任何内容:
正常图:

img


黑图:

img

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 12月8日
    • 创建了问题 11月30日

    悬赏问题

    • ¥30 SQL 数组,游标,递归覆盖原值
    • ¥15 为什么我的数据接收的那么慢呀有没有完整的 hal 库并 代码呀有的话能不能发我一份并且我用 printf 函数显示处理之后的数据,用 debug 就不能运行了呢
    • ¥15 有关于推荐系统jupyter
    • ¥20 gitlab 中文路径,无法下载
    • ¥15 用动态规划算法均分纸牌
    • ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据
    • ¥15 关于树的路径求解问题
    • ¥15 yolo在训练时候出现File "D:\yolo\yolov5-7.0\train.py"line 638,in <module>
    • ¥30 戴尔inspiron独显直连
    • ¥15 进行一项代码设计遇到问题