繁体   English   中英

opencv2调整大小的图像无法在带有用户数据的Mat上使用

[英]opencv2 resize image not working on Mat with user data

我正在使用opencv2。 我创建了2 cv::Mat与外部用户数据( matLoadmatResize 。和调整matLoadmatResize ,但之后cv::resize函数被调用,用户数据仍然是空的(所有0xCD ),但matResize.data是改变,不再等于指向用户数据的指针,似乎cv::resize重置了目标Mat的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有什么问题?

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

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

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

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

cv::Size(rcutw, rcuth)

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM