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

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

本文关键字:数据 存储 在哪里 变量 对象 Mat 如果      更新时间:2024-09-22

我需要将图像数据从Mat对象(OpenCV(传输到ZXing::ImageView对象内的const unsigned char*;通常,我只使用(假设对象名为"对象"(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());
// ...