C#+VisionMaster联合开发(十四)_ImageBaseData、ImageBaseData_V2与Mat互转
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using VM.PlatformSDKCS;
namespace VisionMater_Simple.VMTools
{
/// <summary>
/// 图片类型转化
/// </summary>
public class ImgConvertTools
{
#region ImageBaseData_V2 转 Mat图片
/// <summary>
/// ImageBaseData_V2 转 Mat图片
/// </summary>
/// <param name="imageBaseData_V2">ImageBaseData_V2图片</param>
/// <returns></returns>
public static Mat ImageBaseData_V2ToMat(ImageBaseData_V2 imageBaseData_V2)
{
Mat mat = new Mat();
byte[] buffer = new byte[imageBaseData_V2.DataLen];
Marshal.Copy(imageBaseData_V2.ImageData, buffer, 0, buffer.Length);
if (VMPixelFormat.VM_PIXEL_MONO_08 == imageBaseData_V2.Pixelformat)
{
mat.Create(imageBaseData_V2.Height, imageBaseData_V2.Width, MatType.CV_8UC1);
Marshal.Copy(buffer, 0, mat.Ptr(0), buffer.Length);
}
else if (VMPixelFormat.VM_PIXEL_RGB24_C3 == imageBaseData_V2.Pixelformat)
{
mat.Create(imageBaseData_V2.Height, imageBaseData_V2.Width, MatType.CV_8UC3);
//交换R与B通道
for (int i = 0; i < buffer.Length - 2; i += 3)
{
byte temp = buffer[i];
buffer[i] = buffer[i + 2];
buffer[i + 2] = temp;
}
Marshal.Copy(buffer, 0, mat.Ptr(0), buffer.Length);
}
return mat;
}
/// <summary>
/// Mat 转 ImageBaseData_V2图片
/// </summary>
/// <param name="matInputImg">Mat图片</param>
/// <returns></returns>
public static ImageBaseData_V2 MatToImageBaseData_V2(Mat matInputImg)
{
ImageBaseData_V2 imageBaseData_V2 = new ImageBaseData_V2();
uint dataLen = (uint)(matInputImg.Width * matInputImg.Height * matInputImg.Channels());
if (1 == matInputImg.Channels())
imageBaseData_V2 = new ImageBaseData_V2(matInputImg.Ptr(0), dataLen, matInputImg.Width, matInputImg.Height, VMPixelFormat.VM_PIXEL_MONO_08);
else if (3 == matInputImg.Channels())
{
//交换R与B通道
Cv2.CvtColor(matInputImg, matInputImg, ColorConversionCodes.BGR2RGB);
imageBaseData_V2 = new ImageBaseData_V2(matInputImg.Ptr(0), dataLen, matInputImg.Width, matInputImg.Height, VMPixelFormat.VM_PIXEL_RGB24_C3);
}
return imageBaseData_V2;
}
#endregion ImageBaseData_V2 转 Mat图片
#region ImageBaseData 转 Mat图片
/// <summary>
/// ImageBaseData 转 Mat图片
/// </summary>
/// <param name="imageBaseData">ImageBaseData图片</param>
/// <returns></returns>
public static Mat ImageBaseDataToMat(ImageBaseData imageBaseData)
{
#region 旧代码
//Mat mat = null;
//int height = imageBaseData.Height;
//int width = imageBaseData.Width;
//byte[] buffer = new byte[imageBaseData.ImageData.Length];
//imageBaseData.ImageData.CopyTo(buffer, 0);
//if (17301505 == imageBaseData.Pixelformat) // VM_PIXEL_MONO_08
//{
// mat = new Mat(height, width, MatType.CV_8UC1, new Scalar(0));
// int copyLength = height * width * 1;
// Marshal.Copy(buffer, 0, mat.Data, copyLength);
//}
//else if (35127316 == imageBaseData.Pixelformat) // VM_PIXEL_RGB24_C3
//{
// mat = new Mat(height, width, MatType.CV_8UC3, new Scalar(0));
// //交换R与B通道
// for (int i = 0; i < buffer.Length - 2; i += 3)
// {
// byte temp = buffer[i];
// buffer[i] = buffer[i + 2];
// buffer[i + 2] = temp;
// }
// int copyLength = height * width * 3;
// Marshal.Copy(buffer, 0, mat.Data, copyLength);
//}
//return mat;
#endregion 旧代码
// 测试用
//string fileStr = "D:\\" + DateTime.Now.ToString("yyyyMMdd_HHmmss_fff.bit");
//bitmap.Save(fileStr);
//Thread.Sleep(80);
//Mat mat = new Mat(fileStr);
//Thread.Sleep(50);
//try
//{
// File.Delete(fileStr);
//}
//catch { }
//return mat;
// 也是种方式
//Mat mat = Mat.FromImageData(imageBaseData.ImageData);
//return mat;
Bitmap bitmap = imageBaseData.ToBitmap();
Mat mat = bitmap.ToMat();
}
/// <summary>
/// Mat 转 ImageBaseData图片
/// </summary>
/// <param name="matInputImg">Mat图片</param>
/// <returns></returns>
public static ImageBaseData MatToImageBaseData(Mat matInputImg)
{
ImageBaseData imageBaseData = new ImageBaseData();
uint dataLen = (uint)(matInputImg.Width * matInputImg.Height * matInputImg.Channels());
if (1 == matInputImg.Channels())
imageBaseData = new ImageBaseData(matInputImg.Ptr(0), dataLen, matInputImg.Width, matInputImg.Height, VMPixelFormat.VM_PIXEL_MONO_08);
else if (3 == matInputImg.Channels())
{
//交换R与B通道
Cv2.CvtColor(matInputImg, matInputImg, ColorConversionCodes.BGR2RGB);
imageBaseData = new ImageBaseData(matInputImg.Ptr(0), dataLen, matInputImg.Width, matInputImg.Height, VMPixelFormat.VM_PIXEL_RGB24_C3);
}
return imageBaseData;
}
#endregion ImageBaseData 转 Mat图片
}
}
本文来自博客园,作者:꧁执笔小白꧂,转载请注明原文链接:https://www.cnblogs.com/qq2806933146xiaobai/p/19016985

浙公网安备 33010602011771号