c – 使用一维输入的OpenCV cv :: kmeans()

c – 使用一维输入的OpenCV cv :: kmeans(),第1张

概述虽然 python tutorial使用一维数据,但我不能对C接口做同样的事情: int size=100;std::vector<float> data(size);for (size_t i = 0; i < size ; i++){ data[i] = (float)i; //placeholder}std::vector<int> labels;std::vector< 虽然 python tutorial使用一维数据,但我不能对C接口做同样的事情:

int size=100;std::vector<float> data(size);for (size_t i = 0; i < size ; i++){    data[i] = (float)i; //placeholder}std::vector<int> labels;std::vector<float> centers;cv::kmeans(data,3,labels,cv::TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,10,0.1),cv::KMEANS_PP_CENTERS,centers);

由于cv :: kmeans期望输入是二维的,因此内部断言失败. CV_Assert(N> = K)失败,因为K是3而N是1.我的错误是什么?

解决方法 编辑:

我刚检查了一下,它的内容如下:

//...bool isrow = data.rows == 1 && data.channels() > 1; // MORE THAN ONE CHANNELint N = !isrow ? data.rows : data.cols; //...//...CV_Assert( N >= K );

因此,如果您将数据放在一行中,则需要在输入矩阵中包含多个通道,并且列数多于K.

一个快速的解决方法:在调用kmeans之前,你的矩阵是reshape

它不会复制任何数据,只是更改矩阵的尺寸.所以如果你有:

[12345678] // mat 1 x 8

重塑2行后:

[1234| // a mat 2 x 4|5678]

你应该能够打电话给kmeans. (不要忘记重塑)

总结

以上是内存溢出为你收集整理的c – 使用一维输入的OpenCV cv :: kmeans()全部内容,希望文章能够帮你解决c – 使用一维输入的OpenCV cv :: kmeans()所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1216187.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存