2011-01-10 85 views
1

我使用OpenCV將圖像數組(IplImage **)傳遞給C++中的對象。那麼我想遍歷數組,並調整它們的大小都爲固定大小(150×150)使用OpenCV調整圖像數組的大小

我做這樣說:

for(int i = 0; i< this->numTrainingFaces; i++) 
{ 
    IplImage* frame_copy = cvCreateImage(cvSize(150,150), this->faceImageArray[0]->depth, this->faceImageArray[0]->nChannels); 
    cout << "Created image" << endl; 
    cvResize(this->faceImageArray[i], frame_copy); 
    cout << "Resized image" << endl; 
    IplImage* grey_image = cvCreateImage(cvSize(frame_copy->width, frame_copy->height), IPL_DEPTH_8U, 1); 
    cout << "Created grey image" << endl; 
    cvCvtColor(frame_copy, grey_image, CV_RGB2GRAY); 
    cout << "Converted image" << endl; 
    this->faceImageArray[i] = grey_image; 
    cvReleaseImage(&frame_copy); 
    cvReleaseImage(&grey_image); 
} 

但我得到這個輸出,和我'不知道爲什麼:

Created image 
Resized image 
Created grey image 
Converted image 
Created image 
OpenCV Error: Assertion failed (src.type() == dst.type()) in cvResize, file /build/buildd/opencv-2.1.0/src/cv/cvimgwarp.cpp, line 3102 
terminate called after throwing an instance of 'cv::Exception' 
    what(): /build/buildd/opencv-2.1.0/src/cv/cvimgwarp.cpp:3102: error: (-215) src.type() == dst.type() in function cvResize 

Aborted 

我基本上只是試圖在儘可能少的步驟中用調整大小的數組替換圖像。

編輯:

修我的代碼如下:

for(int i = 0; i< this->numTrainingFaces; i++) 
{ 

    IplImage* frame_copy = cvCreateImage(cvSize(150,150), this->faceImageArray[i]->depth, this->faceImageArray[i]->nChannels); 
    cvResize(this->faceImageArray[i], frame_copy); 
    IplImage* grey_image = cvCreateImage(cvSize(frame_copy->width, frame_copy->height), IPL_DEPTH_8U, 1); 
    cvCvtColor(frame_copy, grey_image, CV_RGB2GRAY); 
    faceImageArray[i] = cvCreateImage(cvSize(grey_image->width, grey_image->height), grey_image->depth, grey_image->nChannels); 
    cvCopy(grey_image,faceImageArray[i]); 

    cvReleaseImage(&frame_copy); 
    cvReleaseImage(&grey_image); 
} 

然後後來我在執行某些PCA,並得到此輸出:

OpenCV Error: Null pointer (Null pointer to the written object) in cvWrite, file /build/buildd/opencv-2.1.0/src/cxcore/cxpersistence.cpp, line 4740 

但我不認爲我的代碼已經到了我明確調用cvWrite的地步,所以它必須是庫的一部分。如果有必要,我可以給出一個完整的實現 - 我的代碼中是否有任何內容會創建一個空指針?

我的完整源代碼在這裏:http://pastie.org/1447022 - 創建一個類,設置變量,然後調用learn()。

回答

3
  • 爲什麼在使用C++時使用C接口? C++接口非常友好,你不會有這個問題。
  • 您的錯誤很簡單 - 您的圖片類型不同,因此您無法將第一張圖片中的圖片用於所有圖片。

IplImage* frame_copy = cvCreateImage(cvSize(150,150), this->faceImageArray[0]->depth, this->faceImageArray[0]->nChannels); 

應該是

IplImage* frame_copy = cvCreateImage(cvSize(150,150), this->faceImageArray[i]->depth, this->faceImageArray[i]->nChannels); 

此外,this->通常是一個無操作。 faceImageArray[0]->depth, faceImageArray[0]->nChannels應該就夠了。

+0

啊,我不知道我錯過了這個 - 謝謝。現在,我收到有關OpenCV錯誤的錯誤:cvCalcEigenObjects中的函數(不支持的格式)不支持輸入圖像深度。 – amr 2011-01-11 00:33:43