2011-08-10 74 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