Конструктор копирования cv :: Mat не копирует базовые данные - PullRequest
0 голосов
/ 04 апреля 2020

Этот фрагмент кода:

double a[]{1, 2, 3, 4};
cv::Mat m{cv::Mat{2, 2, CV_64F, &a[0]}};
a[1] = 9;
std::cout << m.at<double>(1)

печатает 9, несмотря на то, что на странице 76 книги "Learning OpenCV 3" размещено cv::Mat(const Mat& mat) конструктор копирования в "Таблица 4-2. Cv :: Mat конструкторы, которые скопировать данные из другого cv :: Mats ". Я неправильно читаю?

Я знаю, что cv::Mat m{cv::Mat{2, 2, CV_64F, &a[0]}.clone()}; сделает копию a и напечатает 2.

1 Ответ

1 голос
/ 04 апреля 2020

Используемый вами конструктор документирован здесь: Документы OpenCV .

Когда вы создаете свое значение m

cv::Mat m{cv::Mat{2, 2, CV_64F, &a[0]}};

, вы вызываете конструктор копирования cv :: Mat, но копируемый экземпляр (ваше временное значение) фактически никогда не владел данными; он просто держит указатель. Таким образом, ваша новая матрица m будет содержать тот же указатель на a.

TL; DR вы используете неразмещающий конструктор для вашего временного.

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