gpt4 book ai didi

在 OpenCV 中从 kmeans 数据创建聚类图像

转载 作者:太空宇宙 更新时间:2023-11-03 21:12:41 26 4
gpt4 key购买 nike

我正在尝试根据 kmeans 函数返回的数据创建聚类图像。我尝试以类似的方式从 OpenCV 示例中提取数据,但这似乎让我崩溃了。经过一些进一步的研究,我发现有人通过使用这些中心提取了数据,但没有对这些数据进行任何处理,所以我的踪迹到此为止。

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

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

图片信息:

  • 尺寸:2
  • 图像数据:
  • 尺寸 0:256
  • 尺寸 1:256
  • 元素大小 1: 12
  • 元素大小 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 );
}

最佳答案

您在调用 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 将为 nil。您不能在空矩阵上调用 at。在任何情况下,检查 mImage 的属性以查看导致断言错误的原因。

关于在 OpenCV 中从 kmeans 数据创建聚类图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7026057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com