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图片
    }
}
posted @ 2025-08-01 15:31  ꧁执笔小白꧂  阅读(54)  评论(0)    收藏  举报