我知道在OpenCV 2.1中我们有一个设置ROI的函数:cvSetImageROI(),但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函数给出的尺寸和尺寸等于他们想要添加的小徽标的尺寸。
然后thsi让我感到困惑:cv::addWeighted(imageROI,1.0,logo,0.3,0.,imageROI);
此处addWeighted的源1是ROI维度集,源2是徽标,目标也是ROI维度集。它是否正确?或者我错过了什么?
在此之后显示结果,并在大图像中添加徽标。在这些命令中包含了大图像。
在问这里之前,我想尝试自己的代码,以帮助澄清情况。但我收到此错误,因为无法识别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;
}
答案 0 :(得分:21)
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实际上是原始图像“图像”的感兴趣区域(或子图像/子矩阵)。如果修改imageROI,它将因此修改原始的较大矩阵。
至于你的例子,问题是你是从一个不存在的对象(图像)调用构造函数。你应该替换:
imageROI= image(Rect(385,270,logo.cols,logo.rows));
由:
imageROI= src1(Rect(385,270,logo.cols,logo.rows));
假设src1是您要将徽标插入的“大图像”(徽标为car1.jpg)。顺便说一句,你不应该忘记先阅读你的大图!