2014-08-28 251 views
0

我試圖訓練SVM並在OpenCV的HOGDescrpitor中使用它。HOGDescriptor OpenCV dsize.area()聲明失敗

的XML文件被成功地生成和HOGDescriptor加載,但是當我試圖發現一些對象,則發生斷言:

OpenCV Error: Assertion failed (dsize.area() || (inv_scale_x > 0 && inv_scale_y > 0)) in resize, file /build/buildd/opencv-2.4.8+dfsg1/modules/imgproc/src/imgwarp.cpp, line 1825 terminate called after throwing an instance of 'tbb::captured_exception' what(): /build/buildd/opencv-2.4.8+dfsg1/modules/imgproc/src/imgwarp.cpp:1825: error: (-215) dsize.area() || (inv_scale_x > 0 && inv_scale_y > 0) in function resize

爲了實現SVM教練我使用提示從using OpenCV and SVM with images

生成的XML文件大約有144K字節。對於陽性和陰性樣品我用尺寸64x128的圖像(2000陽性和2000爲負)

參數用於SVM訓練者:

CvSVMParams svmParams; 
svmParams.svm_type = CvSVM::C_SVC; 
svmParams.kernel_type = CvSVM::LINEAR; 
svmParams.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 10000, 1e-6); 

代碼檢測:

int main() 
{ 
    HOGDescriptor hog(); 
    if(!hog.load("/home/bin/hogdescriptor.xml")) 
    { 
     std::cout << "Failed to load file!" << std::endl; 
     return -1; 
    } 

    VideoCapture cap(0); 
    if(!cap.isOpened()) 
    { 
     std::cout << "Error opening camera!" << std::endl; 
     return 1; 
    } 

    Mat testImage; 

    while ((cvWaitKey(30) & 255) != 27) 
    { 
     cap >> testImage; 
     detectTest(hog, testImage); 
     imshow("HOG custom detection", testImage); 
    } 

    return EXIT_SUCCESS; 
} 

void showDetections(const vector<Rect>& found, Mat& imageData) { 
    for (const Rect& rect : found) 
    { 
     Point rectPoint1; 
    rectPoint1.x = rect.x; 
     rectPoint1.y = rect.y; 

     Point rectPoint2; 
     rectPoint2.x = rect.x + rect.width; 
     rectPoint2.y = rect.y + rect.height; 

     std::cout << "detection x: " << rect.x << ", y: " << rect.y << std::endl; 

     rectangle(imageData, rectPoint1, rectPoint2, Scalar(0, 255, 0)); 
    } 
} 

void detectTest(const HOGDescriptor& hog, Mat& imageData) 
{ 
    std::cout << "Trying to detect" << std::endl; 

    vector<Rect> found; 
    int groupThreshold = 2; 
    Size padding(Size(32, 32)); 
    Size winStride(Size(8, 8)); 
    double hitThreshold = 0.; // tolerance 
    hog.detectMultiScale(imageData, found, hitThreshold, winStride, padding, 1.05, groupThreshold); 
// hog.detectMultiScale(imageData, found); 

    std::cout << "Trying to show detections" << std::endl; 
    showDetections(found, imageData); 
} 

XML:

<?xml version="1.0"?> 
<opencv_storage> 
<my_svm type_id="opencv-ml-svm"> 
    <svm_type>C_SVC</svm_type> 
    <kernel><type>LINEAR</type></kernel> 
    <C>1.</C> 
    <term_criteria><epsilon>2.2204460492503131e-16</epsilon> 
    <iterations>10000</iterations></term_criteria> 
    <var_all>8192</var_all> 
    <var_count>8192</var_count> 
    <class_count>2</class_count> 
    <class_labels type_id="opencv-matrix"> 
    <rows>1</rows> 
    <cols>2</cols> 
    <dt>i</dt> 
    <data> 
     -1 1</data></class_labels> 
    <sv_total>1</sv_total> 
    <support_vectors> 
    <_> 
     -9.25376153e-05 -9.25376153e-05 -9.25376153e-05 -9.25376153e-05 ...and many, many...</_></support_vectors> 
    <decision_functions> 
    <_> 
     <sv_count>1</sv_count> 
     <rho>-1.</rho> 
     <alpha> 
     1.</alpha> 
     <index> 
     0</index></_></decision_functions></my_svm> 
</opencv_storage> 

有人可以解釋我這個斷言,或者可以提供一些soluti對這個問題?我花了近3天的時間來解決這個問題,但沒有取得任何成功......提前致謝!

回答

-1

這是更接近我得到了什麼?還在試圖利用這個XML

private static void buscar_hog_svm() { 

    if (clasificador == null) { 
     clasificador = new CvSVM(); 
     clasificador.load(path_vectores); 
    } 

    Mat img_gray = new Mat(); 
    //gray 
    Imgproc.cvtColor(imag, img_gray, Imgproc.COLOR_BGR2GRAY); 

    //Extract HogFeature 
    hog = new HOGDescriptor(
      _winSize //new Size(32, 16) 
      , _blockSize, _blockStride, _cellSize, _nbins); 
    MatOfFloat descriptorsValues = new MatOfFloat(); 
    MatOfPoint locations = new MatOfPoint(); 
    hog.compute(img_gray, 
      descriptorsValues, 
      _winSize, 
      _padding, locations); 


    Mat fm = descriptorsValues; 

    System.out.println("tamano fm: " + fm.size()); 
    //Classification whether data is positive or negative 
    float result = clasificador.predict(fm); 
    System.out.println("resultado= " + result); 
} 

如果你有更多的線索,請分享