使用OpenCV的ANN中的Unfieldy CvMat*
Unwieldy CvMat* in ANN using OpenCV
我正在尝试使用OpenCV在C++中训练神经网络。
我无法在cv::Mat*(或Mat*,如果使用名称空间cv)和CvMat*之间转换,我希望能在这方面得到一些帮助。
让我详细说明一下:
我有两个cv::Mat*类型的数据结构。第一个是特征向量集,第二个是期望输出集。
cv::Mat *feat = new cv::Mat(3000, 100, CV_32F, featureData);
cv::Mat *op = new cv::Mat(3000, 2, CV_32F, expectedOutput);
(这是3000个数据点,特征向量长度=100,输出状态=2)
这两个矩阵已经填充了正确尺寸的数据,当样本数据打印在控制台上时,它们似乎工作得很好。
神经网络已初始化为:
int layers_array[] = {100,200,2}; //hidden layer nodes = 200
CvMat* layer = cvCreateMatHeader(1, 3, CV_32SC1);
cvInitMatHeader(layer, 1,3,CV_32SC1, layers_array);
CvANN_MLP nnetwork;
nnetwork.create(layer, CvANN_MLP::SIGMOID_SYM, SIGMOID_ALPHA, SIGMOID_BETA);
现在,人工神经网络的训练方法是以下模板:
virtual int train( const CvMat* inputs, const CvMat* outputs,
const CvMat* sampleWeights, const CvMat* sampleIdx=0,
CvANN_MLP_TrainParams params = CvANN_MLP_TrainParams(),
int flags=0 );
我尝试使用以下代码在cv::Mat*和CvMat*之间转换:
CvMat featMat,opMat;
(&featMat)->cols = feat->cols;
(&featMat)->rows = feat->rows;
(&featMat)->type = CV_32F;
(&featMat)->data.fl = (float *)feat->data;
(&opMat)->cols = op->cols;
(&opMat)->rows = op->rows;
(&opMat)->type = CV_32F;
(&opMat)->data.fl = (float *)op->data;
//setting up the ANN training parameters
int iterations = network.train(&featMat, &opMat, NULL, NULL, trainingParams);
当我运行此代码时,我在控制台中收到以下错误消息:
**OpenCV Error: Bad argument (input training data should be a floating-point matrix withthe number of rows equal to the number of training samples and the number
of columns equal to the size of 0-th (input) layer) in CvANN_MLP::prepare_to_train, file ....OpenCV-2.3.0-win-srcOpenCV-2.3.0modulesmlsrcann_mlp.cpp,
line 694**
我理解错误信息。然而,据我所知,我相信我没有把输入/输出层中的节点数量搞得一团糟。
你能帮我了解出了什么问题吗?
请尽量避免指向cv::Mat以及CvMat*的指针。
幸运的是,CvANN_MLP::train有一个重载,它将cv::Mat作为args,所以使用它:
cv::Mat feat = cv::Mat(3000, 100, CV_32F, featureData);
cv::Mat op = cv::Mat(3000, 2, CV_32F, expectedOutput);
int layers_array[] = {100,200,2}; //hidden layer nodes = 200
cv::Mat layers = cv::Mat (3, 1, CV_32SC1, layers_array );
CvANN_MLP nnetwork;
nnetwork.create(layers, CvANN_MLP::SIGMOID_SYM, SIGMOID_ALPHA, SIGMOID_BETA);
int iterations = nnetwork.train(feat, op, cv::Mat(), cv::Mat(), CvANN_MLP_TrainParams());
相关文章:
- CvMat:输入参数的大小不匹配
- IFTResult 到 cvMat 像素坐标
- IplImage vs CvMat
- from cvMat to QImage
- 如何释放CVMAT指针向量的记忆
- 如何计算和使用CVMAT平均值
- 将Qimage转换为cvMat 64FC3格式
- 如何在OpenCV 3.0中将Mat转换为cvMat
- 如何使用 CvMat 检索像素值
- 释放返回值/指向CvMat的指针的内存
- 元帅:用CvMat复制
- 将数据从 cv::Mat 复制到 CvMat,反之亦然
- 为什么当我尝试访问 CvMat 数据结构成员的第一个元素时,我会得到这个 ^@
- 为CvMat opencv分配一个双矩阵
- 使用OpenCV的ANN中的Unfieldy CvMat*
- 将IplImage*类型转换为CvMat
- 人脸检测OpenCV + Qt + cvMat
- OpenCV错误:cvGetSize中的错误参数(数组应该是CvMat或IplImage)
- 检索CV_32FC3 CvMat的元素
- OpenCV CvMat到Mat和指针