Поведение копирования cv::Mat
меня сбивает с толку.
Я понимаю из документации, что Mat::copyTo()
является глубокой копией, в то время как оператор присваивания не является. Мои вопросы:
-
что мне делать, чтобы вернуть
cv::Mat
из функции, например:cv::Mat func()
? -
В соответствии с документацией, если я верну его
cv::Mat
, это будет бесполезно, потому что после возвращения функции локальная копияcv::Mat
в этой функции будет уничтожена и, следовательно, возвращаемое значение вне функции должно указывать на некоторый случайный адрес. Странно то, что (в большинстве случаев) он работает правильно. Например, следующие работы:cv::Mat CopyOneImage(const cv::Mat& orgImage) { cv::Mat image; orgImage.copyTo(image); return image; } int main() { std::string orgImgName("a.jpg"); cv::Mat orgImage; orgImage = cv::imread(orgImgName); cv::Mat aCopy; aCopy = CopyOneImage(orgImage); return 1; }
Но почему? Это не глубокая копия.
Вопрос 3. А также иногда оператор присваивания тоже выглядит очень грубо:
int main()
{
std::string orgImgName("a.jpg");
cv::Mat orgImage;
orgImage = cv::imread(orgImgName);
cv::Mat aCopy;
orgImage.copyTo(aCopy);
cv::Mat copyCopy1;
copyCopy1 = aCopy;
cv::namedWindow("smallTest", 1);
cv::imshow("smallTest", copyCopy1);
uchar key = (uchar)cv::waitKey();
cv::Mat orgImage2 = cv::imread("b.jpg");
orgImage2.copyTo(aCopy);
cv::imshow("smallTest", copyCopy1);
return 1;
}
Затем на двух дисплеях отображается одинаковое изображение, a.jpg. Зачем? И еще несколько раз это не работает. (Исходный код слишком длинный, но он также может быть упрощен в приведенном выше случае). В те времена оператор присваивания, по-видимому, фактически является "мелким" копированием. Зачем?
Спасибо большое!