【问题标题】:matrix is all zero outsize the loop矩阵全为零,比循环大
【发布时间】:2012-08-13 14:05:28
【问题描述】:

我有一个 700x1 大小的矩阵“srcMat”。我使用以下命令为空矩阵“dstMat”赋值:

cv::Mat dstMat ( srcMat.rows, srcMat.cols, srcMat.type() ); 

for ( int i = 0; i <  medianMat.cols ; i ++ )
{
   dstMat( cv::Range::all(), cv::Range( i*5+1, i*5+4 )).setTo(srcMat.at<int>(i));
}

但这里的问题是:dstMat 在“for”循环之外(之后)全为零,但在循环内部,它正是我想要的值。这里有什么问题?提前谢谢了。

【问题讨论】:

  • 您能否提供更多关于什么是 dstMat、medianMat 以及它们的大小和值的详细信息,以便我们可以运行该块并进行测试...

标签: loops opencv for-loop matrix reset


【解决方案1】:

我认为问题在于每次您尝试选择一个范围时,您都在处理一个只读值。 所以你失去了所有的价值,没有一个能得到真正的矩阵。

正如opencv文档中所写,从operator()返回的值是const,所以不能使用返回值编辑矩阵:

Mat Mat::operator()( Range rowRange, Range colRange) const

但是,如果您使用 setTo 的第二个掩码参数,您应该没有问题:

Mat& Mat::setTo(const Scalar& s, const Mat& mask=Mat())

编辑

我会使用 colRange 来复制和选择列, 以下代码适用于我:

#include <opencv2/core/core.hpp>
#include <iostream>

int main( int argc, char** argv )
{
  cv::Mat dstMat ( 3, 12, CV_32S );

  for(int i = 0; i < 6; i++)
    dstMat.colRange(2*i,2*i+2).setTo(i);

  std::cout<< "Destination\n" << dstMat << std::endl;
  return 0;
}

检查它是否也为你改变了矩阵

【讨论】:

  • 亲爱的 Kamyar,非常感谢您的回答。我尝试了几次在“setTo”中使用掩码,但都失败了。您对如何使用它有任何示例代码或建议吗?我对 OpenCV 很陌生。再次感谢你。关于。
  • 创建蒙版需要更多的代码,你应该把 1 放在你想复制的地方,把 0 放在你不想要的地方。我已经用 colRange 的示例代码编辑了我的答案,您可以尝试看看它是否适合您
  • 亲爱的 Kamyar,非常感谢您的有用回答。关于。
猜你喜欢
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2020-02-04
  • 2017-12-07
相关资源
最近更新 更多