Mat mat = Mat.Zeros(30, 30, DepthType.Cv8U, 1);
Rectangle rectangle = new Rectangle(1, 1, 10, 10);
CvInvoke.Rectangle(mat, rectangle, new MCvScalar(8), -1);
CvInvoke.Imshow("mat", mat.ToImage<Gray, byte>());
Image<Gray, byte> thresholdImg = new Image<Gray, byte>(mat.Width, mat.Height);
CvInvoke.Threshold(mat, thresholdImg, 5, 255, ThresholdType.Binary);
PrintMatrix(thresholdImg.Mat);//打印灰度
可以发现,上述灰度排列有问题
当把 Image<Gray, byte> thresholdImg = new Image<Gray, byte>(mat.Width, mat.Height);
改成如下代码时,灰度排列正常:
Mat thresholdImg = new Mat(mat.Height ,mat .Width,DepthType.Cv8U ,1 );
奇怪的是,不是每一次使用Image<Gray, byte> thresholdImg = new Image<Gray, byte>(mat.Width, mat.Height)这样的代码会有问题,有时候也不会有问题,对应不同的行和列的数值,有时候可以,有时候不可以,但是最好不要使用它,声明图像变量的时候使用Mat比较稳妥。
private void PrintMatrix(Mat mat)
{
for (int i = 0; i < mat.Rows; i++)
{
StringBuilder sb = new StringBuilder();
for (int j = 0; j < mat.Cols; j++)
{
sb.Append(mat.GetData().GetValue(i, j).ToString().PadLeft(3, '0'));
sb.Append(",");
}
Console.WriteLine(sb);
}
}