C# 如何将矩阵转换为类型矩阵?
我用EmguCV做简单的图像处理。我想从阈值图像中删除小轮廓,因此我使用了ConnectedComponents SwithStats。下面是我的代码,我将任何小于最小尺寸的像素转换为黑色-基本上删除它。我想这样做的原因是能够在后面的部分中使用它,因为它与其他类型不兼容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();
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”异常是否提供了更详细的信息?