2011-08-10 75 views
7

我想运行一个3通道彩色图像K均值的算法,但每次我尝试运行它似乎并出现以下错误崩溃的作用时间:OpenCV的运行K均值图像

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); 

回答

11

错误说,所有Assertion failed (data.dims <= 2 && type == CV_32F && K > 0)

这些都是很简单的规则,了解,该功能将工作仅当:

  • mImage.depth()CV_32F

  • 如果mImage.dims<= 2

  • 并且如果K > 0。在这种情况下,您将K定义为。

从你的问题说,好像是:

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

被载入图像IPL_DEPTH_8U默认情况下,不IPL_DEPTH_32F。这意味着mImage也是IPL_DEPTH_8U,这就是为什么你的代码不工作。

+0

那么这是否意味着我必须将其作为灰度图像加载? – Seb

+0

不,它没有。 'iplImage-> depth'和'iplImage-> nChannels'是两回事。您需要将iplImage转换为IPL_DEPTH_32F等价物。就这样。检查这个答案如何做到这一点:http://stackoverflow.com/questions/6349493/opencv-iplimage-data-to-float – karlphillip

+0

我只是尝试了转换功能,它崩溃在我身上。 “IplImage * ipl32Image = cvCreateImage(cvGetSize(iplImage),IPL_DEPTH_32F,1); cvConvert(iplImage,ipl32Image);”错误“OpenCV Error:Assertion failed(src.size == dst.size && src.channels()== dst.ch annels())in unknown function,file .. \ .. \ .. \ OpenCV-2.3 .0 \ modules \ core \ src \ convert.cpp,第1177行“。看起来,我必须要分开通道,否则我将不得不加载灰度图像 – Seb