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