0

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などの「解決策」を試しましたが、トラブルが発生し続けます。

4

1 に答える 1

0

通常、このエラーは、無効な場所でメモリにアクセスしようとすると発生します。コードには、問題の原因となる 2 つの問題があります。

まずres、 withの要素にアクセスしますcv::Vec3b。これは 3 チャネルのイメージを意味しますが、単一チャネルとして初期化します。初期化を次のように変更します。

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

次に、行インデックスと列インデックスで.at<>(i, j)要素にアクセスします。ただし、 yourとindex はそれぞれ列と行を参照します。反復制限を交換する必要があります。ijij

for (int i = 0; i < height; i++) {
    for (int j = 0; j < width; j++) {
// ...
于 2013-07-25T00:18:27.220 に答える