Loops 矩阵都是零,超出了循环

Loops 矩阵都是零,超出了循环,loops,opencv,for-loop,matrix,reset,Loops,Opencv,For Loop,Matrix,Reset,我有一个矩阵作为srcMat,大小为700x1。我使用以下命令为空矩阵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)); } 但

我有一个矩阵作为srcMat,大小为700x1。我使用以下命令为空矩阵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));
}

但这里的问题是:在for循环之后,dstMat在外部都是零,但在循环内部,它正好有我想要的值。这里有什么问题?非常感谢

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

正如opencv文档中所述,运算符返回的值是常量,因此不能使用返回值编辑矩阵:

Mat Mat::运算符范围行范围、范围列范围常数

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

Mat&Mat::setToconst标量&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;
}

检查是否也改变了矩阵

您能否提供更多关于什么是dstMat、medianMat及其大小和值的详细信息,以便我们可以运行块并进行测试……亲爱的Kamyar,非常感谢您的回答。我尝试了好几次在setTo中使用掩码,但都失败了。对于如何使用它,您有任何示例代码或建议吗?我对OpenCV还很陌生。再次感谢你。至于.creating masks需要更多的代码,你应该在你想复制的地方放1,在你不想复制的地方放0。我已经用colRange编辑了我的答案,你可以试着看看它是否适合你亲爱的Kamyar,非常感谢你的有用答案。关于。