[英]opencv2 resize image not working on Mat with user data
我正在使用opencv2。 我创建了2 cv::Mat
与外部用户数据( matLoad
和matResize
。和调整matLoad
到matResize
,但之后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.