是否可以从图像ROI中取回原始图像?例如说我们有
cv::Mat image = imread("image.jpg", 0);
cv::Mat imageROI = image(0, 0, 100, 100);
myFunction(imageROI);
在myFunction中我想使用原始图像。有没有办法在我们不访问原始图像时将imageROI转换为原始图像?
答案 0 :(得分:4)
我不知道我是否完全按照您的想法理解了这个问题,但如果您问我们是否说我们有标题
void myFunc(cv::Mat &m);
// .... later on
cv::Mat image = imread("image.jpg", 0);
cv::Mat imageROI = image(0, 0, 100, 100);
myFunction(imageROI);
// .... later on myFuncDefinition
void myFunc(cv::Mat &m) {
// some code
// here you would like to have an original image, right?
}
所以答案是否定的,并且证明是简单的:为什么要让你以这种方式设计opencv api以便存储不必要的数据?如果你这样做
cv::Mat imageROI = image(0, 0, 100, 100);
通过目的 您想要忘记整个图像,并且您对某些投资回报感兴趣。 Mat容器的设计方式只能复制矩阵“标题”而不是矩阵内容。因此,如果你做cv :: Mat imageROI = image(0,0,100,100),也许矩阵内容(即图像数据)可能存储在内存中的某个地方(因为roi是它的一部分,所以通过优化目的,它可能即使原始图像变量超出范围也不会删除,但您的矩阵标题已更改。也就是说,从指向(0,0,imageWisth,imageHeight)到(0,0,100,100),并且没有办法只使用变量m将其恢复。
为什么不将附加参数作为参考传递?
答案 1 :(得分:2)
只是想让任何人看到这个问题,你实际上可以做到这一点
cv::Mat mat = ...
cv::Size size;
cv::Point offset;
// find original image size, and get offset of roi
mat.locateROI(size, offset);
// put image back to original size;
mat.adjustROI(offset.y, size.height - mat.rows, offset.x, size.width- mat.cols);