0

700x1 サイズの「srcMat」として 1 つのマトリックスがあります。次のコマンドを使用して、空の行列「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" ループの外側 (後) ですべてゼロですが、ループの内側では、必要な値が正確に含まれています。ここで何が問題なのですか?よろしくお願いします。

4

1 に答える 1

0

問題は、範囲を選択しようとするたびに、読み取り専用の値で作業していることだと思います。したがって、すべての値が失われ、実際の行列に到達するものはありません。

opencv のドキュメントに書かれているように、 から返される値operator()constであるため、返された値を使用して行列を編集することはできません。

Mat Mat::operator()( 範囲 rowRange, 範囲 colRange) const

ただし、setTo の 2 番目のマスク引数を使用する場合は問題ありません。

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;
}

マトリックスも変更されるかどうかを確認してください

于 2012-08-13T21:15:43.190 に答える