Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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中读取ROS压缩图像数据字节数组#_C#_Opencv_Bitmap_Emgucv_Bitmapimage - Fatal编程技术网

C# 在C中读取ROS压缩图像数据字节数组#

C# 在C中读取ROS压缩图像数据字节数组#,c#,opencv,bitmap,emgucv,bitmapimage,C#,Opencv,Bitmap,Emgucv,Bitmapimage,我想访问16UC1格式png图像的每个单独像素值的值,我将其作为字节[]接收 我对C#中的图像处理非常陌生,而且我已经被这个问题困扰了好几天了 我可以通过以下方式使用“典型”bgr8格式的jpg/png字节数组: private static Bitmap getBitmap(byte[] array) { return new Bitmap(new MemoryStream(array)); } 我尝试了很多16UC1格式的东西。我得到的最远信息是: private Bitmap getBi

我想访问16UC1格式png图像的每个单独像素值的值,我将其作为字节[]接收

我对C#中的图像处理非常陌生,而且我已经被这个问题困扰了好几天了

我可以通过以下方式使用“典型”bgr8格式的jpg/png字节数组:

private static Bitmap getBitmap(byte[] array)
{
return new Bitmap(new MemoryStream(array));
}
我尝试了很多16UC1格式的东西。我得到的最远信息是:

private Bitmap getBitmap(byte[] array)
{
    var bitmap = new Bitmap(640,480,PixelFormat.Format16bppRgb555);

    var bitmapData = bitmap.LockBits(new Rectangle(0, 0, 640, 480), ImageLockMode.WriteOnly, PixelFormat.Format16bppRgb555);
    System.Runtime.InteropServices.Marshal.Copy(bitmapData.Scan0, array, 0, array.Length);
    bitmap.UnlockBits(bitmapData);

    return bitmap;
}
这至少会返回一个位图,尽管它是完全黑色的。 尝试
PixelFormat.Format16bppGrayScale
而不是
PixelFormat.Format16bppRgb555
会给我一个“GDI+中的一般错误”

将字节数组写入文件时,例如通过

File.WriteAllBytes(filename, array);
我可以使用像IrfanView这样的图像查看器查看图像,尽管Windows照片查看器失败

不需要将文件作为位图读取。出于性能原因,我希望避免文件操作。我只想访问该图像的每个单独xy像素


更新: 我开始使用Emgu.CV并按照Dan的建议应用imdecode

private Bitmap getCompressedDepthBitmap(byte[] data)
{
    Mat result = new Mat(new Size(640, 480), DepthType.Cv16U, 1);
    CvInvoke.Imdecode(data,LoadImageType.AnyDepth, result);
    return result.Bitmap;           
}
这又给了我一个黑色的图像。(通过WriteAllBytes保存字节数组,我看到了有用的内容。)我也尝试了

Image<Gray, float> image = result.ToImage<Gray, float>();
image.Save(Path.Combine(localPath, "image.png"));
Image=result.ToImage();
image.Save(Path.Combine(localPath,“image.png”);
这也给了我一个黑色的图像。 我正计划以某种方式使垫子正常化,也许这会有帮助


感谢您的关注和支持

在浪费了好几个小时的工作时间和绝望之后,我终于找到了解决办法

我在上面的描述中遗漏了一件重要的事情,即图像数据字节[]来自ROS传感器_msgs/CompressedImage.msg

数据字节数组(应该包含png数据)有时以12字节的头开始;似乎仅当数据是(1通道)压缩的第二个图像时。我偶然发现了这个信息

删除这些令人讨厌的12个字节,然后像往常一样继续执行以下操作:

var bitmap = new Bitmap(new MemoryStream(dataSkip(12).ToArray()));

如果是
CV_16UC1
(意味着一个通道,即灰度),那么为什么要制作RGB位图?嗨,丹,谢谢你的评论!您的意思是将每个值增加三倍,然后将字节数组解析为位图吗?我的图像是一个压缩的png文件。其大小各不相同,远小于640*480*2字节。我不知道哪个字节对应灰度值。哦,它甚至还没有解码?你需要使用…你确定我必须显式解码吗?我问,因为其他(例如bgr8)压缩的png和jpg数据可以直接作为位图读取。您建议使用哪种opencv包装程序包?埃姆古?再次感谢!您是否尝试用加载图像?