OpenCV在图像上运行kmeans算法

8

我正在尝试对一张三通道的彩色图像运行kmeans算法,但每次尝试执行该函数时,都会出现以下错误导致程序崩溃:

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

错误已经说得很清楚了: 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,这就是你的代码不起作用的原因。


这是否意味着我必须将其作为灰度图像加载? - Seb
不,它们并不相同。iplImage->depthiplImage->nChannels是两个不同的东西。您需要将iplImage转换为其IPL_DEPTH_32F等效项。就这样。请查看此答案以了解如何执行此操作:https://dev59.com/xljUa4cB1Zd3GeqPPj4m - 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, line 1177"。看起来我要么必须拆分通道,要么就得加载灰度图像。 - Seb
1
它崩溃是因为你假设iplImage的通道数为1。将其修复为cvCreateImage(cvGetSize(iplImage), IPL_DEPTH_32F, iplImage->nChannels); - karlphillip
太好了!我误解了“mImage.dims”,认为它只需要是1或2。非常感谢你。:D - Seb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接