从opencv中获取ROI图像的原始图像

时间:2014-03-19 06:48:54

标签: opencv roi

是否可以从图像ROI中取回原始图像?例如说我们有

cv::Mat image = imread("image.jpg", 0);
cv::Mat imageROI = image(0, 0, 100, 100);
myFunction(imageROI);

在myFunction中我想使用原始图像。有没有办法在我们不访问原始图像时将imageROI转换为原始图像?

2 个答案:

答案 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);