我正在尝试使用 CvMLData::get_responses但它没有给我回复。
我得到的行数与文档中所说的一样多,但我得到的不是响应,而是前 n 个值,其中 n 等于行数或样本数。
这是我的示例(第一列是响应):
1,0,9
1,5,4
2,7,7
1,5,5
2,9,9
这是我的代码
#include <cstdlib>
#include "opencv/cv.h"
#include "opencv/ml.h"
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
CvMLData cvml;
cvml.read_csv("examples.csv");
// Indicate the column that has the response
cvml.set_response_idx(0);
const CvMat* rs = cvml.get_responses();
cout << "Rows: " << rs->rows << " Cols: " << rs->cols << endl;
for(int i = 0; i < rs->rows; i++ ) {
cout << rs->data.fl[i] << "\n";
}
return EXIT_SUCCESS;
}
这是我得到的输出。
Rows: 5 Cols: 1
1
0
9
1
5
如您所见,我只获得了最初的 5 个值。我正在使用 OpenCV 2.3,这是我试图解决的一个更大问题的一部分。
这可能更像是一个错误而不是一个问题,但我仍然可能做错了什么或误解了什么。谢谢。
我建立了自己的答案。它更像是一种解决方法,但无论如何。这是工作。我正在使用 CVMLData::get_values() 方法并计算下一个第一列。
代码如下:
int main(int argc, char** argv) {
CvMLData cvml;
cvml.read_csv("examples.csv");
cvml.set_response_idx(0);
const CvMat* vs = cvml.get_values();
cout << "Rows: " << vs->rows << " Cols: " << vs->cols << endl;
for(int i = 0; i < vs->rows; i++ )
{
cout << vs->data.fl[i*vs->cols] << "\n";
}
return EXIT_SUCCESS;
}
结果:
请注意,我将 i * 与->cols 相乘,所以我只得到第一列。
Rows: 5 Cols: 3
1
1
2
1
2
只有响应位于第一列时,此代码才有效。如果不加列号,像这样
cout << vs->data.fl[i*vs->cols + YOUR_COLUMN_RESPONSE] << "\n";
我是一名优秀的程序员,十分优秀!