Как преобразовать cv :: Mat в 2d std :: vector без копирования данных - PullRequest
1 голос
/ 03 октября 2019

В OpenCV у меня есть объект cv :: Mat.

  1. Это один канал в формате CV_8UC1 = беззнаковый символ.

  2. Это непрерывный , что означает данныехранятся в одном месте и строки по строкам.

  3. Я знаю номера строк и столбцов объекта cv :: Mat.

  4. У меня есть 2D std :: vector размера вектора <вектор> vec1 (строки, вектор (img.cols));

Как я могу назначить данные объекта cv :: Mat дляstd :: vector без копирования .

Для копирования легко создать цикл for или, возможно, использовать vector :: assign с итератором.

Хранилищеданные одинаковы между cv :: Mat и 2D-std :: vector. Оба имеют внутренний указатель на данные (vector :: data и Mat :: ptr), но vector :: data не может быть установлен на значение Mat :: ptr.

В настоящее время у меня есть кодс копированием данных:

cv::Mat img = cv::imread("test.tif");
cv::cvtColor(img, img, cv::COLOR_BGR2GRAY);

vector< vector<double> > vec1(img.rows, vector<double>(img.cols));

for(int i=0; i < img.rows; ++i)
    for(int j=0; j < img.cols; ++j)
        vec1.at(i).at(j) = img.at<double>(i, j);

Спасибо.

1 Ответ

0 голосов
/ 03 октября 2019

Короткий ответ: вы не должны пытаться обмениваться данными между std::vector и cv::Mat, потому что оба берут на себя ответственность за данные, а cv::Mat могут делиться ими с другими cv::Mat объектами, и это станет довольно неуправляемым довольнобыстро.

Но cv::Mat может обмениваться данными с другим cv::Mat, и вы можете извлечь одну или несколько строк (или столбцов) и получить частичные общие данные с другим cv::Mat, например:

    cv::Mat img;
    //.. read the img

    //first row
    cv::Mat row0 = img(cv::Range(0,1), cv::Range(0,img.cols));

    //the 4'th column is shared
    cv::Mat column3 = img(cv::Range(0,img.rows), cv::Range(3,4));
    //you can set new data into column3/row0 and you'll see it's shared:
    //row0.setTo(0);
    //column3.setTo(0);

Теперь вы можете создать std::vector<cv::Mat>, где каждый циновка будет строкой в ​​исходном изображении (и будет делиться данными с исходным изображением), или использовать ее любым удобным для вас способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...