test.cpp

test program - Boris Mansencal, 2013-10-08 04:58 pm

Download (3.6 kB)

 
1
//g++ -Wall -Wextra `pkg-config --cflags --libs opencv` -o test test.cpp
2
3
#include <iostream>
4
#include <fstream>
5
6
#include <cassert>
7
8
9
#include <opencv2/core/core.hpp>
10
#include <opencv2/highgui/highgui.hpp>
11
#include <opencv2/ml/ml.hpp>
12
13
14
15
static
16
void
17
usage(char* argv0)
18
{
19
  std::cerr<<"Usage: "<<argv0<<" inputFilename inputModelFile"<<std::endl;
20
  std::cerr<<"inputFilename: input filename with data to classify & results obtained on linux\n";
21
  std::cerr<<"inputModelFile : input model file\n";
22
  std::cerr<<"\n";
23
}
24
25
static
26
void
27
processArgs(int argc, char *argv[],
28
            std::string &inputFilename,
29
            std::string &modelFilename)
30
{
31
  if (argc != 3) {
32
    usage(argv[0]);
33
    exit(EXIT_FAILURE);
34
  }
35
36
  inputFilename = argv[1];
37
  modelFilename = argv[2];
38
39
  if (inputFilename.empty()) {
40
    std::cerr << "Error: unspecified input filename\n";
41
    usage (argv[0]);
42
    exit (EXIT_FAILURE);
43
  }
44
  if (modelFilename.empty()) {
45
    std::cerr<<"Error: no model filename specified\n";
46
    usage(argv[0]);
47
    exit(EXIT_FAILURE);
48
  }
49
50
51
}
52
 
53
void
54
checkResults(const cv::Mat &res, 
55
             const cv::Mat &resMat, 
56
             const cv::Mat &data,
57
             const std::string &s)
58
{
59
  assert(res.cols == resMat.cols);
60
  assert(res.rows == resMat.rows);
61
  assert(res.type() == resMat.type());
62
  assert(resMat.isContinuous());
63
  assert(res.isContinuous());
64
  
65
  
66
  const float *r1 = res.ptr<float>(0);
67
  const float *r2 = resMat.ptr<float>(0);
68
69
  const float EPS = 0.000001;
70
71
  int nbWrongs = 0;
72
  for (int i=0; i<res.rows; ++i) {
73
74
    if (fabs(*r1 - *r2) > EPS) {
75
      if (nbWrongs < 6) {
76
        std::cerr<<"For data["<<i<<": ";
77
        const float *d = data.ptr<float>(i);
78
        for (int i=0; i<data.cols; ++i)  {
79
          std::cerr<<*d<<" ";
80
          ++d;
81
        }
82
        std::cerr<<"\n => classifier gives "<<*r1<<" instead of "<<*r2<<"\n";
83
      }
84
      ++nbWrongs;
85
    }
86
    ++r1;
87
    ++r2;
88
  }
89
  std::cerr<<s<<" ===> "<<nbWrongs<<"/"<<res.rows<<" errors\n";
90
}
91
92
void
93
test1(const cv::Mat &testData, 
94
      const CvSVM &svmClassifier, 
95
      const cv::Mat &resMat)
96
{
97
  assert(resMat.cols == 1);
98
  assert(resMat.type() == CV_32F);
99
100
  cv::Mat res(testData.rows, 1, CV_32F);
101
  assert(res.isContinuous());
102
  float *r = res.ptr<float>(0);
103
  for (int i=0; i<testData.rows; ++i) {
104
    *r = svmClassifier.predict(testData.row(i), true);
105
    ++r;
106
  }
107
108
  checkResults(res, resMat, testData, "test1");
109
}
110
111
void
112
test2(const cv::Mat &testData, 
113
      const CvSVM &svmClassifier, 
114
      const cv::Mat &resMat)
115
{
116
  assert(resMat.cols == 1);
117
  assert(resMat.type() == CV_32F);
118
119
  cv::Mat res(testData.rows, 1, CV_32F);
120
  svmClassifier.predict(testData, res);
121
122
  checkResults(res, resMat, testData, "test2");
123
}
124
125
int
126
main(int argc, char *argv[])
127
{
128
  std::string inputFilename, modelFilename;
129
  processArgs(argc, argv, inputFilename, modelFilename);
130
131
  cv::FileStorage fs2(inputFilename, cv::FileStorage::READ);
132
133
  cv::Mat dataMat, resMat, resCMat;
134
  fs2["data"] >> dataMat;
135
  fs2["results"] >> resMat;
136
  fs2["resultsC"] >> resCMat;
137
138
  if (dataMat.rows != resMat.rows) {
139
    std::cerr<<"ERROR: data & res do not have same number of rows ["<<dataMat.rows<<" vs "<<resMat.rows<<"] \n";
140
    exit(EXIT_FAILURE);
141
  }
142
  if (dataMat.rows != resCMat.rows) {
143
    std::cerr<<"ERROR: data & resC do not have same number of rows ["<<dataMat.rows<<" vs "<<resCMat.rows<<"] \n";
144
    exit(EXIT_FAILURE);
145
  }
146
  if (resMat.cols != 1) {
147
    std::cerr<<"ERROR: resMat.cols="<<resMat.cols<<" != 1\n";
148
    exit(EXIT_FAILURE);
149
  }
150
  if (resCMat.cols != 1) {
151
    std::cerr<<"ERROR: resCMat.cols="<<resCMat.cols<<" != 1\n";
152
    exit(EXIT_FAILURE);
153
  }
154
155
  CvSVM svmClassifier;
156
  svmClassifier.load(modelFilename.c_str());
157
158
  
159
  test1(dataMat, svmClassifier, resMat);
160
161
  test2(dataMat, svmClassifier, resCMat);
162
163
  return 0;
164
}