繁体   English   中英

在 C++ 中修改 cv::Mat 内的 cv::Rect

[英]Modifying a cv::Rect inside a cv::Mat in C++

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM