2013-07-08 102 views
1

好的,所以我決定使用面向梯度的直方圖是圖像指紋識別與創建sobel衍生物直方圖的更好方法。我想,我終於有了它主要是想通了,但是當我測試我的代碼,我得到如下:Failed Assertion Using HOGDescriptor

OpenCV Error: Assertion failed ((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; 
} 

正如你所看到的,我用不同的變量來定義大小,但無濟於事一團糟的時候,我評論說出來,並手動嘗試設置它們。依然沒有。我究竟做錯了什麼?任何幫助將不勝感激。

謝謝!

+0

斷言發生在哪條線上? – Aurelius

+0

它說它發生在hog.cpp的第65行,但我發現沒有提到上面實際代碼中的哪一行,但我認爲它是定義HOGDescriptor的第68行。 –

+0

查找斷言發生的行應該是您嘗試的第一件事。當斷言發生時你能看到調用堆棧嗎? – Aurelius

回答

5

您正在初始化HOGDescriptor不正確。 斷言狀態使得每個前三個輸入參數必須滿足約束:

(winSize - blockSize) % blockStride == 0 
在兩個 heightwidth尺寸

的問題是,winSize.height不滿足此約束,考慮到你初始化hog其他參數:

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

也許最簡單的解決方法是由8增加從cv::Size(320,412)你的窗口尺寸的東西可分,也許cv::Size(320,416),但具體大小取決於您的具體要求。只要注意斷言的內容即可!

+0

我剛剛做了,謝謝。我不得不刷新頁面。我會讓你知道結果。 –

+0

你是對的,先生。謝謝。我很感激。現在精美的作品。 –

+0

我很高興我可以幫助! – Aurelius

相關問題