我一直致力于MNIST数据集对手写数字图像进行分类。我可以读取图像并计算它们的直方图。然后,我将直方图的Mat推回向量。我无法实现K-Means聚类算法方法(kmeans())因为方法的第一个参数(InputArray)导致了一些错误
已使用OpenCV 3.0。
vector<Mat> histogram_list;
//some implementations
int clusterCount = 10;
Mat labels, centers;
int attempts = 5;
kmeans(samplingHist(histogram_list, h_bins, s_bins), clusterCount, labels,
TermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 10000, 0.0001),
attempts, KMEANS_PP_CENTERS, centers);
有什么建议可以解决这个问题吗?
编辑:
mat.int.hpp文件。关于断言的错误失败了......它让我回到那段代码。
template<typename _Tp> inline_Tp& Mat::at(int i0, int i1) {
CV_DbgAssert(dims <= 2);
CV_DbgAssert(data);
CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
CV_DbgAssert((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels()));
CV_DbgAssert(CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1());
return ((_Tp*)(data + step.p[0] * i0))[i1];
}
我尝试从向量中采样Mat来解决问题。然而,它无法帮助解决它。我在哪里犯错?
Mat samplingHist(vector<Mat> &vec, int h, int s) {
Mat samples(vec.size(), h * s, CV_32F);
for (int k = 0; k < vec.size(); k++)
for (int y = 0; y < h; y++)
for (int x = 0; x < s; x++)
samples.at<float>(k, y* s + x) = vec[k].at<float>(y, x);
return samples;
}
答案 0 :(得分:0)
您传递了错误的参数。说InputArray data
的文档必须是Mat
或至少std::vector<cv::Point2f>
,而不是std::vector<Mat>
。
看看这个例子: http://docs.opencv.org/3.1.0/de/d63/kmeans_8cpp-example.html