0

私は C++ とプログラミング全般に慣れていません。C++ 環境で OpenCv アプリケーションを作成しています。

私が達成しようとしていること:

わかりましたので、いくつかの Rectangles の中心点をベクトルに格納しました。今、逆の Iterator を使用して、ベクトルを四角形の中心点で反復処理し、10 番目ごとの中心点を新しいベクトルに格納しています。

次に、10 番目ごとの四角形の中心点を格納する新しいベクトルを通常のイテレータで再度反復処理します。そして、1 番目の要素を 2 番目の要素から減算し、3 番目の要素を 4 番目の要素から減算するなど、減算の結果を別の新しいベクトルに格納したいと考えています。 :D

一部の人にとっては少し混乱するかもしれません。私自身、混乱しているので、以下に私が書いたコードを追加します。

vector<Point> Rightarm;
vector<Point> Leftarm;

vector<Point>::reverse_iterator RightMovmentIter;
vector<Point>::reverse_iterator LeftarmMovmentIter;

vector<Point> RightTracking;
vector<Point> LeftTracking;

for(RightMovmentIter = Rightarm.rbegin(); RightMovmentIter != Rightarm.rend(); RightMovmentIter+=10)
{
    RightTracking.push_back(*RightMovmentIter);
}

for(LeftarmMovmentIter = Leftarm.rbegin(); LeftarmMovmentIter != Leftarm.rend(); LeftarmMovmentIter+=10)
{
    LeftTracking.push_back(*LeftarmMovmentIter);
}

vector<Point>::iterator RresultIter;
vector<Point>::iterator Leftresult_Iter;
vector<Point> summery;

for(RresultIter = RightTracking.begin(); RresultIter != RightTracking.end(); RresultIter++)
{
    summery = *RresultIter - *RresultIter++;
}

問題:

最初の問題は、プログラムを実行すると実行時エラーが発生することです。これは、ベクトルの開始時に Rightarm & Leftarm に 10 個の要素がなく、Iterator がそれを実行して 10 番目の要素を探そうとしているときに、できないと考えられます。 ....どうすればこれを解決できますか?

2 番目の問題は、この行 summery = *RresultIter - *RresultIter++; に関するものです。私はそれが間違っていることを知っており、これは私が考えることができる最善の試みですが、私がやりたいのは、2番目の要素から1番目の要素を減算し、それを夏の要素に格納することです...

うまくいけば、これは読者にとって私の問題を十分に説明しています よろしく

4

1 に答える 1

0

お気付きのように、これはRightarm.size()正確に 10 の倍数でない限り機能しません。これを回避する 1 つの方法は、最初の要素をスキップして、最後の行を揃えることです。

for(RightMovmentIter = Rightarm.rbegin() + Rightarm.size() % 10;
    RightMovmentIter != Rightarm.rend();
    RightMovmentIter+=10)

実行中の差を取ることに関しては、そのための標準アルゴリズムがありstd::adjacent_differenceます。

std::adjacent_difference( RightTracking.begin(), RightTracking.end(),
      std::back_inserter( summery ) );
summery.erase( summery.begin() );

これは、差をとらずに最初の値をコピーするため (「最初の前」の値がゼロであると仮定するのと同様)、erase()行はそれを取り除きます。

于 2013-03-29T04:01:35.847 に答える