几何尺寸与公差论坛

 找回密码
 注册
查看: 448|回复: 4

opencv Mat图像格式转Bitmap的方式不?

  [复制链接]
发表于 2023-3-2 15:08:28 | 显示全部楼层 |阅读模式
public static Bitmap convertMatToBitmap(Mat image) {
    Bitmap bitmap = null;
    try {
        int width = image.width();
        int height = image.height();
        int channels = image.channels();
        byte[] pixels = new byte[width * height * channels];
        image.get(0, 0, pixels);
        if (channels == 2) {
            // CV_8UC2
            bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            for (int i = 0; i < width * height; i++) {
                int r = pixels[i * 2] & 0xff;
                int g = pixels[i * 2 + 1] & 0xff;
                bitmap.setPixel(i % width, i / width, Color.argb(255, r, g, 0));
            }
        } else if (channels == 3) {
            // CV_8UC3
            bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_888);
            for (int i = 0; i < width * height; i++) {
                int r = pixels[i * 3] & 0xff;
                int g = pixels[i * 3 + 1] & 0xff;
                int b = pixels[i * 3 + 2] & 0xff;
                bitmap.setPixel(i % width, i / width, Color.rgb(r, g, b));
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return bitmap;
}


 楼主| 发表于 2023-3-2 15:33:24 | 显示全部楼层
用c#编写在windows平台上将opencv Mat图像格式转Bitmap?是不是可以用指令集加速
 楼主| 发表于 2023-3-2 15:33:34 | 显示全部楼层
是的,可以使用C#和OpenCV库在Windows平台上将Mat图像格式转换为Bitmap。在转换时,使用指令集加速可以提高转换速度。

以下是使用OpenCVSharp和指令集加速的示例代码:

java
Copy code
using System.Drawing;
using OpenCvSharp;

// Load the image as a Mat object
Mat matImage = Cv2.ImRead("image.jpg");

// Convert Mat to Bitmap using SSE2 (Streaming SIMD Extensions 2) instruction set
Bitmap bitmapImage = matImage.ToBitmap(ImreadModes.AnyDepth | ImreadModes.AnyColor, MatType.CV_8UC3, Cv2.UseOptimized + Cv2.Accelerate);

// Save the Bitmap image
bitmapImage.Save("image.bmp");
在上面的代码中,使用OpenCvSharp的ToBitmap方法将Mat对象转换为Bitmap对象,并使用Cv2.UseOptimized + Cv2.Accelerate参数启用指令集加速。

注意:要使用指令集加速,必须在编译时使用与指令集相匹配的CPU选项。默认情况下,C#编译器会自动使用当前系统上可用的最佳CPU选项。
 楼主| 发表于 2023-3-2 15:33:38 | 显示全部楼层
是的,可以使用C#和OpenCV库在Windows平台上将Mat图像格式转换为Bitmap。在转换时,使用指令集加速可以提高转换速度。

以下是使用OpenCVSharp和指令集加速的示例代码:

java
Copy code
using System.Drawing;
using OpenCvSharp;

// Load the image as a Mat object
Mat matImage = Cv2.ImRead("image.jpg");

// Convert Mat to Bitmap using SSE2 (Streaming SIMD Extensions 2) instruction set
Bitmap bitmapImage = matImage.ToBitmap(ImreadModes.AnyDepth | ImreadModes.AnyColor, MatType.CV_8UC3, Cv2.UseOptimized + Cv2.Accelerate);

// Save the Bitmap image
bitmapImage.Save("image.bmp");
在上面的代码中,使用OpenCvSharp的ToBitmap方法将Mat对象转换为Bitmap对象,并使用Cv2.UseOptimized + Cv2.Accelerate参数启用指令集加速。

注意:要使用指令集加速,必须在编译时使用与指令集相匹配的CPU选项。默认情况下,C#编译器会自动使用当前系统上可用的最佳CPU选项。
 楼主| 发表于 2023-3-2 15:37:15 | 显示全部楼层
是的,可以使用C#代码将OpenCV Mat图像格式转换为Bitmap。同时,可以使用指令集加速这个过程以提高转换速度。

下面是一个示例代码,演示如何将OpenCV Mat图像转换为Bitmap格式:

csharp
Copy code
using System;
using System.Drawing;
using System.Drawing.Imaging;
using OpenCvSharp;

class Program
{
    static void Main(string[] args)
    {
        // Load image using OpenCV
        Mat image = Cv2.ImRead("image.jpg");

        // Convert to Bitmap
        Bitmap bitmap = new Bitmap(image.Cols, image.Rows, (int)image.Step(), PixelFormat.Format24bppRgb, image.Data);

        // Save Bitmap to file
        bitmap.Save("output.bmp", ImageFormat.Bmp);
    }
}
在这个例子中,我们首先使用OpenCV库加载一张图像,然后使用Bitmap构造函数将其转换为Bitmap格式。最后,我们将Bitmap保存到文件中。

如果要加速这个过程,可以考虑使用SIMD指令集来优化图像数据的复制。具体而言,可以使用System.Runtime.Intrinsics.X86命名空间中的类来利用SSE、AVX和AVX2指令集进行加速。例如,可以使用以下代码来复制图像数据:

csharp
Copy code
using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86;

unsafe static void CopyData(byte* src, byte* dst, int count)
{
    // Use AVX2 to copy 32 bytes at a time
    int i = 0;
    if (Avx2.IsSupported)
    {
        nint simdSize = Vector256<byte>.Count;
        nint simdCount = count / simdSize;
        for (; i < simdCount; i++)
        {
            Vector256<byte> v = Avx.LoadVector256(src + i * simdSize);
            Avx.Store(dst + i * simdSize, v);
        }
    }

    // Copy remaining bytes one-by-one
    for (; i < count; i++)
    {
        dst[i] = src[i];
    }
}
使用SIMD指令集来复制图像数据可以显著提高转换速度。但需要注意的是,使用指令集加速需要了解底层硬件细节,并且可能会影响代码的可移植性和可读性。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-4-24 17:49 , Processed in 0.041718 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表