2012-10-03 94 views
13

我知道在OpenCV 2.1中我们有一个函数来设置ROI:cvSetImageROI(),但是这个函数在2.4中不存在(或者至少我不能在它的手册中找到它并且帮助。部分)了解openCV感兴趣的区域2.4

但这里是唯一有用的代码,我能找到它使用了OpenCV 2.4法师的投资回报率,但我无法理解它:

// 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函数给出的,尺寸和他们想要添加的小徽标相同。

然后,这是什么使我困惑:cv::addWeighted(imageROI,1.0,logo,0.3,0.,imageROI);在这里addWeighted的来源1是ROI尺寸设置,来源2是标志,目的地也是ROI尺寸设置。它是否正确?或者我错过了什么?

在此之后,结果显示与标志添加到大图像。包括这些命令在内的大图。

另外,在问这里之前,我想亲自尝试一下代码,以便澄清情况。但我得到这个错误,因为像()不承认:'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; 

}

回答

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

简历::垫构造至极需要一个矩形作为参数:

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

返回一个矩阵,该矩阵指向原始图像的ROI,位于由矩形指定的位置。所以imageROI实际上是原始图像“图像”的兴趣区域(或子图像/子矩阵)。如果你修改了imageROI,它将会修改原来的更大的矩阵。

至于你的例子,问题是你从一个不存在的对象(图像)调用构造函数。此时应更换:

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

由:

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

假设src1的是,你要插入的标志进入(标志是car1.jpg)你的“大形象”。顺便说一下,你不应该忘记首先阅读你的大图。

+0

太好了。非常感谢。这就是我陷入困惑的原因,我认为形象是一种功能,并没有发现任何关于大影像的提及。谢谢你清除这个。关于这个主题的最后一个问题是,如何找到矩形顶点的像素位置。我的意思是,假设我想将我的标识添加到src 1的左上角,然后在src1中(Rect(385,270,logo.cols,logo.rows));“我应该用什么位置代替上述385,270?有没有简单的方法来找到这个?谢谢 – StuckInPhD

+0

您可以使用ROI内的坐标,即图像中的385,270对应于ROI中的0,0。只要你使用cv :: Mat的访问器,就像Mat :: at(int row,int col)一样。如果直接使用原始数据,则必须注意ROI中的实际数据布局是原始图像的数据布局 – remi

相关问题