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);
那么这是否意味着我必须将其作为灰度图像加载? – Seb
不,它没有。 'iplImage-> depth'和'iplImage-> nChannels'是两回事。您需要将iplImage转换为IPL_DEPTH_32F等价物。就这样。检查这个答案如何做到这一点:http://stackoverflow.com/questions/6349493/opencv-iplimage-data-to-float – karlphillip
我只是尝试了转换功能,它崩溃在我身上。 “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