c# - 如何在 EmguCV 中将图像转换为矩阵,然后将矩阵转换为位图?

标签 c# opencv emgucv

我正在尝试执行以下操作:

public partial class Form1 : Form
{
const string path = @"lena.png";

public Form1()
{
    InitializeComponent();

    Image<Bgr, byte> color = new Image<Bgr, byte>(path);

    Matrix<byte> matrix = new Matrix<byte>(color.Rows, color.Cols);

    matrix.Data = color.ToMatrix();// just an analogy

    pictureBox1.Image = col.Bitmap;
    pictureBox2.Image = gray.Bitmap;
}
}

如何在 EmguCV 中将 Image 转换为 Matrix

如何将 Matrix 转换为 Bitmap

最佳答案

图像转换为矩阵

这里需要注意的重要一点是 ImageMatrix继承自 CvArray .这意味着可以使用(继承的)方法 CopyTo将数据从 Image 实例复制到具有相同深度和维度的 Matrix 实例。

注意:相关性有 3 个维度——宽度、高度和 channel 数。

Image<Bgr, byte> color = ... ; // Initialized in some manner

Matrix<byte> matrix = new Matrix<byte>(color.Rows, color.Cols, color.NumberOfChannels);

color.CopyTo(matrix);

注意:由于需要复制整个数据阵列,因此这种方法会产生成本。

矩阵转换为位图

这个其实很简单。 Matrix 继承属性 Mat ,它返回一个 Mat数组数据的 header (意思是围绕现有数据数组的薄包装)。由于这只是创建一个 header ,因此速度非常快(不涉及副本)。

注意:由于是 header ,根据我使用 C++ API 的经验(即使这似乎没有记录),我假设 Mat 对象是只要基础 Matrix 对象保持在范围内就有效。

Mat 提供了一个 Bitmap属性,其行为与 Image.Bitmap 相同.

Bitmap b = matrix.Mat.Bitmap;

另一种选择是使用与以前相同的方法将数据复制回 Image 实例。

matrix.CopyTo(color);

然后您可以使用 Bitmap 属性(速度很快,但只要您使用 Bitmap,就需要 Image 实例存在)。

Bitmap b = color.Bitmap;

另一种选择是使用 ToBitmap方法,它复制数据,因此不依赖于源 Image 实例。

Bitmap b = color.ToBitmap();

用于测试的来源:

using System;
using System.Drawing;
using Emgu.CV;
using Emgu.CV.Structure;
// ============================================================================
namespace CS1 {
// ============================================================================
class Test
{
    static void Main()
    {
        Image<Bgr, byte> color = new Image<Bgr, byte>(2, 2);
        for (int r = 0; r < color.Rows; r++) {
            for (int c = 0; c < color.Cols; c++) {
                int n = (c + r * color.Cols) * 3;
                color[r, c] = new Bgr(n, n+1, n+2);
            }
        }

        Matrix<byte> matrix = new Matrix<byte>(color.Rows, color.Cols, color.NumberOfChannels);

        color.CopyTo(matrix);

        Bitmap b = matrix.Mat.Bitmap;

        matrix.CopyTo(color);

        b = color.Bitmap;

        b = color.ToBitmap();
    }
}
// ============================================================================
} // namespace CS1
// ============================================================================

我用来生成编译解决方案的 CMake 文件:

cmake_minimum_required(VERSION 3.11)
project(CS1 VERSION 0.1.0 LANGUAGES CSharp)

add_executable(cs1
    src/test.cs
)

set_property(TARGET cs1
    PROPERTY VS_DOTNET_TARGET_FRAMEWORK_VERSION "v4.6.1"
)

set_property(TARGET cs1 
    PROPERTY VS_DOTNET_REFERENCES
    "System"
    "System.Drawing"
)

set_target_properties(cs1 PROPERTIES 
    VS_DOTNET_REFERENCE_emgu_cv_world "deps/Emgu.CV.World.dll"
)

关于c# - 如何在 EmguCV 中将图像转换为矩阵,然后将矩阵转换为位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53159851/

相关文章:

C# 服务引用 Java -> C#

python-3.x - 使用 Cmake 编译 OpenCV 以将其集成到 Conda 环境中

opencv - SVM参数调整

c# - EmguCV 3.0 中的 CvInvoke.ConvexityDefects()

c# - 如何创建直方图

c# - WPF 忽略 d :IsHidden ="True" in run mode (OK in design mode)

c# - 在 VSTO PowerPoint 中创建 map 图表

C# Switch If 条件来扩展 switch case

c++ - 如何让一个函数同时运行多次?

python-3.x - 使用 opencv 编写视频但输出文件无法播放