理解OpenCV 2.4中的兴趣区域(ROI)

15

我知道在OpenCV 2.1中有一个设置ROI的函数:cvSetImageROI(),但是在2.4中不存在这样的函数(或者至少我在它的手册和帮助部分找不到)。

然而,这是我能找到的唯一使用opencv 2.4进行图像ROI的有用代码,但我很难理解它:

// define image ROI
cv::Mat imageROI;
imageROI= image(cv::Rect(385,270,logo.cols,logo.rows));
// add logo to image 
cv::addWeighted(imageROI,1.0,logo,0.3,0.,imageROI);

这里想要在原始图像右下角添加一个非常小的日志。

所以我从这里理解到,另一个矩阵被创建来保存ROI。其尺寸使用rect函数给出,并且大小等于他们想要添加的小logo的大小。

然后让我困惑的是:cv::addWeighted(imageROI,1.0,logo,0.3,0.,imageROI); 在这里,addWeighted的第一个源是设置的ROI尺寸,第二个源是logo,目标也是设置的ROI尺寸。这正确吗?或者我漏掉了什么?

之后的结果显示了标有logo的大图像。在这些命令中,哪里包括了大图像呢?

在询问这个问题之前,我想自己尝试一下代码,以便可能帮助澄清情况。但是我遇到了这个错误,因为image()未被识别:'image': identifier not found

int _tmain(int argc, _TCHAR* argv[])
{
Mat src1, imageROI, logo;

logo = imread("c:\\car1.jpg", -1);

imageROI= image(Rect(385,270,logo.cols,logo.rows));

addWeighted(imageROI,1.0,logo,0.3,0.,imageROI);


namedWindow("meh", CV_WINDOW_AUTOSIZE);
imshow("meh", imageROI);
waitKey(0);


return 0;

}

1个回答

22
cv::Mat imageROI;
imageROI= image(cv::Rect(385,270,logo.cols,logo.rows));

以矩形为参数的cv::Mat构造函数:

Mat::Mat(const Mat& m, const Rect& roi)

返回指向原始图像中由矩形指定位置的ROI的矩阵。因此,imageROI实际上是原始图像“image”的感兴趣区域(或子图像/子矩阵)。如果您修改imageROI,则会相应地修改原始的更大矩阵。

至于您的示例,问题在于您正在从不存在的对象(image)中调用构造函数。您应该将其替换为:

imageROI= image(Rect(385,270,logo.cols,logo.rows));

作者:

imageROI= src1(Rect(385,270,logo.cols,logo.rows));
假设src1是您要插入标志的"大图像"(标志是car1.jpg),不要忘记先读取您的大图像!

假设src1是您要插入标志的"大图像"(标志是car1.jpg),不要忘记先读取您的大图像!


太好了。非常感谢。这就是我感到困惑的原因,我以为图像是一个函数,并没有找到大图像的任何提及。感谢您澄清这一点。此外,关于这个主题的最后一个问题是,如何找到矩形顶点的像素位置。我的意思是,假设我想将我的徽标添加到src 1的左上角,那么在src1(Rect(385,270,logo.cols,logo.rows));中,我应该在所述385,270的位置给出什么位置?有没有简单的方法来找到这个位置?谢谢 - StuckInPhDNoMore
您可以在ROI内使用坐标,即图像中的385,270对应于ROI中的0,0。只要使用cv::Mat的访问器,如Mat::at(int row, int col),这将起作用。如果直接使用原始数据,则必须注意ROI中实际数据布局是原始图像的数据布局。 - remi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接