2011-05-26 59 views
1

我有以下功能。我想從Mat複製一些數據到 IplImage *類型並將其返回給主控制器。 這是愚蠢的,但我找不到一個正確的方法來做到這一點!作弊 表沒有說任何關於Mat->IplImage *轉換WITH數據 副本(因爲我需要它的功能)。Mat - > IplImage *數據複製轉換

任何想法或指針表示讚賞。 最佳 --Ali

int test(IplImage **srcImage, int num_images) 
{ 
    vector<Mat> images(num_images); 
    for (int i = 0; i < num_images; ++i) 
    { 
    images[i] = Mat(srcImage[i]); // I guess should be correct! 
     .... 
    // some manipulations on images[i] 
    } 

    // this should be wrong! 
    for (int i = 0; i < num_images; ++i) 
    { 
    cvReleaseImage(&srcImage[i]); 
    srcImage[i] = new IplImage(images[i]); 
    images[i].clear(); 
    } 
    return 0; 
} 

回答

2

短版:轉換到一個臨時IplImage,然後使用cvCopy

然而,有幾個問題與您的代碼:

int test(IplImage **srcImage, int num_images) 
{ 
    vector<Mat> images(num_images); 
    for (int i = 0; i < num_images; ++i) 
    { 
    images[i] = Mat(srcImage[i]); // I guess should be correct! 

迄今爲止,是的。

 .... 
    // some manipulations on images[i] 

如果操作是就地(不重新分配Mat S),您無需將數據複製回來,因爲Mat構造並沒有在第一時間複製數據。如果您重新分配,則...

} 

    // this should be wrong! 
    for (int i = 0; i < num_images; ++i) 
    { 
    cvReleaseImage(&srcImage[i]); 

這可能會有問題。 images[i]可能仍然使用相同的內存。

 srcImage[i] = new IplImage(images[i]); 

new IplImage對你沒有任何好處。它沒有有意義的構造函數,請使用cvCreateImage

 images[i].clear(); 

這並不是必需的,因爲無論如何這個向量超出了範圍。

} 
    return 0; 
} 

最後一個循環應該是這個樣子:

for (int i = 0; i < num_images; ++i) { 
    IplImage* old = srcImage[i]; // store pointer for later deallocation in case of shared data 
    IplImage src = images[i]; 
    srcImage[i] = cvCreateImage(...); // fill appropriate parameters here. If you didn't change size/type/etc, you might not need to create/deallocate(*) 
    cvCopy(&src, srcImage[i]); 
    cvReleaseImage(&old); // now it is safe to deallocate(*) 
} 
+0

非常感謝您! – Edi 2011-05-27 12:48:24

+0

@Ali:我剛剛注意到你可以用'srcImage [i] = cvCloneImage(&src);''替換'CreateImage'和'Copy'調用。 – etarion 2011-05-27 14:11:35