【问题标题】:OpenCV Mat data address shows weird valueOpenCV Mat 数据地址显示奇怪的值
【发布时间】:2022-08-18 18:18:37
【问题描述】:

由于意外的结果,我使用 OpenCV Mat 很痛苦。

有一个示例代码:

cv::Mat local_mat = cv::Mat::eye(cv::Size(1000, 1000), CV_8UC1);
qDebug() << \"1. local_mat.data: \" << local_mat.data;

cv::Mat sobel_img_ = cv::Mat::eye(cv::Size(1000, 1000), CV_8UC1);
qDebug() << \"2. sobel_img_.data: \" << sobel_img_.data;

sobel_img_ = local_mat; // copy address but no clone()
qDebug() << \"3. sobel_img_.data: \" << sobel_img_.data;

sobel_img_ = cv::Mat::eye(cv::Size(1000, 1000), CV_8UC1); // renew
qDebug() << \"4. sobel_img_.data: \" << sobel_img_.data;
  1. local_mat.data: 0x55aa19a53e40
  2. sobel_img_.data: 0x55aa19b480c0
  3. sobel_img_.data: 0x55aa19a53e40
  4. sobel_img_.data: 0x55aa19a53e40

    1 和 2 应该不同,因为我创建了 new Mat(),所以没关系。

    但是,即使我在将 local_mat 复制到 sobel_mat 后创建了 new Mat(),3 和 4 也是相同的。

    当我使用 OpenCV Mat 时,我遇到了很多这样的问题。

    你能解释一下为什么会发生这种情况,我该如何解决?

    标签: c++ opencv memory-management heap-memory


    【解决方案1】:

    矩阵的初始化是matrix expression的一种形式。

    cv::Mat 的重载为 operator=。其中一个处理 MatExpr 作为它的参数:

    分配的矩阵表达式对象。与第一种形式相反 赋值操作,第二种形式可以重用已经分配的 矩阵,如果它具有适合矩阵表达式的大小和类型 结果.它由真正的函数自动处理 矩阵表达式扩展为。例如,C=A+B 扩展为 add(A, B, C),add 负责自动重新分配 C。

    我用粗体字强调了你的情况。 cv::Eye 使用已分配的内存来创建单位矩阵。

    您可以通过以下方式将MatExpr 转换为cv::Mat

    sobel_img_ = (cv::Mat)cv::Mat::eye(cv::Size(1000, 1000), CV_8UC1); // renew
    

    然后sobel_img 将引用新分配的矩阵。

    【讨论】:

    • 非常感谢您的回答。
    猜你喜欢
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多