opencv2调整图像不能在Mat上使用用户数据

时间:2017-10-25 13:49:31

标签: c++ opencv

我正在使用opencv2。我使用外部用户数据cv::MatmatLoad创建了2 matResize。并将matLoad调整为matResize。但是,在cv::resize函数之后在调用时,用户数据仍然为空(全部为0xCD)。但matResize.data已更改,不再等于指向用户数据的指针。似乎cv::resize重置了目标Mat&# 39; s data属性,在opencv中分配了一块新的内存空间。见下文:

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有什么问题?

1 个答案:

答案 0 :(得分:1)

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

在您的代码中,您将目标尺寸设置为:

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

但您要求重新调整大小的图片:

cv::Size(rcutw, rcuth)

倒置行(高度)和列(宽度)。

所以只需使用正确的大小创建矩阵:

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