2015-09-28 2 views
0

Привет всем, я попытался использовать группировку kmeans для группировки объектов. Так что я могу использовать этот метод кластеризации для обнаружения объектов. Я получаю вывод, но проблема в том, что он слишком медленный {Как я могу это решить? }, и я получаю окно вывода, как показано в приведенной ниже ссылке. Вместо изображения отображаются три выходных изображения, как я могу это решить. Я не знаю, где именно лежит ошибка.Три изображения отображаются в окне вывода вместо одного

http://tinypic.com/view.php?pic=30bd7dc&s=8#.VgkSIPmqqko

#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include <iostream> 

using namespace cv; 

using namespace std; 

int main() 
{ 
    Mat src = imread("Light.jpg", 0); 
// imshow("fff",src); 
// cvtColor(src,src,COLOR_BGR2GRAY); 
    Mat dst; 
// pyrDown(src,src,Size(src.cols/2, src.rows/2),4); 
// src=dst; 
    resize(src,src,Size(128,128),0,0,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) = src.at<uchar>(y,x); 
    cout<<"aaa"<<endl; 
    int clusterCount = 15; 
    Mat labels; 
    int attempts = 2; 
    Mat centers; 
    cout<<"aaa"<<endl; 
    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()); 
    cout<<"aaa"<<endl; 
    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<uchar>(y,x) = 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); 
} 
+0

не может видеть изображение в ссылке. пожалуйста обновите. – UmNyobe

+0

Есть ли причина, по которой вы выбрали '(y + x * src.rows)' вместо '(y * src.cols + x)'? Порядок памяти - одна строка за другой. – Micka

+0

вы можете загрузить «Light.jpg»? – Micka

ответ

1

В вашем исходном коде вы должны изменить InterMedia Mat sample из 3 каналов на 1 канал при использовании черно-белых изображений.

Кроме того, если вы измените порядок памяти, это может быть быстрее (изменено (y*src.cols + x, 0) в обоих местах):

int main() 
{ 
    clock_t start = clock(); 

    Mat src = imread("Light.jpg", 0); 

    Mat dst; 
    resize(src,src,Size(128,128),0,0,1); 

    Mat samples(src.rows * src.cols, 1, CV_32F); 
    for(int y = 0; y < src.rows; y++) 
    for(int x = 0; x < src.cols; x++) 
     samples.at<float>(y*src.cols + x, 0) = src.at<uchar>(y,x); 

    int clusterCount = 15; 
    Mat labels; 
    int attempts = 2; 
    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*src.cols + x,0); 
     new_image.at<uchar>(y,x) = centers.at<float>(cluster_idx,0); 
    } 
    imshow("clustered image", new_image); 

    clock_t end = clock(); 
    std::cout << "time: " << (end - start)/(float)CLOCKS_PER_SEC << std::endl; 

    waitKey(0); 
} 
+0

Ну, это сработало, но я не уверен, действительно ли это быстрее. !! но все же есть задержка от 3 до 4 секунд даже после повторного захвата изображения. –

+0

Каков размер вашего исходного изображения? – Micka

+0

и на каком аппаратном обеспечении вы выполняете программу? – Micka

Смежные вопросы