如何在 opencv 中交换 Mat 的行?

How to swap rows of Mat in opencv?

我想交换 Mat M 中的两行,我有两个小问题:

  1. 要交换两行,我需要一个MatrixRow temp(伪代码)来备份要替换的第一行。但是我不知道 Mat.
  2. 的一行的类型应该是什么

Mat temp = img.row(i).clone();
img.row(i) = img.row(j).clone();
img.row(j) = temp.clone();

此代码不会更改 img,为什么?

我建议您使用以下步骤而不是使用克隆:

  1. 创建一个大小为 1 行 x n 列的临时垫子,其中 n 是图像的宽度
  2. 借助for循环将第i行的像素值复制到临时垫
  3. 使用相同的 for 循环技术将第 j 行的像素值复制到第 i 行
  4. 将像素值从临时垫复制到第 j 行

这是我根据所提供的信息所了解的解决方案。

img.row(i) = img.row(j).clone();

img.row(j) = temp.clone();

不要复制克隆的数据,因为它们会调用以下赋值运算符

Mat& cv::Mat::operator= (const Mat& m)  

documentation

Matrix assignment is an O(1) operation. This means that no data is copied but the data is shared and the reference counter, if any, is incremented.

要进行复制,您可以使用 another assignment operator

Mat& cv::Mat::operator= (const MatExpr& expr)

详情见matrix expressions

因此,您可以执行类似以下操作来实际复制数据。

img.row(i) = img.row(j).clone() + 0;
img.row(j) = temp.clone() + 0;

而且,您不需要克隆。所以可以写成

img.row(i) = img.row(j) + 0;
img.row(j) = temp + 0;

此处,img.row(j) + 0 创建了一个矩阵表达式,因此您在 img.row(i) = img.row(j) + 0;.

中调用了 Mat& cv::Mat::operator= (const MatExpr& expr) 赋值运算符

另一个选项是按照另一个答案所说的复制数据。您可以为此使用 Mat::copyTo

有关详细信息,请参阅 documentation 中关于

的注释
Mat cv::Mat::row(int y) const

它用例子解释了这一点。