我使用OpenCVSharp(OpenCvSharp3-AnyCPU版本3.0.0.20150823在Visual Studio 2015中运行并通过NuGet安装)从C#访问OpenCV,但在调用Cv2.PCACompute
时,我得到了一个通用 OpenCVException 声明我有一个不支持的输入和输出数组格式组合。
我的目标是使用PCA查找像素blob的主轴。这是我目前的(剥离)代码:
using OpenCvSharp;
public struct point2D
{
public int X;
public int Y;
public point2D(int X, int Y)
{
this.X = X;
this.Y = Y;
}
}
public static void PCA2D()
{
int height = 5;
int width = 5;
int[] image = new int[]
{
0,0,0,0,1,
0,0,0,1,0,
0,0,1,0,0,
0,1,0,0,0,
1,0,0,0,0,
}
// extract the datapoints
List<point2D> dataPoints = new List<point2D>();
for (int row = 0; row < height; ++row)
{
for (int col = 0; col < width; ++col)
{
if (image[row * width + col] == 1)
{
dataPoints.Add(new point2D(col, row));
}
}
}
// create the input matrix
Mat input = new Mat(dataPoints.Length, 2, MatType.CV_32SC1);
for (int i = 0; i < dataPoints.Length; ++i)
{
input.Set(i, 0, dataPoints[i].X);
input.Set(i, 1, dataPoints[i].Y);
}
Mat mean = new Mat();
Mat eigenvectors = new Mat();
// OpenCVException occurs here: unsupported combination of input and output array formats
Cv2.PCACompute(input, mean, eigenvectors);
// Code to get orientation from the eigenvectors
}
我还没有找到关于如何初始化均值和特征向量Mats的文档,或者我调用PCACompute的方式是否正确。对使用PCACompute的正确程序有一些了解会非常有帮助。
答案 0 :(得分:1)
事实证明dataPoints
不能是MatType.CV_32SC1
。将代码更改为以下代码可以使其工作:
// create the input matrix
Mat input = new Mat(dataPoints.Length, 2, MatType.CV_32FC1);
for (int i = 0; i < dataPoints.Length; ++i)
{
input.Set(i, 0, (float)dataPoints[i].X);
input.Set(i, 1, (float)dataPoints[i].Y);
}