Opencv - 从其他矩阵创建矩阵时出错(malloc.c:2451:sYSMALLOc:Assertion)

时间:2013-07-24 10:27:00

标签: opencv malloc mat

我是通过跳过原始图片的像素来创建一个新的Mat,但是我收到了这个错误:

PRM algorithm: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.

我的代码是:

int width = round(img.cols / M);
int height = round(img.rows / M);

cv::Mat res(height, width, CV_8U);

for (int i = 0; i < width; i++) {
    for (int j = 0; j < height; j++) {
        res.at<cv::Vec3b>(i, j)[0] = img.at<cv::Vec3b>(i * M, j * M)[0];
        res.at<cv::Vec3b>(i, j)[1] = img.at<cv::Vec3b>(i * M, j * M)[1];
        res.at<cv::Vec3b>(i, j)[2] = img.at<cv::Vec3b>(i * M, j * M)[2];
    }
}

return res;

我也尝试过使用uchar* ptr = img.ptr<uchar>(i)ptr[j],因此可以直接访问数据,但收到同样的错误。

我正在搜索,并尝试了一些“解决方案”,例如sYSMALLOc: Assertion Failed error in opencv,但麻烦一直在出现。

1 个答案:

答案 0 :(得分:0)

通常,当您尝试访问无效位置的内存时会发生此错误。您的代码有两个导致问题的问题。

首先,您可以使用res访问cv::Vec3b的元素,这意味着三通道图像,但您将其初始化为单通道。将初始化更改为:

cv::Mat res(height, width, CV_8UC3);    // Needs to be three channels!

第二次.at<>(i, j)按行索引i和列索引j访问元素。但是,您的ij索引分别指向列和行。您的迭代限制应该交换:

for (int i = 0; i < height; i++) {
    for (int j = 0; j < width; j++) {
// ...