2011-08-11 55 views
3

我想从kmeans函数返回的数据创建聚簇图像。我尝试从OpenCV示例中以类似的方式提取数据,但这似乎对我造成了影响。经过一些进一步的研究后,我看到有人通过使用这些中心抽取了数据,但是没有对这些数据做任何事情,所以我的足迹在那里结束。从OpenCV中的kmeans数据创建聚簇图像

我已经包含了我的代码片段和我在下面做的事情。任何帮助将不胜感激。

编辑 我已经恢复了我的代码回到它的原始状态没有任何测试变量。上述错误仍然存​​在。我还加入约低于我图像一些调试信息:

的图像信息:

  • 尺寸:2
  • 图像数据:
  • 规格0:256
  • 尺寸1:256
  • Elemsize 1:12
  • Elemsize 2:4

虽然数据为NULL,但我仍然可以查看数据,如果我打电话给cv::imshow就可以了。

// mImage is a cv::Mat that was created from a 256 x 256 image with the depth of 
// CV_32F and 3 channels 
// labels is a cv::Mat that was created by converting the image into a 256 x 256 
// CV_8UC1 IplImage 
kmeans(mImage, 6, labels, termcrit, 3, cv::KMEANS_PP_CENTERS, centers); 
float* c = new float[6]; 
memcpy(c, centers.ptr<float>(0), sizeof(float)*6); 

// Block of code that crashes when I do "mImage.at<cv::Point2f>(i)" with the error: 
/* OpenCV Error: Assertion failed (dims <= 2 && data && (size.p[0] == 1 || 
     size.p[1] == 1) && (unsigned)i0 < (unsigned)(size.p[0] + size.p[1] - 1) && 
     elemSize() == (((((DataType<_Tp>::type) & ((512 - 1) << 3)) >> 3) + 1) << 
     ((((sizeof(size_t)/ 4+1)*16384|0x3a50) >> ((DataType<_Tp>::type) & 
     ((1 << 3) - 1))*2) & 3))) in unknown function, file 
     c:\opencv-2.3.0\modules\core\include\opencv2\core\mat.hpp, line 583 */ 

for(int i = 0; i < list.rows; i++) 
{ 
    int clusterIdx = list.at<int>(i); 
    cv::Point ipt = mImage.at<cv::Point2f>(i); 
    circle(miplImage, ipt, 2, colorTab[clusterIdx], CV_FILLED, CV_AA); 
} 

回答

1

您在调用mRegion.at()时收到断言错误。 mRegion在哪里定义?

下面是来自kmeans.cpp样本代码的等效片段:

kmeans(points, clusterCount, labels, 
      TermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0), 
      3, KMEANS_PP_CENTERS, centers); 

    img = Scalar::all(0); 

    for(i = 0; i < sampleCount; i++) 
    { 
     int clusterIdx = labels.at<int>(i); 
     Point ipt = points.at<Point2f>(i); 
     circle(img, ipt, 2, colorTab[clusterIdx], CV_FILLED, CV_AA); 
    } 

它使用相同的变量points两者的第一个参数kmeans并如for环源为ipt。我想你可能想在for循环中使用mImage,而不是mRegion。

编辑所以,现在你已经改变了在for循环中使用mImage的代码,你需要明白为什么你会得到断言错误。断言消息非常受模板代码杂乱所以这里是mat.hpp:

dims <= 2 && data && (size.p[0] == 1 || size.p[1] == 1) && 
      (unsigned)i0 < (unsigned)(size.p[0] + size.p[1] - 1) && 
      elemSize() == CV_ELEM_SIZE(DataType<_Tp>::type) 

一个或多个上述测试失败。如果你正在使用一个空的mImage,这将是一个失败,因为data将是零。您不能在空矩阵上调用at。在任何情况下,请检查mImage的属性以查看哪些导致断言错误。

+0

对不起,忽略了一些变量,因为我只是测试不同的技术,看看我能不能得到的东西。 mRegion只是一个空矩阵,其维度和类型为mImage。我尝试了mImage,并通过该错误,所以我尝试了一个空矩阵,并得到了相同的错误。 – Seb

+0

那么在那种情况下,我必须将我的256x256图像转换为65536x1的数组吗? – Seb

+0

不,256x256没问题。这就是dims <= 2'测试。你可能失败了,因为'data'是零或'i'大于点数。尝试在'for'循环之前添加'cout <<“data:”<< mImage.data << endl;'。 – SSteve