体表追踪(Image控件实时显示图片)

获取的参数为unsigned char数组,需要将其封送至c#中的byte数组。然后再在Image中显示出来。效果如下。
在这里插入图片描述看似简单,但实现过程出现了很多错误,卡了挺久的,现在记录一下。


1.如何在Image中读取现有图片
        private string path = @"D:\test.jpg";
        using (BinaryReader loader = new BinaryReader(File.Open(path, FileMode.Open)))
            {
                FileInfo fd = new FileInfo(path);
                int Length = (int)fd.Length;
                byte[] buf = new byte[Length];
                buf = loader.ReadBytes((int)fd.Length);
                loader.Dispose();
                loader.Close();
 
 
                //开始加载图像
                BitmapImage bim = new BitmapImage();//BitmapImage该类可用于在Image显示图片。
                bim.BeginInit();
                bim.StreamSource = new MemoryStream(buf);//将byte数组导入
                bim.EndInit();
                image1.Source = bim;
                GC.Collect(); //强制回收资源
            }

因为要显示的目标图片是以byte数组的形式存在,那么就可以省略一些步骤,直接 bim.StreamSource = new MemoryStream(buf);把数组导入,然后不就可以显示了吗。但并没有那么简单。
首先出现了这个错误。(其实我也没解决)
在这里插入图片描述

2.查看c#,c++中数组内容是否正确

这时候就想,会不会是参数传递时出错了。

(1)c++那边获取的参数数组是否正确,同样保存为图片。

....
	image[itmLeft].getBinaryDataInfo(&width, &height, &channels, 0, 0, 0);//获取图片长宽,通道数
	image[itmLeft].getBinaryData(imageBuf_left, 0);
	_opencv.saveColoredImage(imageBuf_left, height, width,savePath);//保存
....


template<typename T>
void OpenCVUtility::saveColoredImage(std::vector<T> buffer, int rows, int cols, const char* filename)
{
	/*std::stringstream ss;
	ss << "img_" << _func.getTime() << ".jpg";
	const char* savePath = _func.getSavePath(ss.str().c_str());*/

	// CV_8UC3:8位无符号的三通道---RGB彩色图像
	cv::Mat img = cv::Mat(rows, cols, CV_8UC3);
	const int channels = img.channels();

	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			int pixelIndex = i * cols * channels + j * channels;

			for (int k = 0; k < channels; k++)
			{
				img.data[pixelIndex + k] = buffer[pixelIndex + k];
			}
		}
	}

	cv::imwrite(filename, img);
}

(2)即c#这边所得的byte数组转换为图片看是为目标图片。

			MemoryStream ms = new MemoryStream(byData);//byData目标数组
            System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
            img.Save(@"C:test.jpg");

上面两种方式传入正确的参数后均可保存图片,证明了c#那边得到的数组是正确的,可能写入Bitmap的方式不对,还有对图片类型估计错误,导致数组转换为图片时格式读取出错。


3.如何正确将数组写入
.......
	IntPtr left_intPtr, right_intPtr;
	int len;
	int width = 0, height = 0;
	AppInterface.GetRawImage(camSerial, out left_intPtr,out right_intPtr,out len, out width, out height);//获取指向目标数组的句柄,所表示图片长宽
	if (left_intPtr != IntPtr.Zero)
	{
		byte[] pixels = new byte[len];
		Marshal.Copy(left_intPtr, pixels, 0, len);//转换为数组

		Bitmap bmp_show = new Bitmap(width, height);
		for (int y = 0; y < height; y++)
		{
			for (int x = 0; x < width; x++)
			{
				int i = y * width + x;
				System.Drawing.Color color = System.Drawing.Color.FromArgb(pixels[i], pixels[i], pixels[i]);//感觉是关键
				bmp_show.SetPixel(x, y, color);
            }
        }

		image_left.Source = BitmapToImageSource(bmp_show);//show
                    // image_left.Width = width / 2;
                    // image_left.Height = height / 2;
                }


private BitmapImage BitmapToImageSource(Bitmap bitmap)
        {
            using (MemoryStream memory = new MemoryStream())
            {
                bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp);
                memory.Position = 0;
                BitmapImage bitmapimage = new BitmapImage();
                bitmapimage.BeginInit();
                bitmapimage.StreamSource = memory;
                bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
                bitmapimage.EndInit();

                return bitmapimage;
            }
        }

根据通道数做相应的变换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值