OpenCV FaceRecognizer给定矩阵的形状错误

时间:2013-02-20 00:49:19

标签: opencv

我正在尝试使FisherFaceRecognizer的predict()方法正常工作,但我一直收到错误

  

错误的参数(给定矩阵的形状错误。大小(src)=   (1,108000),size(W)=(36000,1)。)in subspaceProject,file   /tmp/opencv-DCb7/OpenCV-2.4.3/modules/contrib/src/lda.cpp,第187行

这类似于Wrong shapes for given matrices in OPENCV提出的问题 但就我而言,源图像和训练图像都是相同的数据类型,全彩色。

我的代码改编自http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html#fisherfaces

的教程

然而,我的测试图像比训练图像大,所以我需要处理正确尺寸的感兴趣区域(ROI)。

以下是我阅读图像和转换尺寸的方法。我克隆了ROI矩阵因为 早期的错误消息告诉我目标矩阵必须是连续的:

vector<Mat> images;
images.push_back( cvLoadImage( trainingList[i].c_str()));

IplImage* img;
img = cvLoadImage( imgName.c_str() );

// take ROI and clone into a new Mat
Mat testSample1(img, Rect( xLoc, yLoc, images[0].cols, images[0].rows));
Mat testSample = testSample1.clone();

// Create a FisherFaceRecognizer in OpenCV
Ptr<FaceRecognizer> FFR = createFisherFaceRecognizer(0,DBL_MAX);
model->train(images, labels);

cout << " check of data type testSample is " << testSample.type() << " images is " << images[0].type() << endl;

int predictedLabel = model->predict(testSample);
//

我在预测声明中收到一条异常消息。

cout语句告诉我两个矩阵都有16型,但不知何故它仍然不相信矩阵的大小和数据类型相同......

2 个答案:

答案 0 :(得分:0)

你应该确保形状,而不是类型 试试

cout << testSample.rows << testSample.cols << images[0].rows << images[0].cols ;

另外 确保两者,培训img&amp;测试img,是在相同的颜色空间 如果没有,请尝试

cvtColor(testSample, testSample_inSameSpaceOfTraining, CV_BGR2***); // default opencv colors "BGR"

答案 1 :(得分:0)

我发现FisherFaceRecognizer需要灰度图像,所以我应该像这样加载训练和测试图像:

 trainingImages.push_back( imread( trainingList[i].c_str(), CV_LOAD_IMAGE_GRAYSCALE));

  Mat img;    
  img = imread( imgName.c_str(), CV_LOAD_IMAGE_GRAYSCALE );

(还调整了img的类型以保持一致性)。 OpenCV参考手册(pdf在线提供)中记录了仅灰度级要求,但显然没有任何在线教程或FisherFaceRecognizer的其他文档。