2013-02-20 63 views
0
OpenCV的FaceRecognizer错误的形状

我试图做一个FisherFaceRecognizer的预测()方法的工作,但我一直收到错误给定矩阵

错误的参数(错误的形状给定矩阵。当时大小(SRC) = (1,108000),size(W)=(36000,1)。)在subspaceProject中,文件 /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型,但不知何故仍然不相信矩阵是相同的大小和数据类型...

回答

0

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

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

而且 确保两个,培训IMG &测试IMG,在同一个色彩空间 如果没有,尝试

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

我发现我需要为培训和测试图像指定灰度,如下所示: – user2055867 2013-02-28 18:30:54

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的在线教程或其他文档中。