C# 如何将矩阵转换为类型矩阵?

C# 如何将矩阵转换为类型矩阵?,c#,matrix,mat,emgucv,C#,Matrix,Mat,Emgucv,我用EmguCV做简单的图像处理。我想从阈值图像中删除小轮廓,因此我使用了ConnectedComponents SwithStats。下面是我的代码,我将任何小于最小尺寸的像素转换为黑色-基本上删除它。我想这样做的原因是能够在后面的部分中使用它,因为它与其他类型不兼容 public Mat Filtered(Mat in_img, string currentDir) { Mat gray_res = new Mat(); Mat labels = new Mat();

我用EmguCV做简单的图像处理。我想从阈值图像中删除小轮廓,因此我使用了ConnectedComponents SwithStats。下面是我的代码,我将任何小于最小尺寸的像素转换为黑色-基本上删除它。我想这样做的原因是能够在后面的部分中使用它,因为它与其他类型不兼容

public Mat Filtered(Mat in_img, string currentDir)
{
    Mat gray_res = new Mat();
    Mat labels = new Mat();
    Mat stats = new Mat();
    Mat centroids = new Mat();

    CvInvoke.CvtColor(in_img, gray_res, ColorConversion.Bgr2Gray);

    var nlabels = CvInvoke.ConnectedComponentsWithStats(gray_res, labels, stats, centroids, LineType.EightConnected);

    int min_size = 250;

    int[] sizes = new int[nlabels];

    for (int s = 1; s < nlabels; s++)
    {
        sizes[s] = BitConverter.ToInt32(stats.GetData(s, (int)ConnectedComponentsTypes.Area), 0);
    }

    Matrix<double> fltr_img = new Matrix<double>(labels.Rows, labels.Cols);
    fltr_img.SetValue(0);

    for (int i = 1; i < nlabels; i++)
    {
        int j = BitConverter.ToInt32(stats.GetData(i, (int)ConnectedComponentsTypes.Left), 0); //left most
        int w = BitConverter.ToInt32(stats.GetData(i, (int)ConnectedComponentsTypes.Width), 0); //run width
        int k = BitConverter.ToInt32(stats.GetData(i, (int)ConnectedComponentsTypes.Top), 0); //top most
        int h = BitConverter.ToInt32(stats.GetData(i, (int)ConnectedComponentsTypes.Height), 0); //run height

        if (sizes[i] < min_size)
        {
            for (int a = k; a < k + h; a++)
            {
                for (int b = j; b < j + w; b++)
                {
                    fltr_img.Data[a, b] = 255;
                }
            }
        }
    }

    //Covnert 2D Matrix to Image
    CvInvoke.Imwrite(currentDir + "filter.jpg", fltr_img);

    Mat subtrahend = CvInvoke.Imread(currentDir + "filter.jpg");

    Mat fnl_img = new Mat();

    CvInvoke.Subtract(in_img, subtrahend, fnl_img);

    return fnl_img;
}
public Mat Filtered(Mat in_img,string currentDir)
{
Mat gray_res=新Mat();
材料标签=新材料();
Mat stats=新Mat();
垫质心=新垫();
CvInvoke.CvtColor(in_img,gray_res,ColorConversion.Bgr2Gray);
var nlabels=CvInvoke.ConnectedComponentsWithStats(灰色、标签、统计、质心、线型.八个已连接);
int min_size=250;
int[]大小=新的int[nlabels];
for(int s=1;s

最后,我做了一个肮脏的小把戏,将遮罩转换为兼容类型Mat,即原始图像。有了这段代码,我得到了我的结果,但我仍然为它烦恼。

您可以使用矩阵的Mat属性来转换矩阵类型。我不知道您需要什么类型,所以我在示例中使用了DepthType.Cv8U

Mat converted = new Mat();
fltr_img.Mat.ConvertTo(converted, DepthType.Cv8U);
Mat fnl_img = new Mat();
CvInvoke.Subtract(in_img, converted, fnl_img);
或者,也可以将Mat和/或矩阵与减法结合使用。两者都实现了IInpurary接口

CvInvoke.Subtract(in_img,  fltr_img, fnl_img); //Tested with EmguCv 3.4.1

它不起作用。我想要的是将矩阵格式(我用来创建过滤器,如上面的for循环所示)转换成与Mat格式(我用来加载图像)兼容的格式,这样我就可以使用EmguCV subtract来获得所需的结果。Matrix和Mat都可以在CvInvoke.subtract中使用(IInputArray src1、IInputArray src2、IOutputArray dst)没有编译错误,因为两者都实现了IInputArray接口。我用EmguCV 3.4.1对其进行了测试。所以我不明白为什么在我使用代码时必须将矩阵转换为Mat。它引发此异常-->引发异常:Emgu.CV.World.dll中的“Emgu.CV.Util.CvException”异常是否提供了更详细的信息?