2011-08-03 6 views
8

w moim programie Mam funkcję, która pobiera obraz z kamery i powinna spakować wszystkie dane w strukturze OpenCV Mat. Z kamery otrzymuję szerokość, wysokość i unsigned char* do bufora obrazu. Moje pytanie brzmi: jak utworzyć Mat z tych danych, jeśli mam globalną zmienną Mata. Typ struktury maty wziąłem CV_8UC1.opencv tworzenie macie z danych kamery

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); 
} 

Kiedy przetestować mój program, mam prawo width i height z image, ale width i height mojego globalnego Mat image_ jest 0. Jak mogę poprawnie umieścić dane w moim globalnym Mat?

Dziękuję.

Odpowiedz

14

Niestety, ani clone() ani copyTo() z powodzeniem nie kopiują wartości szerokości/wysokości do innej macie. Przynajmniej na OpenCV 2.3! To naprawdę wstyd.

Można jednak rozwiązać ten problem i uprościć kod, dzięki czemu funkcja zwróci wartość Mat. W ten sposób nie będziesz potrzebować zmiennej globalnej:

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

Witaj Karlphilip, Bardzo dziękuję za przyczynienie się do stackoverflow i pomoc w nas. Jestem nowy w OpenCV i uważam, że twoja odpowiedź jest bardzo przydatna w projekcie, nad którym teraz pracuję. Mam szybkie pytanie, jaka jest różnica między: cv :: Mat i cvMat i cvCreateMat()? – user261002

+3

'cv :: Mat' jest typem maty dla interfejsu C++ OpenCV. 'cvMat' jest dla interfejsu C. 'cvCreateMat()' tworzy 'cvMat' w interfejsie C. Nie przejmujmy się jeszcze tym wątkiem, jeśli masz pytania, możesz zadawać je w nowych wątkach. Na razie. – karlphillip