gpt4 book ai didi

opencv - opencv kmeans 聚类的输入矩阵

转载 作者:太空宇宙 更新时间:2023-11-03 20:47:17 24 4
gpt4 key购买 nike

这个问题是opencv特有的:opencv 文档中给出的 kmeans 示例有一个 2 channel 矩阵 - 一个 channel 用于特征向量的每个维度。但是,其他一些示例似乎说它应该是一个单 channel 矩阵,其特征沿列,每个样本一行。哪一个是正确的?

如果我有一个 5 维特征向量,我使用的输入矩阵应该是什么:这个:

cv::Mat inputSamples(numSamples, 1, CV32FC(numFeatures))

或者这个:

cv::Mat inputSamples(numSamples, numFeatures, CV_32F)

最佳答案

正确答案是 cv::Mat inputSamples(numSamples, numFeatures, CV_32F)。关于 kmeans 的 OpenCV 文档 says :

samples – Floating-point matrix of input samples, one row per sample

所以它不是另一个选项中的 n 维 float 的浮点向量。哪些例子表明了这种行为?

这也是我的一个小例子,展示了如何使用 kmeans。它对图像的像素进行聚类并显示结果:

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main( int argc, char** argv )
{
Mat src = imread( argv[1], 1 );
Mat samples(src.rows * src.cols, 3, CV_32F);
for( int y = 0; y < src.rows; y++ )
for( int x = 0; x < src.cols; x++ )
for( int z = 0; z < 3; z++)
samples.at<float>(y + x*src.rows, z) = src.at<Vec3b>(y,x)[z];


int clusterCount = 15;
Mat labels;
int attempts = 5;
Mat centers;
kmeans(samples, clusterCount, labels, TermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 10000, 0.0001), attempts, KMEANS_PP_CENTERS, centers );


Mat new_image( src.size(), src.type() );
for( int y = 0; y < src.rows; y++ )
for( int x = 0; x < src.cols; x++ )
{
int cluster_idx = labels.at<int>(y + x*src.rows,0);
new_image.at<Vec3b>(y,x)[0] = centers.at<float>(cluster_idx, 0);
new_image.at<Vec3b>(y,x)[1] = centers.at<float>(cluster_idx, 1);
new_image.at<Vec3b>(y,x)[2] = centers.at<float>(cluster_idx, 2);
}
imshow( "clustered image", new_image );
waitKey( 0 );
}

关于opencv - opencv kmeans 聚类的输入矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10240912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com