2012-03-08 3 views
0

SVM, openCV, C++ 및 Visual Studio 2008 (mfc app)으로 간단한 OCR 응용 프로그램을 만들려고합니다.openCV의 SVM이 "메모리 위치에 cv :: 예외"를 던졌습니다.

내 훈련 샘플은 기계 인쇄 된 숫자 (0-9)의 이진 이미지입니다. 이 다중 클래스 문제에 대해 DAGSVM을 사용하고 싶습니다. 그래서 저는 45 개의 SVM을 생성해야합니다. 각 SVM은 2 클래스 (SVM (0,1), SVM (0,2) ... SVM (8,9))의 SVM입니다.

SVM의 파라미터 :

여기 가지가는 방법 클래스의 트레이닝 영상

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

데이터 나 매트릭스에 저장된다 trainData [I] (각 행은 28x28 화상의 화소이며, 이는 매트릭스가 784 cols를 가짐을 의미합니다). 각 SVM을 트레이닝 할 때 curTrainData & curTrainLabel이라는 2 행렬을 만듭니다.

for (int i = 0; i < 9; i++) 
    for (int j = i+1; j < 10; j++) 
    { 
     curTrainData.create(trainData[i].rows + trainData[j].rows, 784, CV_32FC1); 
     curTrainLabel.create(curTrainData.rows, 1, CV_32FC1); 

     // merge 2 matrix: trainData[i] & trainData[j] 
     for (int k = 0; k < trainData[i].rows; k++) 
     { 
      curTrainLabel.at<float>(k, 0) = 1.0; // class of digit i 
      for (int l = 0; l < 784; l++) 
       curTrainData.at<float>(k,l) = trainData[i].at<float>(k,l); 
     } 
     for (int k = 0; k < trainData[j].rows; k++) 
     { 
      curTrainLabel.at<float>(k + trainData[i].rows, 0) = -1.0; // class of digit j 
      for (int l = 0; l < 784; l++) 
      curTrainData.at<float>(k + trainData[i].rows,l) = trainData[j].at<float>(k,l); 
     } 

     svms[i][j].train(curTrainData, curTrainLabel, Mat(), Mat(), params); 
    } 

나는 전화 의 SVM [I] [J] .train ...에서 오류가 발생했습니다. 전체 오류는 다음과 같습니다

Unhandled exception at 0x75b5d36f in svm.exe: Microsoft C++ exception: cv::Exception at memory location 0x0022af8c.. 

SVM은 OpenCV의 구현 내가 완전히 이해하지 않는 진실을 말하자면 나는 이미지의 객체와 작업 그 중 예를 찾을 수 없습니다. 누군가가 잘못 :(

업데이트 09/03 (이다) 무슨 말해 줄 수 있다면

은 정말 감사 해요 :. 은 내가 잘못했다 오류가 온다에서 :

str.Format(_T("Results\trained_%d_%d.xml"), i, j); 
svms[i][j].save(CT2A(str)); 

STR은 CString을 변수입니다 그것은 내가로 변경하는 경우에도 남아

:.

svms[i][j].save("Results\trained.xml"); 

결과 및 기타 파일을 작성했습니다. 파일은 fopen(), imwrite() ... 메소드에 대한 파일입니다. 나는 왜 svm의이 save 방법에 관해서 폴더를 추가 할 수 없는지 모르겠다.

+0

단지 추측이지만, 이것은 메모리 문제처럼 보입니다.'svms'가 선언되고 크기는 무엇입니까? (루프 문 다음에 최소 9x10이어야합니다.) – Smash

+0

@Smash : 예, 10x10 배열을 사용합니다. 문제는 svm.save() 호출에서 발생합니다 (위의 업데이트와 같습니다). 모델을 저장할 수 있으면 매번 하나의 SVM 만 사용해야합니다. – Risa

+0

백 슬래시를 사용하는 경우 \ 대신 \\를 사용해야합니다 (또는 frontslash /를 사용할 수 있습니다). – Smash

답변

2

백 슬래시 "\"를 사용하는 경우 대신 "\\"을 입력해야합니다 (또는 앞뒤에 "/"를 사용할 수도 있습니다).

+0

고맙습니다. IDE의 경고를 무시하는 것은 바보입니다. – Risa