【发布时间】:2021-08-18 20:19:18
【问题描述】:
我在 openCV 中有一个这样的矩阵:cv::Mat matrix = cv::Mat::zeros(5, 5, CV_32FC3);
然后,我想以两种不同的方式进行矩阵乘法,第一种是通道方式,第二种是重载运算符。
// VERSION 1:
for (int row_count = 0; row_count < image.rows; row_count++)
{
for (int col_count = 0; col_count < image.cols; col_count++)
{
for (int channel_count = 0; channel_count < 3; channel_count++)
{
matrix.at<cv::Vec3b>(row_count, col_count)[channel_count] = some_image.at<cv::Vec3b>(row_count, col_count)[channel_count] * other_image.at<float>(row_count, col_count);
}
}
}
// VERSION 2:
for (int row_count = 0; row_count < image.rows; row_count++)
{
for (int col_count = 0; col_count < image.cols; col_count++)
{
matrix.at<cv::Vec3b>(row_count, col_count) = some_image.at<cv::Vec3b>(row_count, col_count) * other_image.at<float>(row_count, col_count);
}
}
为什么我在这里得到不同的结果?
编辑:(这里是一个例子 thx@Frank)
int main() {
cv::Vec3b data(127, 81, 24);
float ratio = 0.25f;
cv::Vec3b manual;
manual[0] = data[0] * ratio;
manual[1] = data[1] * ratio;
manual[2] = data[2] * ratio;
cv::Vec3b overloaded = data * ratio;
std::cout << manual << " vs " << overloaded << "\n";
}
输出:
[31, 20, 6] vs [32, 20, 6]
【问题讨论】:
-
我可以建议一个更简单的 mcve:gcc.godbolt.org/z/c1P5GqPGG。输出为
[31, 20, 6] vs [32, 20, 6]。更改太大了,让我觉得仅仅为它编辑问题就很舒服,但我强烈建议您进行更改。 -
您必须将其寻址为
other_image.at<Vec3f>而不是other_image.at<float>,因为您的图像是CV_32FC3。目前,您没有从浮点矩阵中处理正确的像素位置,因为您正在处理它,就好像它是单通道一样,但它有 3 个通道。 -
@Micka 很明显
other_image是单通道图像。 -
好吧抱歉,那么您的地址
matrix.at<cv::Vec3b>错误,因为根据cv::Mat matrix = cv::Mat::zeros(5, 5, CV_32FC3);它是CV_32FC3但您将其地址为Vec3b而不是Vec3f -
@Micka 你说得对,OP 可能想要这样做,但由于他们在两个版本中都这样做,这并不能解释他们所经历的不一致。
标签: c++ opencv matrix operator-overloading