go4*_*sri 6 opencv cluster-analysis k-means
这个问题特定于opencv:opencv文档中给出的kmeans示例有一个双通道矩阵 - 特征向量的每个维度都有一个通道.但是,其他一些例子似乎表明它应该是一个单通道矩阵,沿着列有特征,每个样本有一行.哪个是对的?
如果我有一个5维特征向量,我应该使用的输入矩阵:这一个:
cv::Mat inputSamples(numSamples, 1, CV32FC(numFeatures))
Run Code Online (Sandbox Code Playgroud)
或者这个:
cv::Mat inputSamples(numSamples, numFeatures, CV_32F)
Run Code Online (Sandbox Code Playgroud)
sie*_*hie 30
正确的答案是cv::Mat inputSamples(numSamples, numFeatures, CV_32F)
.OpenCV文档kmeans
说:
samples - 输入样本的浮点矩阵,每个样本一行
所以它不是n维浮点数的浮点向量,就像在另一个选项中一样.哪个例子表明这样的行为?
这也是我的一个小例子,展示了如何使用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 );
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
28442 次 |
最近记录: |