0

OpenCV で画像のデータ マトリックスを作成する必要があります。基本的に、マトリックスの各行には、同じ人物の複数の画像が含まれます。@ bytefish によって書かれたこのasRowMatrix チュートリアルを見つけましたが、現在、複数の画像をマトリックスの行にコピーする方法を理解していません。「;」で区切られた画像パスのテキスト ファイルがあります。パスが新しいサブジェクトを参照している場合、たとえば:

Subject1/Image1.png
Subject1/Image2.png
;
Subject2/Image1.png

私の最初のアイデアは、2D ベクトルを持つことでした。

Vector<Vector<Mat>> intra;
    while(file.good()) {
    getline(file, path);
    if((path.compare(";"))!=0){
        try{
 //Add images to person-index
            intra[curRow].push_back(imread(path,0));
        } catch (Exception const & e){
            cerr<<"OpenCV exception: "<<e.what()<<std::endl;
        }
    } else{
//";" found --> increment person-index
        curRow++;
    }
}
imshow("Intra[0,0]",intra[0][0]);

ただし、ベクトルがサイズ(curRow+1)ではないことが原因であると思われるエラーが発生しています

OpenCV Error: Assertion failed (i < size()) in unknown function, file c:\opencv\
include\opencv2\core\operations.hpp, line 2357
OpenCV exception: c:\opencv\include\opencv2\core\operations.hpp:2357: error: (-2
15) i < size()

else でベクトルのサイズを変更しても問題は解決しませんでした! この問題を解決する方法や、別の OpenCV データ構造を使用する方法についてのアドバイスをいただければ幸いです。

4

1 に答える 1

1

push_back を使用する代わりに、画像を追加するたびにベクターのサイズを動的に変更することにしました。これは非効率的かもしれませんが、誤った参照の問題を解決します。@jrokの 2D ベクトル要素アクセスの質問への回答でアイデアを得ました。編集されたソリューション:

int curRow=0;
int numImages=0;

string line, path, temp;
while(file.good()) {
    getline(file, path);
    if((path.compare(";"))!=0){
        try{
            faces[curRow].resize(numImages+1);
            faces[curRow][numImages] = imread(path,0);
            numImages++;
        } catch (Exception const & e){
            cerr<<"OpenCV exception: "<<e.what()<<std::endl;
        }
    } else{
        numImages=0;
        curRow++;
    }
}

これが同じ問題に直面している他の人々に役立つことを願っています!

于 2013-01-31T00:30:54.280 に答える