gpt4 book ai didi

c++ - opencv2调整图像大小不适用于带有用户数据的垫子

转载 作者:行者123 更新时间:2023-11-28 04:57:02 28 4
gpt4 key购买 nike

我正在使用 opencv2。我使用外部用户数据(matLoadmatResize)创建了 2 个 cv::Mat。并将 matLoad 的大小调整为 matResize。但是调用cv::resize函数后,用户数据还是空的(都是0xCD)。但是matResize。 data 已更改,不再等于指向用户数据的指针。似乎 cv::resize 重置了目标 Mat 的 data 属性,使用新的opencv内部分配的一 block 内存空间,见下图:

cv::Mat matLoad(cutw, cuth, cvfmt, mDataLoad);
... // Read image data into `mDataLoad`
cv::Mat matResize(rcutw, rcuth, cvfmt, mDataProc);
printf("%s\n", (matResize.data == mDataProc) ? "equal" : "notequal"); // "equal" is called
cv::resize(matLoad, matResize, cv::Size(rcutw, rcuth));
printf("%s\n", (matResize.data == mDataProc) ? "equal" : "notequal"); // "notequal" is printed
for (int i = 0; i < matResize.elemSize() * matResize.cols * matResize.rows; i++) {
if (matResize.data[i] != 205) {
printf("hehe %d\n", matResize.data[i]); // many lines printed, with different values
}
}
for (int i = 0; i < matResize.elemSize() * matResize.cols * matResize.rows; i++) {
if (mDataProc[i] != 205) {
printf("hehe %d\n", mDataProc[i]); // none is printed
}
}

但是如果我创建 matResize 而不传递用户数据(即让 opencv 自己分配和维护内存空间),调整大小效果很好。

cv::Mat matLoad(cutw, cuth, cvfmt, mDataLoad);
... // Read image data into `mDataLoad`
cv::Mat matResize(rcutw, rcuth, cvfmt);
cv::resize(matLoad, matResize, cv::Size(rcutw, rcuth));
for (int i = 0; i < matResize.elemSize() * matResize.cols * matResize.rows; i++) {
if (matResize.data[i] != 205) {
printf("hehe %d\n", matResize.data[i]); // many lines printed, with different values
}
}

使用外部用户数据创建的 cv::Mat 有什么问题?

最佳答案

如果调整大小的矩阵的维度与目标矩阵不同,那么目标矩阵将被重新分配。因此,为避免重新分配,您需要确保维度一致。

在您的代码中,您将目标大小设置为:

cv::Mat matResize(rcutw, rcuth, cvfmt, mDataProc);

但您要求调整大小的图像:

cv::Size(rcutw, rcuth)

反转行(高度)和列(宽度)。

因此只需创建具有正确大小的矩阵:

 cv::Mat matResize(rcuth, rcutw, cvfmt, mDataProc);
^^^^^^^^^^^^^

关于c++ - opencv2调整图像大小不适用于带有用户数据的垫子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46934226/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com