如果 Mat 对象不在数据变量中,它会将其数据存储在哪里?

Where does a Mat object store its data if it's not in data variable?

我需要将图像数据从 Mat 对象 (OpenCV) 传输到 ZXing::ImageView 对象中的 const unsigned char*;通常,我只是使用(假设对象名为“object”)object.data,风险自负,如果传输出现问题,我会从那里开始。但是,在这种情况下,数据成员变量是空的。不过,这个 Mat 对象确实会生成带有 imshow 的图像,所以我不确定还能去哪里查看。我已经阅读了文档,但我有限的经验和缺乏知识使我无法以合理的速度或在相关方向上有效地阅读它。这是我的代码:

#include <opencv2/opencv.hpp>
#include <ZXing/ReadBarcode.h>
using namespace cv;

Mat applyThreshold(Mat gradient);
Mat erodeAnddilate(Mat threshold_applied);
void readBarCode(Mat dest);

int main() {
    std::string file = "C:\Users\these\Desktop\cropped.JPG";
    namedWindow("imageview", WINDOW_NORMAL);
    Mat src = imread(file, IMREAD_COLOR);
    Mat thresh_applied = applyThreshold(src);
    Mat dest = erodeAnddilate(thresh_applied);
    readBarCode(dest);
    imshow("imageview", dest);
    waitKey(0);
    
    return 0;
}

Mat applyThreshold(Mat gradient) {
    Mat dest, gray;
    cvtColor(gradient, gray, COLOR_BGR2GRAY);
    threshold(gray, dest, 0, 255, THRESH_BINARY + THRESH_OTSU);

    return dest;
}

Mat erodeAnddilate(Mat threshold_applied) {
    Mat dest;
    Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
    morphologyEx(threshold_applied, dest, MORPH_CLOSE, kernel, Point(-1, -1), 2);
    return dest;
}

void readBarCode(Mat dest) {
    ZXing::ImageView test(dest.data, dest.size().width, dest.size().height, ZXing::ImageFormat::None);
    ZXing::Result truth = ZXing::ReadBarcode(test);
    int momentoftruth = 0;
}

函数readBarCode()就是问题所在。并为其他地方可能糟糕的代码道歉,我有很多东西要学。 :)

编辑:公认的解决方案是官方给出的唯一解决方案,但所有评论共同帮助我意识到我在考虑相关数据变量时的错误。我现在将数据变量视为一个指针,并将浅拷贝与深拷贝作为一种潜在的解决方案加以考虑。我对我的 Mat 对象发生了什么有了更好的理解,并认为我的问题得到了回答。谢谢大家。

尝试将对 Mat 对象的引用传递给函数,或者如果您想复制数据以创建新图像,请显式使用 clone() 方法来获取深度复制你的形象。

喜欢:

Mat applyThreshold(Mat& gradient) {
    Mat dest, gray;
    cvtColor(gradient, gray, COLOR_BGR2GRAY);
    threshold(gray, dest, 0, 255, THRESH_BINARY + THRESH_OTSU);

    return dest;
}

或:

// ...
Mat thresh_applied = applyThreshold(src.clone());
// ...