在c++中修改cv::Mat中的cv::Rect



我对openCV很陌生,想问一个看起来很简单的问题。
我有一个cv::Mat形式的图像,我只想改变矩阵的一小部分。我读到使用cv::Rect是正确的方法,但我似乎找不到一种方法来只修改那个小ROI。

代码如下:

cv::Mat img = cv::Mat::zeros(msg->height, msg->width, CV_64FC1);
cv::Rect rect(100, 100, 20, 50);

我要做的就是对rect进行线性变换并将其赋值到img的相同部分

类似:

int a=0.1, b=20;
rect = rect*a + b;

提前感谢。

OpenCV的cv::Mat有一个构造函数,创建一个ROI图像引用另一个图像:

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

使用这个构造函数将导致新的cv::Mat共享数据与原图:

这些构造函数不复制数据。相反,将构造指向m数据或其子数组的头文件并与之关联。
引用计数器(如果有的话)是递增的。因此,当您修改使用这种构造函数形成的矩阵时,您也修改了m的相应元素。

你也可以使用operator():

Mat cv::Mat::operator() (const Rect & roi)  const

在你的情况下,你可以这样做:

#include <opencv2/core/core.hpp>
int main()
{
int h = 320;
int w = 640;
cv::Mat img = cv::Mat::ones(h, w, CV_64FC1);
cv::Rect rect(100, 100, 20, 50);
cv::Mat roi(img, rect); // alternatively you can use:  cv::Mat roi = img(rect);
double a = 0.1;
double b = 20;
roi = roi * a + b; // this will modify the relevant area in img
return 0;
}

最新更新