2013-10-30 44 views
1

我想使视频的所有帧的聚类我已经计算出hsv直方图但未能找到kmean聚类。我的代码在k mean命令中崩溃。任何人都可以告诉我我做错了什么。视频的所有帧的直方图的K均值聚类

#include "stdafx.h" 
#include "highgui.h" 

#include <stdio.h> 
#include <cv.h> 
#include <highgui.h> 
#include <stdio.h> 
#include <conio.h> 
#include <opencv2/imgproc/imgproc.hpp> // Gaussian Blur 
#include <opencv2/core/core.hpp>  // Basic OpenCV structures (cv::Mat, Scalar) 
#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 
#include <conio.h> 

using namespace cv; 
using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

cv::Mat centers; 
Mat src_base, hsv_base; 
cv::Mat labels; 
vector<Mat> histograms; 
string filename = "video.avi"; 
VideoCapture capture(filename); 

if(!capture.isOpened()) 
    exit(0); 

for(; ;) 
{ 
    capture >> src_base; 
    if(src_base.empty()) 
     break; 

    /// Convert to HSV 
    cvtColor(src_base, hsv_base, CV_BGR2HSV); 

    /// Using 16 bins for hue and 32 for saturation 
    int h_bins = 16; int s_bins = 8; 
    int histSize[] = { h_bins, s_bins }; 

    // hue varies from 0 to 256, saturation from 0 to 180 
    float h_ranges[] = { 0, 256 }; 
    float s_ranges[] = { 0, 180 }; 

    const float* ranges[] = { h_ranges, s_ranges }; 

    // Use the o-th and 1-st channels 
    int channels[] = { 0, 1 }; 

    /// Histograms 
    Mat hist_base; 

    /// Calculate the histograms for the HSV images 
    calcHist(&hsv_base, 1, channels, Mat(), hist_base, 2, histSize, ranges, true, false); 
    histograms.push_back(hist_base); 

} 
cv::kmeans(histograms, 8, labels,cv::TermCriteria(CV_TERMCRIT_ITER, 10, 1.0),3, cv::KMEANS_PP_CENTERS, centers); 
cout<<"code executed"<<endl; 

return 0; 
} 
+0

我正面临类似的问题,请分享如果哟你找到了解决方案。 – Luqman

回答

1

在OpenCV中的kmeans函数不接受的cv::Mat -s的载体。根据文档:

样本 - 输入样本的浮点矩阵,每个样本一行

你有你的数据转换成这种格式如:

int h_bins = 16; int s_bins = 8; 
Mat samples(histograms.size() , h_bins * s_bins , CV_32F); 
for(int k = 0; k < histograms.size() ; k++) 
    for(int y = 0; y < h_bins; y++) 
    for(int x = 0; x < s_bins ; x++) 
     samples.at<float>(k , y* s_bins + x) = histograms[k].at<float>(y,x); 

而且然后调用kmeans集群:

cv::kmeans(samples, ...);