OpenCV запускает алгоритм kmeans на изображении - PullRequest
7 голосов
/ 10 августа 2011

Я пытаюсь запустить kmeans на 3-канальном цветном изображении, но каждый раз, когда я пытаюсь запустить функцию, происходит сбой со следующей ошибкой:

OpenCV Error: Assertion failed (data.dims <= 2 && type == CV_32F && K > 0) in unknown function, file ..\..\..\OpenCV-2.3.0\modules\core\src\matrix.cpp, line 2271

Я включил приведенный ниже код с некоторыми комментариями, чтобы помочь указать, что передаётся. Любая помощь очень ценится.

// Load in an image
// Depth: 8, Channels: 3
IplImage* iplImage = cvLoadImage("C:/TestImages/rainbox_box.jpg");

// Create a matrix to the image
cv::Mat mImage = cv::Mat(iplImage);

// Create a single channel image to create our labels needed
IplImage* iplLabels = cvCreateImage(cvGetSize(iplImage), iplImage->depth, 1);

// Convert the image to grayscale
cvCvtColor(iplImage, iplLabels, CV_RGB2GRAY);

// Create the matrix for the labels
cv::Mat mLabels = cv::Mat(iplLabels);

// Create the labels
int rows = mLabels.total();
int cols = 1;
cv::Mat list(rows, cols, mLabels .type());
uchar* src;
uchar* dest = list.ptr(0);
for(int i=0; i<mLabels.size().height; i++) 
{
    src = mLabels.ptr(i);
    memcpy(dest, src, mLabels.step);
    dest += mLabels.step;
}
list.convertTo(list, CV_32F);

// Run the algorithm
cv::Mat labellist(list.size(), CV_8UC1);
cv::Mat centers(6, 1, mImage.type());
cv::TermCriteria termcrit(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0);
kmeans(mImage, 6, labellist, termcrit, 3, cv::KMEANS_PP_CENTERS, centers);

1 Ответ

11 голосов
/ 10 августа 2011

Ошибка говорит все : Assertion failed (data.dims <= 2 && type == CV_32F && K > 0)

Это очень простые для понимания правила, функция будет работать, только если:

  • mImage.depth() является CV_32F

  • , если mImage.dims равно <= 2

  • , а если K > 0. В этом случае вы определяете K как 6 .

Из того, что вы заявили на вопрос, кажется, что:

IplImage* iplImage = cvLoadImage("C:/TestImages/rainbox_box.jpg");` 

загружает изображение как IPL_DEPTH_8U по умолчанию, а не IPL_DEPTH_32F. Это означает, что mImage также IPL_DEPTH_8U, поэтому ваш код не работает.

...