0

これは、OpenCV C++ に重点を置いているこの質問に基づいているため、この質問を作成することにしました。これは私のプログラムの一部です:

vector<vector<Point> > contours;
vector<vector<Point> > largest_contours;

double largest_area = 0;
for(int i= 0; i < contours.size(); i++){
    double area = contourArea(contours[i]);
    if(area >= largest_area){
        largest_area = area;
        largest_contours = contours[i];  <---THIS is the problem
    }
}

基本的に、プログラムは次のことを行います。

  1. 画像シーケンス/ビデオで検出されたすべての輪郭をスキャンします
  2. 等高線に次のようにラベルを付けますcontours[i]
  3. すべての等高線の面積を計算します
  4. contours[i]面積に基づいて比較します。面積が大きくなりlargest_area、輪郭が大きくなりますlargest_contours
  5. 最後に、DrawContoursそしてimshow

問題のある行には、マウスの上に次のメッセージが表示されます。

Error: No operator "=" matches these operands

問題は、同じクラス ( ) を持ち、一度に各等高線に値が 1 つしかないにもかかわらず、 が等しくないのはなぜですか? 誰でも理由と解決方法を説明できますか?contours[i] largest_contoursvector<vector<Point> >

前もって感謝します。

EDIT(1):contourArea(contours)に変更contourArea(contours[i])largest_contoursとの宣言を追加しましcontoursた。

4

2 に答える 2

1

ここにはいくつかの問題があります。問題の正確な理由は、完全な宣言なしでは判断できませんが、奇妙に見えることがいくつかあります。

double area = contourArea(contours);

これは、反復ごとに、すべての輪郭の合計面積を決定しているように見えます。これは間違っているように聞こえます。

largest_contours = contours[i]; 

等高線の代入演算子がないため、これはおそらく失敗します。代わりにインデックスを保存するのはどうですか(構造全体を保持したい場合を除きます(?))。

于 2013-01-29T11:58:25.100 に答える
1

何かのコレクションを持っているときとそうでないときの間で混乱しているようです。vector<Point>aはあなたが「輪郭」と見なすものであり、 avector<vector<Point>>は一連の輪郭であると推測しています。

0 から までループするとcontours.size()、 をcontourArea(contours)変更しないため、毎回まったく同じになりますcontours。個々の輪郭の領域を計算したいので、次のようなことをする必要があるようcontourArea(contours[i])です。

次に、タイプもある最大の輪郭のリストがvector<vector<Point>>必要な場合は、見つけた各輪郭を this にプッシュする必要がありますvectorcontours[i]がリストに追加したい輪郭である場合は、 で行いlargest_contours.push_back(contours[i]);ます。

于 2013-01-29T12:00:22.723 に答える