我对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;
}