我正在使用opencv2。我使用外部用户数据cv::Mat
和matLoad
创建了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
有什么问题?
答案 0 :(得分:1)
如果调整大小的矩阵的维度与目标矩阵不同,则将重新分配目标矩阵。因此,为避免重新分配,您需要确保维度一致。
在您的代码中,您将目标尺寸设置为:
cv::Mat matResize(rcutw, rcuth, cvfmt, mDataProc);
但您要求重新调整大小的图片:
cv::Size(rcutw, rcuth)
您倒置行(高度)和列(宽度)。
所以只需使用正确的大小创建矩阵:
cv::Mat matResize(rcuth, rcutw, cvfmt, mDataProc);
^^^^^^^^^^^^^