C Opencv: Ошибка при печати Mat после присвоения значений

#c #opencv

#c #opencv

Вопрос:

Я объявил Mat и присваиваю значения каждому элементу, используя цикл for. Затем я хочу распечатать его значения. Однако у меня возникает ошибка дампа ядра. Мой код выглядит следующим образом:

 #include "opencv2/opencv.hpp"
#include <opencv2/core/core.hpp>
#include <iostream>
#include <time.h>

using namespace std;
using namespace cv;

int main(int argc, char const *argv[])
{
    int n = 4, i, j;
    srand (time(NULL));
    int n_Channel = 1;
    int mySizes[2] = {2, 4};
    Mat M = Mat::zeros(2, mySizes, CV_32FC(n_Channel));
    cout << M.rows << "," << M.cols << "," << M.channels() << endl;
    cout << M << endl;
    for (i = 0; i < M.rows;   i)
    {
        for (j = 0; j < M.cols;   j)
        {
            M.at<Vec3f>(i,j)[0] = rand() % n;
            cout << "i=" << i << ", j=" << j << ", M.at<Vec3f>(i,j)[0]=" << M.at<Vec3f>(i,j)[0] << endl;
        }
    }
    cout << "???????" << endl;
    cout << M << endl;

    return 0;
}
  

Cout работает до тех пор, пока не завершит печать «???????». Затем возникает ошибка дампа ядра. Сообщение на экране выглядит следующим образом:

 2,4,1
[0, 0, 0, 0;
 0, 0, 0, 0]
i=0, j=0, M.at<Vec3f>(i,j)[0]=3
i=0, j=1, M.at<Vec3f>(i,j)[0]=3
i=0, j=2, M.at<Vec3f>(i,j)[0]=3
i=0, j=3, M.at<Vec3f>(i,j)[0]=1
i=1, j=0, M.at<Vec3f>(i,j)[0]=3
i=1, j=1, M.at<Vec3f>(i,j)[0]=3
i=1, j=2, M.at<Vec3f>(i,j)[0]=0
i=1, j=3, M.at<Vec3f>(i,j)[0]=0
???????
*** Error in `./my_app': malloc(): memory corruption (fast): 0x000000000245dfb0 ***
======= Backtrace: =========
  

Что не так с моим кодом? Почему он сообщает об ошибке double free?

Спасибо, что помогли мне!

Комментарии:

1. Измените int n_Channel = 1 на const int n_Channel = 1 , а затем измените все M.at<Vec3f> на M.at<Vec<float, n_Channel>> . В вашем реальном примере есть только один канал, поэтому использование Vec3f неверно. Использование Vec<float, n_Channel> дает вам возможность обращаться к плавающим изображениям произвольного количества каналов. Но, следовательно, n_Channel должно быть const .

Ответ №1:

Первый комментарий решил мою проблему. Я просто копирую его комментарий сюда:

Измените int n_Channel = 1 на const int n_Channel = 1, а затем измените все M.at для M.at >. В вашем реальном примере есть только один канал, поэтому использование Vec3f неверно. Использование Vec дает вам возможность обращаться к плавающим изображениям произвольного количества каналов. Но, следовательно, n_Channel должен быть постоянным.

Спасибо @HansHirse .