C++ 如何在kmeans之后显示群集图像?
我想使用一个数组作为k均值算法的输入,该数组具有x和y方向的位移值,是Lucas Kanade光流估计的结果。代码如下: 编辑:C++ 如何在kmeans之后显示群集图像?,c++,opencv,type-conversion,k-means,C++,Opencv,Type Conversion,K Means,我想使用一个数组作为k均值算法的输入,该数组具有x和y方向的位移值,是Lucas Kanade光流估计的结果。代码如下: 编辑: int number_of_features=150; // Lucas Kanade optical flow cvCalcOpticalFlowPyrLK(frame1_1C,frame2_1C,pyramid1,pyramid2,frame1_features,frame2_features,number_of_features,optical_flow_wi
int number_of_features=150;
// Lucas Kanade optical flow
cvCalcOpticalFlowPyrLK(frame1_1C,frame2_1C,pyramid1,pyramid2,frame1_features,frame2_features,number_of_features,optical_flow_window, 5,optical_flow_found_feature, optical_flow_feature_error,optical_flow_termination_criteria, 0 );
float Dx[150],Dy[150]; // displacement matrices
float Dis[150][2]; // total displacement matrix
int K=2; // clusters selected
Mat bestLabels, centers;
for(int i = 0; i < number_of_features; i++)
{
CvPoint p,q;
p.x = (int) frame1_features[i].x;
p.y = (int) frame1_features[i].y;
q.x = (int) frame2_features[i].x;
q.y = (int) frame2_features[i].y;
//displacements
Dx[i]=p.x-q.x;
Dy[i]=p.y-q.y;
Dis[i][0] = Dx[i];
Dis[i][1] = Dy[i];
}
// k means algorithm
// Creating Mat for Input data
cv::Mat flt_Dis(150, 2, CV_32F, Dis);
cv::kmeans(flt_Dis, K, bestLabels,TermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0),3, KMEANS_PP_CENTERS, centers);
int number_of_features=150;
//卢卡斯-卡纳德光流
cvCalcOpticalFlowPyrLK(frame1_1C,frame2_1C,pyramid1,pyramid2,frame1_特征,frame2_特征,数量_特征,光流窗口,5,光流发现_特征,光流特征错误,光流终止_标准,0);
浮点数Dx[150],Dy[150];//位移矩阵
浮点数[150][2];//总位移矩阵
int K=2;//选定的群集
垫子、标签、中心;
对于(int i=0;i<特征的数量;i++)
{
cvp点,q;
p、 x=(int)frame1_特征[i].x;
p、 y=(int)frame1_特征[i].y;
q、 x=(int)frame2_特征[i].x;
q、 y=(int)frame2_特征[i].y;
//位移
Dx[i]=p.x-q.x;
Dy[i]=p.y-q.y;
Dis[i][0]=Dx[i];
Dis[i][1]=Dy[i];
}
//k均值算法
//为输入数据创建Mat
cv::Mat flt_Dis(150,2,cv_32F,Dis);
cv::kmeans(flt_Dis,K,最佳标签,术语标准(cv_TERMCRIT_EPS+cv_TERMCRIT_ITER,10,1.0),3,kmeans_PP_中心,中心);
我已经解决了以前的问题,现在我想显示集群图像。我猜bestLabels存储每个元素的索引,例如,如果它被分类为第0类或第1类。我说的对吗??如何显示群集图像 K-means可用于处理整数。你必须这么做
但结果将不是整数。K-means可用于处理整数。你必须这么做
但结果将不是整数。如果您希望得到帮助,请花更多时间格式化代码并提供有关问题的所有信息。什么是
cv::kmeans
<代码>cvCalcOpticalFlowPyrLK?我认为有图像处理经验的人可以理解。cv::kmeans是kmeans算法,cvCalcOpticalFlowPyrLK是使用Lucas Kanade方法估计稀疏点集光流的函数。不,你不能。只需使用“matrix.convertTo(flt_matrix,CV_32F)”将矩阵转换为浮点类型,然后使用它,我不确定它是否有效。。我试过这个:cv::Mat flt_Dis(150,2,cv_32F,Dis);不,您需要转换如果您想得到帮助,请花更多时间格式化代码并提供有关您的问题的所有信息。什么是cv::kmeans
<代码>cvCalcOpticalFlowPyrLK?我认为有图像处理经验的人可以理解。cv::kmeans是kmeans算法,cvCalcOpticalFlowPyrLK是使用Lucas Kanade方法估计稀疏点集光流的函数。不,你不能。只需使用“matrix.convertTo(flt_matrix,CV_32F)”将矩阵转换为浮点类型,然后使用它,我不确定它是否有效。。我试过这个:cv::Mat flt_Dis(150,2,cv_32F,Dis);不,您需要ConvertTo您的意思是像上面建议的那样吗?不,注释中的建议是将数据转换为float,然后运行cv::kmeans。我的建议是编写yourown::integerkmeans
。请解释一下上面的代码中出现了什么问题?您有一个整数矩阵,但函数需要一个浮点矩阵。因此,这是一个错误。你的意思是像上面建议的那样吗?不,注释中的建议是将数据转换为float,然后运行cv::kmeans。我的建议是编写yourown::integerkmeans
。请解释一下上面的代码中出现了什么问题?您有一个整数矩阵,但函数需要一个浮点矩阵。因此,这是一个错误。