gpt4 book ai didi

c++ - 如何使用另一个垫子图像替换垫子中的值

转载 作者:太空狗 更新时间:2023-10-29 21:10:35 27 4
gpt4 key购买 nike

我有一个 480x480 的垫子 A 和 478x478 的垫子 B。我想在 C++ 中使用 Mat B 填充 Mat A(不包括 A 的边框)。在 python 中,我使用来自 numpy 的以下符号

A[1:-1,1:-1] = B[:,:,0]

为了在 C++ 中实现同样的效果,我尝试使用以下代码使用 channel 和范围,但它没有工作。

std::vector<Mat> B_channel(3);
split(B, B_channel);
A(cv::Range(1,479), cv::Range(1, 479)) = B_channel[0];

如何在 C++ 中实现相同的目的。

最佳答案

要在 C++ 中实现与 Python 代码相同的效果,您可以执行类似以下示例的操作:

  cv::Mat A(100, 100, CV_8U, cv::Scalar::all(0));
cv::Mat B(98, 98, CV_8U, cv::Scalar::all(1));
std::cout << "sumAll A: " << cv::sum(A) << std::endl;

B.copyTo(A.colRange(1, A.cols - 1).rowRange(1, A.rows - 1)); // This is the copy part
std::cout << "sumAll A: " << cv::sum(A) << std::endl;

我打印所有内容的总和以验证它是否已复制。第一种情况给出 0,第二种情况给出 9604。这两种情况都是正确的。需要记住的一件重要事情:如果大小不匹配,copyTo 将重新初始化矩阵并可能产生意想不到的结果。

为了进一步分解代码,这个:

A.colRange(1, A.cols - 1).rowRange(1, A.rows - 1)

相当于:

 A[1:-1,1:-1]

在 python 中,copyTo 会将值(而不是 header )从一个 cv::Mat 复制到另一个。如果您使用复制运算符 (=),它只会复制 header ,在这种情况下,只是将其写入您使用 A(cv::Range(1,479), cv::Range( 1, 479)) 这更多是为了访问 A 中的数据。在指令之后,此 header 被破坏,您的数据完全相同。

要获取要复制到的 header 部分,您可以通过多种方式进行。我写的是获取列和行的范围。另一个是您编写的(采用两个范围),第三个是使用 cv::Rect。所以最后这一切都是等价的:

B.copyTo(A.colRange(1, A.cols - 1).rowRange(1, A.rows - 1));
B.copyTo(A(cv::Range(1, A.cols - 1), cv::Range(1, A.rows - 1)));
B.copyTo(A(cv::Rect(1,1,A.cols -2, A.rows -2)));

在最后一种情况下,cv::Rect 是 (x,y, width, height) 因此 -2 而不是其他情况的 -1。

在使用 copyTo 获取图像 B 的子集之前,您可以对 B 执行相同的操作。

关于c++ - 如何使用另一个垫子图像替换垫子中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53613149/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com