2013-10-30 71 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, ...);