如何在 opencv 中交换 Mat 的行?
How to swap rows of Mat in opencv?
我想交换 Mat M
中的两行,我有两个小问题:
- 要交换两行,我需要一个
MatrixRow temp
(伪代码)来备份要替换的第一行。但是我不知道 Mat
. 的一行的类型应该是什么
Mat temp = img.row(i).clone();
img.row(i) = img.row(j).clone();
img.row(j) = temp.clone();
此代码不会更改 img,为什么?
我建议您使用以下步骤而不是使用克隆:
- 创建一个大小为 1 行 x n 列的临时垫子,其中 n 是图像的宽度
- 借助for循环将第i行的像素值复制到临时垫
- 使用相同的 for 循环技术将第 j 行的像素值复制到第 i 行
- 将像素值从临时垫复制到第 j 行
这是我根据所提供的信息所了解的解决方案。
img.row(i) = img.row(j).clone();
和
img.row(j) = temp.clone();
不要复制克隆的数据,因为它们会调用以下赋值运算符
Mat& cv::Mat::operator= (const Mat& m)
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)
因此,您可以执行类似以下操作来实际复制数据。
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
它用例子解释了这一点。
我想交换 Mat M
中的两行,我有两个小问题:
- 要交换两行,我需要一个
MatrixRow temp
(伪代码)来备份要替换的第一行。但是我不知道Mat
. 的一行的类型应该是什么
Mat temp = img.row(i).clone();
img.row(i) = img.row(j).clone();
img.row(j) = temp.clone();
此代码不会更改 img,为什么?
我建议您使用以下步骤而不是使用克隆:
- 创建一个大小为 1 行 x n 列的临时垫子,其中 n 是图像的宽度
- 借助for循环将第i行的像素值复制到临时垫
- 使用相同的 for 循环技术将第 j 行的像素值复制到第 i 行
- 将像素值从临时垫复制到第 j 行
这是我根据所提供的信息所了解的解决方案。
img.row(i) = img.row(j).clone();
和
img.row(j) = temp.clone();
不要复制克隆的数据,因为它们会调用以下赋值运算符
Mat& cv::Mat::operator= (const Mat& m)
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)
因此,您可以执行类似以下操作来实际复制数据。
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
它用例子解释了这一点。