2011-08-03 111 views
8

在我的程序中我有從相機拍攝圖像的功能,應該將所有數據打包在OpenCV Mat結構中。從相機我得到寬度,高度和unsigned char*到圖像緩衝區。我的問題是我如何從這些數據創建Mat,如果我有全局Mat變量。 Mat結構的類型是CV_8UC1。opencv從相機數據創建墊

Mat image_; 

function takePhoto() { 
    unsigned int width = getWidthOfPhoto(); 
    unsinged int height = getHeightOfPhoto(); 
    unsinged char* dataBuffer = getBufferOfPhoto(); 
    Mat image(Size(width, height), CV_8UC1, dataBuffer, Mat::AUTO_STEP); 

    printf("width: %u\n", image.size().width); 
    printf("height: %u\n", image.size().height); 

    image_.create(Size(image.size().width, image.size().height), CV_8UC1); 
    image_ = image.clone(); 

    printf("width: %u\n", image_.size().width); 
    printf("height: %u\n", image_.size().height); 
} 

當我測試的程序,我馬上widthimageheight,但width和我的全球墊的heightimage_0。如何將數據正確放入我的全球Mat變量中?

謝謝。

回答

14

不幸的是,clone()copyTo()都不能成功地將width/height的值複製到另一個Mat。至少在OpenCV 2.3上!真是遺憾,真的。

但是,您可以通過使函數返回Mat來解決此問題並簡化您的代碼。這樣你就不需要有一個全局變量:

Mat takePhoto() 
{ 
    unsigned int width = getWidthOfPhoto(); 
    unsigned int height = getHeightOfPhoto(); 
    unsigned char* dataBuffer = getBufferOfPhoto(); 
    Mat image(Size(width, height), CV_8UC1, dataBuffer, Mat::AUTO_STEP); 
    return Mat; 
} 

int main() 
{ 
    Mat any_img = takePhoto(); 
    printf("width: %u\n", any_img.size().width); 
    printf("height: %u\n", any_img.size().height); 
} 
+0

嗨Karlphilip,非常感謝你爲stackoverflow和幫助我們。即時通訊新的OpenCV,並找到你的答案相當有用的項目,我現在正在工作。我有一個快速的問題,有什麼區別:cv :: Mat和cvMat和cvCreateMat()? – user261002

+3

'cv :: Mat'是OpenCV的C++接口的Mat類型。 'cvMat'用於C接口。 'cvCreateMat()'在C接口中創建一個'cvMat'。我們不要再劫持這個線程,如果你有問題,你可以自由地在新線程中提問。回頭見。 – karlphillip