首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在EmguCV中将图像转换为矩阵,然后将矩阵转换为位图?

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

Stack Overflow用户
提问于 2018-11-05 18:06:55
回答 1查看 3.3K关注 0票数 1

我想做的事情如下:

代码语言:javascript
复制
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;
}
}

如何在Image中将Matrix转换为EmguCV?

如何将Matrix转换为Bitmap

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-07 03:03:03

Image转换为Matrix

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

NB:有三个相关维度-宽度、高度和通道计数.

代码语言:javascript
复制
Image<Bgr, byte> color = ... ; // Initialized in some manner

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

color.CopyTo(matrix);

NB: --由于必须复制整个数据数组,这种方法需要付出一定的代价。

Matrix转换为Bitmap

这个其实很简单。Matrix继承属性Mat,该属性返回数组数据的Mat头(意味着围绕现有数据数组的薄包装器)。因为这只是创建一个标题,所以它非常快(不涉及副本)。

NB:由于是一个标头,根据我使用C++ API的经验(尽管这似乎没有文档化),假设Mat对象是有效的,只要底层Matrix对象保持在作用域内。

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

代码语言:javascript
复制
Bitmap b = matrix.Mat.Bitmap;

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

代码语言:javascript
复制
matrix.CopyTo(color);

然后您可以使用Bitmap属性(fast,但需要使用Image实例,只要您使用Bitmap)。

代码语言:javascript
复制
Bitmap b = color.Bitmap;

另一种选择是使用ToBitmap方法,该方法复制数据,因此不携带对源Image实例的依赖。

代码语言:javascript
复制
Bitmap b = color.ToBitmap();

用于测试的来源:

代码语言:javascript
复制
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文件编译如下:

代码语言:javascript
复制
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"
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53159851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档