1

わかりましたので、方向付けられた勾配のヒストグラムを使用することは、ソーベル導関数のヒストグラムを作成するよりも、画像の指紋を作成するためのより良い方法であると判断しました。最終的にほとんど理解できたと思いますが、コードをテストすると、次のようになります。

OpenCV エラー: アサーションに失敗しました ((winSize.width - blockSize.width) % blockStride.width == 0 && (winSize.height - blockSize.height) % blockStride.height == 0)。

今のところ、HOG を正しく計算して結果を確認する方法を見つけようとしています。視覚的にではなく、HOG が作成されたかどうかを確認するための非常に基本的な出力が必要です。次に、画像比較で使用する方法を考えます。

ここに私のサンプルコードがあります:

using namespace cv;
using namespace std;

int main(int argc, const char * argv[])
{
//    Initialize string variables.
string thePath, img, hogSaveFile;
thePath = "/Users/Mikie/Documents/Xcode/images/";
img = thePath + "HDimage.jpg";
hogSaveFile = thePath + "HDimage.yml";
//    Create mats.
Mat src;
//    Load image as grayscale.
src = imread(img, CV_LOAD_IMAGE_GRAYSCALE);
//    Verify source loaded.
if(src.empty()){
    cout << "No image data. \n ";
    return -1;
}else{
    cout << "Image loaded. \n" << "Size: " << src.cols << " X " << src.rows << "." << "\n";

}

//    Initialize float variables.
float imgWidth, imgHeight, newWidth, newHeight;
imgWidth = src.cols;
imgHeight = src.rows;
newWidth = 320;
newHeight = (imgHeight/imgWidth)*newWidth;
Mat dst = Mat::zeros(newHeight, newWidth, CV_8UC3);
resize(src, dst, Size(newWidth, newHeight), CV_INTER_LINEAR);
//    Was resize successful?
if (dst.rows < src.rows && dst.cols < src.cols) {
    cout << "Resize successful. \n" << "New size: " << dst.cols << " X " << dst.rows << "." << "\n";
} else {
    cout << "Resize failed. \n";
    return -1;
}

vector<float>theHOG(Mat dst);{
    if (dst.empty()) {
        cout << "Image lost. \n";
    } else {
        cout << "Setting up HOG. \n";
    }
    imshow("Image", dst);
    bool gammaC = true;
    int nlevels = HOGDescriptor::DEFAULT_NLEVELS;
    Size winS(newWidth, newHeight);
//        int block_size = 16;
//        int block_stride= 8;
//        int cell_size = 8;
    int gbins = 9;
    vector<float> descriptorsValues;
    vector<Point> locations;
    HOGDescriptor hog(Size(320, 412), Size(16, 16), Size(8, 8), Size(8, 8), gbins, -1, HOGDescriptor::L2Hys, 0.2, gammaC, nlevels);
    hog.compute(dst, descriptorsValues, Size(0,0), Size(0,0), locations);
    printf("descriptorsValues.size() = %ld \n", descriptorsValues.size()); //prints 960
    for (int i = 0; i <descriptorsValues.size(); i++) {
        cout << descriptorsValues[i] << endl;
    }
}
cvWaitKey(0);
return 0;
}

ご覧のとおり、さまざまな変数をいじってサイズを定義しましたが、役に立たなかったので、コメントアウトして手動で設定しようとしました。まだ何もありません。私は何を間違っていますか?どんな助けでも大歓迎です。

ありがとうございました!

4

1 に答える 1

9

を正しく初期化していませんHOGDescriptor。アサーションは、最初の 3 つの入力パラメーターのそれぞれが制約を満たさなければならないことを示しています。

(winSize - blockSize) % blockStride == 0

heightwidth次元の両方で。

問題は、winSize.height初期化で使用する他のパラメーターを考慮して、この制約を満たさないことですhog

(412 - 16) % 8 = 4    //Problem!!

おそらく最も簡単な解決策は、ウィンドウのサイズを からcv::Size(320,412)8 で割り切れるサイズに増やすことですcv::Size(320,416)が、特定のサイズは特定の要件によって異なります。主張が何を言っているのかに注意してください!

于 2013-07-08T22:21:46.007 に答える